tldraw 3.16.0-canary.2d1a57ea21b2 → 3.16.0-canary.2e83e38fb91b

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 (102) hide show
  1. package/dist-cjs/index.d.ts +3 -3
  2. package/dist-cjs/index.js +1 -1
  3. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js +4 -4
  4. package/dist-cjs/lib/shapes/bookmark/BookmarkShapeUtil.js.map +2 -2
  5. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +2 -1
  6. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  7. package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js +2 -2
  8. package/dist-cjs/lib/shapes/frame/components/FrameLabelInput.js.map +2 -2
  9. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +1 -0
  10. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  11. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +2 -1
  12. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  13. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js +4 -4
  14. package/dist-cjs/lib/shapes/shared/HyperlinkButton.js.map +2 -2
  15. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js +3 -2
  16. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
  17. package/dist-cjs/lib/shapes/text/PlainTextArea.js +2 -2
  18. package/dist-cjs/lib/shapes/text/PlainTextArea.js.map +2 -2
  19. package/dist-cjs/lib/shapes/text/RichTextArea.js +3 -3
  20. package/dist-cjs/lib/shapes/text/RichTextArea.js.map +2 -2
  21. package/dist-cjs/lib/ui/components/A11y.js +1 -1
  22. package/dist-cjs/lib/ui/components/A11y.js.map +2 -2
  23. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +1 -1
  24. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
  25. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +1 -1
  26. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +1 -1
  27. package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js +2 -2
  28. package/dist-cjs/lib/ui/components/primitives/TldrawUiInput.js.map +2 -2
  29. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +1 -1
  30. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  31. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +26 -1
  32. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  33. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +5 -5
  34. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +1 -1
  35. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js +1 -1
  36. package/dist-cjs/lib/ui/hooks/useClipboardEvents.js.map +2 -2
  37. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +2 -2
  38. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +1 -1
  39. package/dist-cjs/lib/ui/version.js +3 -3
  40. package/dist-cjs/lib/ui/version.js.map +1 -1
  41. package/dist-esm/index.d.mts +3 -3
  42. package/dist-esm/index.mjs +1 -1
  43. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs +5 -5
  44. package/dist-esm/lib/shapes/bookmark/BookmarkShapeUtil.mjs.map +2 -2
  45. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +2 -1
  46. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  47. package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs +3 -3
  48. package/dist-esm/lib/shapes/frame/components/FrameLabelInput.mjs.map +2 -2
  49. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +1 -0
  50. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  51. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +2 -1
  52. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  53. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs +5 -5
  54. package/dist-esm/lib/shapes/shared/HyperlinkButton.mjs.map +2 -2
  55. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs +4 -3
  56. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
  57. package/dist-esm/lib/shapes/text/PlainTextArea.mjs +3 -3
  58. package/dist-esm/lib/shapes/text/PlainTextArea.mjs.map +2 -2
  59. package/dist-esm/lib/shapes/text/RichTextArea.mjs +3 -4
  60. package/dist-esm/lib/shapes/text/RichTextArea.mjs.map +2 -2
  61. package/dist-esm/lib/ui/components/A11y.mjs +2 -2
  62. package/dist-esm/lib/ui/components/A11y.mjs.map +2 -2
  63. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +2 -2
  64. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
  65. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +2 -2
  66. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +1 -1
  67. package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs +3 -3
  68. package/dist-esm/lib/ui/components/primitives/TldrawUiInput.mjs.map +2 -2
  69. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +1 -1
  70. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  71. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +27 -1
  72. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  73. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +5 -5
  74. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +1 -1
  75. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs +2 -2
  76. package/dist-esm/lib/ui/hooks/useClipboardEvents.mjs.map +2 -2
  77. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +2 -2
  78. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +1 -1
  79. package/dist-esm/lib/ui/version.mjs +3 -3
  80. package/dist-esm/lib/ui/version.mjs.map +1 -1
  81. package/package.json +3 -3
  82. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +2 -2
  83. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +41 -0
  84. package/src/lib/shapes/bookmark/BookmarkShapeUtil.tsx +5 -5
  85. package/src/lib/shapes/frame/FrameShapeUtil.tsx +1 -0
  86. package/src/lib/shapes/frame/components/FrameLabelInput.tsx +3 -3
  87. package/src/lib/shapes/geo/GeoShapeUtil.tsx +1 -0
  88. package/src/lib/shapes/note/NoteShapeUtil.tsx +1 -0
  89. package/src/lib/shapes/shared/HyperlinkButton.tsx +5 -5
  90. package/src/lib/shapes/shared/useEditablePlainText.ts +5 -3
  91. package/src/lib/shapes/text/PlainTextArea.tsx +3 -3
  92. package/src/lib/shapes/text/RichTextArea.tsx +3 -4
  93. package/src/lib/ui/components/A11y.tsx +2 -2
  94. package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +2 -2
  95. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +2 -2
  96. package/src/lib/ui/components/primitives/TldrawUiInput.tsx +3 -3
  97. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +2 -2
  98. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +41 -11
  99. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +6 -6
  100. package/src/lib/ui/hooks/useClipboardEvents.ts +2 -2
  101. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +2 -2
  102. package/src/lib/ui/version.ts +3 -3
@@ -6,6 +6,7 @@ import React, {
6
6
  ReactNode,
7
7
  useContext,
8
8
  useEffect,
9
+ useLayoutEffect,
9
10
  useRef,
10
11
  useState,
11
12
  } from 'react'
@@ -24,18 +25,20 @@ export interface TldrawUiTooltipProps {
24
25
  delayDuration?: number
25
26
  }
26
27
 
28
+ interface CurrentTooltip {
29
+ id: string
30
+ content: ReactNode
31
+ side: 'top' | 'right' | 'bottom' | 'left'
32
+ sideOffset: number
33
+ showOnMobile: boolean
34
+ targetElement: HTMLElement
35
+ delayDuration: number
36
+ }
37
+
27
38
  // Singleton tooltip manager
28
39
  class TooltipManager {
29
40
  private static instance: TooltipManager | null = null
30
- private currentTooltip = atom<{
31
- id: string
32
- content: ReactNode
33
- side: 'top' | 'right' | 'bottom' | 'left'
34
- sideOffset: number
35
- showOnMobile: boolean
36
- targetElement: HTMLElement
37
- delayDuration: number
38
- } | null>('current tooltip', null)
41
+ private currentTooltip = atom<CurrentTooltip | null>('current tooltip', null)
39
42
  private destroyTimeoutId: number | null = null
40
43
 
41
44
  static getInstance(): TooltipManager {
@@ -72,6 +75,15 @@ class TooltipManager {
72
75
  })
73
76
  }
74
77
 
78
+ updateCurrentTooltip(tooltipId: string, update: (tooltip: CurrentTooltip) => CurrentTooltip) {
79
+ this.currentTooltip.update((tooltip) => {
80
+ if (tooltip?.id === tooltipId) {
81
+ return update(tooltip)
82
+ }
83
+ return tooltip
84
+ })
85
+ }
86
+
75
87
  hideTooltip(editor: Editor | null, tooltipId: string, instant: boolean = false) {
76
88
  const hide = () => {
77
89
  // Only hide if this is the current tooltip
@@ -241,6 +253,7 @@ export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProp
241
253
  const editor = useMaybeEditor()
242
254
  const tooltipId = useRef<string>(uniqueId())
243
255
  const hasProvider = useContext(TooltipSingletonContext)
256
+ const showUiLabels = useValue('showUiLabels', () => editor?.user.getShowUiLabels(), [editor])
244
257
 
245
258
  const orientationCtx = useTldrawUiOrientation()
246
259
  const sideToUse = side ?? orientationCtx.tooltipSide
@@ -254,13 +267,30 @@ export const TldrawUiTooltip = forwardRef<HTMLButtonElement, TldrawUiTooltipProp
254
267
  }
255
268
  }, [editor, hasProvider])
256
269
 
270
+ useLayoutEffect(() => {
271
+ if (hasProvider && tooltipManager.getCurrentTooltipData()?.id === tooltipId.current) {
272
+ tooltipManager.updateCurrentTooltip(tooltipId.current, (tooltip) => ({
273
+ ...tooltip,
274
+ content,
275
+ side: sideToUse,
276
+ sideOffset,
277
+ showOnMobile,
278
+ }))
279
+ }
280
+ }, [content, sideToUse, sideOffset, showOnMobile, hasProvider])
281
+
257
282
  // Don't show tooltip if disabled, no content, or UI labels are disabled
258
283
  if (disabled || !content) {
259
284
  return <>{children}</>
260
285
  }
261
286
 
262
- const delayDurationToUse =
263
- delayDuration ?? (editor?.options.tooltipDelayMs || DEFAULT_TOOLTIP_DELAY_MS)
287
+ let delayDurationToUse
288
+ if (showUiLabels) {
289
+ delayDurationToUse = 0
290
+ } else {
291
+ delayDurationToUse =
292
+ delayDuration ?? (editor?.options.tooltipDelayMs || DEFAULT_TOOLTIP_DELAY_MS)
293
+ }
264
294
 
265
295
  // Fallback to old behavior if no provider
266
296
  if (!hasProvider) {
@@ -213,7 +213,7 @@ export function TldrawUiMenuItem<
213
213
  icon={icon}
214
214
  onSelect={onSelect}
215
215
  onDragStart={onDragStart}
216
- labelToUse={labelToUse}
216
+ labelStr={labelStr}
217
217
  titleStr={titleStr}
218
218
  disabled={disabled}
219
219
  isSelected={isSelected}
@@ -247,7 +247,7 @@ export function TldrawUiMenuItem<
247
247
  icon={icon}
248
248
  onSelect={onSelect}
249
249
  onDragStart={onDragStart}
250
- labelToUse={labelToUse}
250
+ labelStr={labelStr}
251
251
  titleStr={titleStr}
252
252
  disabled={disabled}
253
253
  isSelected={isSelected}
@@ -392,7 +392,7 @@ function useDraggableEvents(
392
392
 
393
393
  function DraggableToolbarButton({
394
394
  id,
395
- labelToUse,
395
+ labelStr,
396
396
  titleStr,
397
397
  disabled,
398
398
  isSelected,
@@ -403,7 +403,7 @@ function DraggableToolbarButton({
403
403
  }: {
404
404
  id: string
405
405
  disabled: boolean
406
- labelToUse?: string
406
+ labelStr?: string
407
407
  titleStr?: string
408
408
  isSelected?: boolean
409
409
  icon: TLUiMenuItemProps['icon']
@@ -416,7 +416,7 @@ function DraggableToolbarButton({
416
416
  if (overflow) {
417
417
  return (
418
418
  <TldrawUiToolbarButton
419
- aria-label={labelToUse}
419
+ aria-label={labelStr}
420
420
  aria-pressed={isSelected ? 'true' : 'false'}
421
421
  isActive={isSelected}
422
422
  className="tlui-button-grid__button"
@@ -434,7 +434,7 @@ function DraggableToolbarButton({
434
434
 
435
435
  return (
436
436
  <TldrawUiToolbarButton
437
- aria-label={labelToUse}
437
+ aria-label={labelStr}
438
438
  aria-pressed={isSelected ? 'true' : 'false'}
439
439
  data-testid={`tools.${id}`}
440
440
  data-value={id}
@@ -7,8 +7,8 @@ import {
7
7
  assert,
8
8
  compact,
9
9
  isDefined,
10
+ markEventAsHandled,
10
11
  preventDefault,
11
- stopEventPropagation,
12
12
  uniq,
13
13
  useEditor,
14
14
  useMaybeEditor,
@@ -763,7 +763,7 @@ export function useNativeClipboardEvents() {
763
763
 
764
764
  const paste = (e: ClipboardEvent) => {
765
765
  if (disablingMiddleClickPaste) {
766
- stopEventPropagation(e)
766
+ markEventAsHandled(e)
767
767
  return
768
768
  }
769
769
 
@@ -92,9 +92,9 @@ export const DEFAULT_TRANSLATION = {
92
92
  'action.toggle-wrap-mode': 'Toggle Select on wrap',
93
93
  'action.toggle-reduce-motion.menu': 'Reduce motion',
94
94
  'action.toggle-reduce-motion': 'Toggle reduce motion',
95
- 'action.toggle-keyboard-shortcuts.menu': 'Keyboard shortcuts',
95
+ 'action.toggle-keyboard-shortcuts.menu': 'Enable keyboard shortcuts',
96
96
  'action.toggle-keyboard-shortcuts': 'Toggle keyboard shortcuts',
97
- 'action.toggle-ui-labels.menu': 'UI labels',
97
+ 'action.toggle-ui-labels.menu': 'Enable UI labels',
98
98
  'action.toggle-ui-labels': 'Toggle UI labels',
99
99
  'action.toggle-edge-scrolling.menu': 'Edge scrolling',
100
100
  'action.toggle-edge-scrolling': 'Toggle edge scrolling',
@@ -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 = '3.16.0-canary.2d1a57ea21b2'
4
+ export const version = '3.16.0-canary.2e83e38fb91b'
5
5
  export const publishDates = {
6
6
  major: '2024-09-13T14:36:29.063Z',
7
- minor: '2025-09-09T17:07:40.764Z',
8
- patch: '2025-09-09T17:07:40.764Z',
7
+ minor: '2025-09-15T17:14:42.089Z',
8
+ patch: '2025-09-15T17:14:42.089Z',
9
9
  }