tldraw 3.16.0-canary.ed8bd30c0f28 → 3.16.0-canary.efdec30fc411

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 (170) hide show
  1. package/dist-cjs/index.d.ts +89 -4
  2. package/dist-cjs/index.js +11 -1
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js +1 -1
  5. package/dist-cjs/lib/shapes/arrow/arrowTargetState.js.map +2 -2
  6. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js +10 -1
  7. package/dist-cjs/lib/shapes/shared/usePrefersReducedMotion.js.map +2 -2
  8. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  9. package/dist-cjs/lib/ui/components/AccessibilityMenu.js +35 -0
  10. package/dist-cjs/lib/ui/components/AccessibilityMenu.js.map +7 -0
  11. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +2 -1
  12. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
  13. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js +3 -2
  14. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js.map +2 -2
  15. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js +3 -3
  16. package/dist-cjs/lib/ui/components/MainMenu/DefaultMainMenuContent.js.map +2 -2
  17. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js +1 -1
  18. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js.map +2 -2
  19. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +2 -1
  20. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
  21. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js +3 -2
  22. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js.map +2 -2
  23. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js +2 -2
  24. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js.map +2 -2
  25. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +2 -0
  26. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
  27. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +171 -140
  28. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  29. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js +3 -3
  30. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +2 -2
  31. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js +26 -25
  32. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +3 -3
  33. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +6 -5
  34. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +2 -2
  35. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +9 -10
  36. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +2 -2
  37. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +5 -4
  38. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +2 -2
  39. package/dist-cjs/lib/ui/components/menu-items.js +6 -0
  40. package/dist-cjs/lib/ui/components/menu-items.js.map +2 -2
  41. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js +4 -15
  42. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +3 -3
  43. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +1 -1
  44. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  45. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +3 -2
  46. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js.map +3 -3
  47. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +18 -7
  48. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  49. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +284 -0
  50. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +7 -0
  51. package/dist-cjs/lib/ui/components/primitives/layout.js +51 -0
  52. package/dist-cjs/lib/ui/components/primitives/layout.js.map +7 -0
  53. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +152 -2
  54. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  55. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js +3 -2
  56. package/dist-cjs/lib/ui/context/TldrawUiContextProvider.js.map +2 -2
  57. package/dist-cjs/lib/ui/context/actions.js +15 -0
  58. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  59. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  60. package/dist-cjs/lib/ui/hooks/useTools.js +76 -9
  61. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  62. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  63. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +3 -0
  64. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  65. package/dist-cjs/lib/ui/version.js +3 -3
  66. package/dist-cjs/lib/ui/version.js.map +1 -1
  67. package/dist-esm/index.d.mts +89 -4
  68. package/dist-esm/index.mjs +19 -1
  69. package/dist-esm/index.mjs.map +2 -2
  70. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs +1 -1
  71. package/dist-esm/lib/shapes/arrow/arrowTargetState.mjs.map +2 -2
  72. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs +10 -1
  73. package/dist-esm/lib/shapes/shared/usePrefersReducedMotion.mjs.map +2 -2
  74. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  75. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs +19 -0
  76. package/dist-esm/lib/ui/components/AccessibilityMenu.mjs.map +7 -0
  77. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +2 -1
  78. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
  79. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs +3 -2
  80. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs.map +2 -2
  81. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs +3 -5
  82. package/dist-esm/lib/ui/components/MainMenu/DefaultMainMenuContent.mjs.map +2 -2
  83. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs +1 -1
  84. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs.map +2 -2
  85. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +2 -1
  86. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
  87. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs +3 -2
  88. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs.map +2 -2
  89. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs +2 -2
  90. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs.map +2 -2
  91. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +3 -1
  92. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
  93. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +171 -140
  94. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  95. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs +3 -3
  96. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +2 -2
  97. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs +26 -25
  98. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +2 -2
  99. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +6 -5
  100. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
  101. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +9 -10
  102. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +2 -2
  103. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +5 -4
  104. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +2 -2
  105. package/dist-esm/lib/ui/components/menu-items.mjs +6 -0
  106. package/dist-esm/lib/ui/components/menu-items.mjs.map +2 -2
  107. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +4 -5
  108. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +2 -2
  109. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +1 -1
  110. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  111. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs +3 -2
  112. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs.map +2 -2
  113. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +18 -7
  114. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  115. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +254 -0
  116. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +7 -0
  117. package/dist-esm/lib/ui/components/primitives/layout.mjs +21 -0
  118. package/dist-esm/lib/ui/components/primitives/layout.mjs.map +7 -0
  119. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +160 -4
  120. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  121. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs +3 -2
  122. package/dist-esm/lib/ui/context/TldrawUiContextProvider.mjs.map +2 -2
  123. package/dist-esm/lib/ui/context/actions.mjs +15 -0
  124. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  125. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  126. package/dist-esm/lib/ui/hooks/useTools.mjs +83 -10
  127. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  128. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +3 -0
  129. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  130. package/dist-esm/lib/ui/version.mjs +3 -3
  131. package/dist-esm/lib/ui/version.mjs.map +1 -1
  132. package/package.json +3 -3
  133. package/src/index.ts +15 -0
  134. package/src/lib/shapes/arrow/arrowTargetState.ts +2 -1
  135. package/src/lib/shapes/shared/usePrefersReducedMotion.tsx +11 -1
  136. package/src/lib/tools/SelectTool/childStates/Translating.ts +0 -1
  137. package/src/lib/ui/components/AccessibilityMenu.tsx +20 -0
  138. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +2 -1
  139. package/src/lib/ui/components/DefaultMenuPanel.tsx +4 -3
  140. package/src/lib/ui/components/MainMenu/DefaultMainMenuContent.tsx +4 -4
  141. package/src/lib/ui/components/NavigationPanel/DefaultNavigationPanel.tsx +1 -1
  142. package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +3 -2
  143. package/src/lib/ui/components/SharePanel/PeopleMenuItem.tsx +4 -3
  144. package/src/lib/ui/components/SharePanel/UserPresenceColorPicker.tsx +3 -3
  145. package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +3 -1
  146. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +146 -107
  147. package/src/lib/ui/components/StylePanel/DoubleDropdownPicker.tsx +3 -3
  148. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +7 -6
  149. package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +7 -6
  150. package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +10 -11
  151. package/src/lib/ui/components/Toolbar/ToggleToolLockedButton.tsx +14 -11
  152. package/src/lib/ui/components/menu-items.tsx +8 -0
  153. package/src/lib/ui/components/primitives/TldrawUiButtonPicker.tsx +38 -36
  154. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +1 -1
  155. package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +4 -2
  156. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +34 -12
  157. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +332 -0
  158. package/src/lib/ui/components/primitives/layout.tsx +33 -0
  159. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +218 -3
  160. package/src/lib/ui/context/TldrawUiContextProvider.tsx +23 -20
  161. package/src/lib/ui/context/actions.tsx +15 -0
  162. package/src/lib/ui/context/events.tsx +2 -0
  163. package/src/lib/ui/hooks/useTools.tsx +118 -10
  164. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +3 -0
  165. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +3 -0
  166. package/src/lib/ui/version.ts +3 -3
  167. package/src/lib/ui.css +80 -69
  168. package/src/test/arrows-megabus.test.tsx +12 -6
  169. package/src/test/inner-outer-margin.test.ts +315 -0
  170. package/tldraw.css +82 -69
@@ -5,6 +5,7 @@ import { useBreakpoint } from '../context/breakpoints'
5
5
  import { useTldrawUiComponents } from '../context/components'
6
6
  import { useTranslation } from '../hooks/useTranslation/useTranslation'
7
7
  import { TldrawUiToolbar } from './primitives/TldrawUiToolbar'
8
+ import { TldrawUiRow } from './primitives/layout'
8
9
 
9
10
  /** @public @react */
10
11
  export const DefaultMenuPanel = memo(function MenuPanel() {
@@ -32,16 +33,16 @@ export const DefaultMenuPanel = memo(function MenuPanel() {
32
33
 
33
34
  return (
34
35
  <nav ref={ref} className="tlui-menu-zone">
35
- <div className="tlui-buttons__horizontal">
36
+ <TldrawUiRow>
36
37
  {MainMenu && <MainMenu />}
37
38
  {PageMenu && !isSinglePageMode && <PageMenu />}
38
39
  {showQuickActions ? (
39
- <TldrawUiToolbar className="tlui-buttons__horizontal" label={msg('actions-menu.title')}>
40
+ <TldrawUiToolbar orientation="horizontal" label={msg('actions-menu.title')}>
40
41
  {QuickActions && <QuickActions />}
41
42
  {ActionsMenu && <ActionsMenu />}
42
43
  </TldrawUiToolbar>
43
44
  ) : null}
44
- </div>
45
+ </TldrawUiRow>
45
46
  </nav>
46
47
  )
47
48
  })
@@ -1,4 +1,5 @@
1
1
  import { useCanRedo, useCanUndo } from '../../hooks/menu-hooks'
2
+ import { AccessibilityMenu } from '../AccessibilityMenu'
2
3
  import { ColorSchemeMenu } from '../ColorSchemeMenu'
3
4
  import { KeyboardShortcutsMenuItem } from '../HelpMenu/DefaultHelpMenuContent'
4
5
  import { LanguageMenu } from '../LanguageMenu'
@@ -19,10 +20,8 @@ import {
19
20
  ToggleEdgeScrollingItem,
20
21
  ToggleFocusModeItem,
21
22
  ToggleGridItem,
22
- ToggleKeyboardShortcutsItem,
23
23
  ToggleLockMenuItem,
24
24
  TogglePasteAtCursorItem,
25
- ToggleReduceMotionItem,
26
25
  ToggleSnapModeItem,
27
26
  ToggleToolLockItem,
28
27
  ToggleTransparentBgMenuItem,
@@ -161,8 +160,6 @@ export function PreferencesGroup() {
161
160
  <ToggleWrapModeItem />
162
161
  <ToggleFocusModeItem />
163
162
  <ToggleEdgeScrollingItem />
164
- <ToggleReduceMotionItem />
165
- <ToggleKeyboardShortcutsItem />
166
163
  <ToggleDynamicSizeModeItem />
167
164
  <TogglePasteAtCursorItem />
168
165
  <ToggleDebugModeItem />
@@ -170,6 +167,9 @@ export function PreferencesGroup() {
170
167
  <TldrawUiMenuGroup id="color-scheme">
171
168
  <ColorSchemeMenu />
172
169
  </TldrawUiMenuGroup>
170
+ <TldrawUiMenuGroup id="accessibility-menu">
171
+ <AccessibilityMenu />
172
+ </TldrawUiMenuGroup>
173
173
  </TldrawUiMenuSubmenu>
174
174
  <LanguageMenu />
175
175
  <KeyboardShortcutsMenuItem />
@@ -33,7 +33,7 @@ export const DefaultNavigationPanel = memo(function DefaultNavigationPanel() {
33
33
 
34
34
  return (
35
35
  <div ref={ref} className="tlui-navigation-panel">
36
- <TldrawUiToolbar className="tlui-buttons__horizontal" label={msg('navigation-zone.title')}>
36
+ <TldrawUiToolbar orientation="horizontal" label={msg('navigation-zone.title')}>
37
37
  {ZoomMenu && breakpoint < PORTRAIT_BREAKPOINT.TABLET ? (
38
38
  <ZoomMenu />
39
39
  ) : (
@@ -24,6 +24,7 @@ import {
24
24
  TldrawUiPopoverContent,
25
25
  TldrawUiPopoverTrigger,
26
26
  } from '../primitives/TldrawUiPopover'
27
+ import { TldrawUiRow } from '../primitives/layout'
27
28
  import { PageItemInput } from './PageItemInput'
28
29
  import { PageItemSubmenu } from './PageItemSubmenu'
29
30
  import { onMovePage } from './edit-pages-shared'
@@ -329,7 +330,7 @@ export const DefaultPageMenu = memo(function DefaultPageMenu() {
329
330
  <div className="tlui-page-menu__header">
330
331
  <div className="tlui-page-menu__header__title">{msg('page-menu.title')}</div>
331
332
  {!isReadonlyMode && (
332
- <div className="tlui-buttons__horizontal">
333
+ <TldrawUiRow>
333
334
  <TldrawUiButton
334
335
  type="icon"
335
336
  data-testid="page-menu.edit"
@@ -351,7 +352,7 @@ export const DefaultPageMenu = memo(function DefaultPageMenu() {
351
352
  >
352
353
  <TldrawUiButtonIcon icon="plus" />
353
354
  </TldrawUiButton>
354
- </div>
355
+ </TldrawUiRow>
355
356
  )}
356
357
  </div>
357
358
  <div
@@ -5,6 +5,7 @@ import { useTranslation } from '../../hooks/useTranslation/useTranslation'
5
5
  import { TldrawUiButton } from '../primitives/Button/TldrawUiButton'
6
6
  import { TldrawUiButtonIcon } from '../primitives/Button/TldrawUiButtonIcon'
7
7
  import { TldrawUiIcon } from '../primitives/TldrawUiIcon'
8
+ import { TldrawUiRow } from '../primitives/layout'
8
9
 
9
10
  export const PeopleMenuItem = track(function PeopleMenuItem({ userId }: { userId: string }) {
10
11
  const editor = useEditor()
@@ -29,8 +30,8 @@ export const PeopleMenuItem = track(function PeopleMenuItem({ userId }: { userId
29
30
  if (!presence) return null
30
31
 
31
32
  return (
32
- <div
33
- className="tlui-people-menu__item tlui-buttons__horizontal"
33
+ <TldrawUiRow
34
+ className="tlui-people-menu__item"
34
35
  data-follow={youAreFollowingThem || theyAreFollowingYou}
35
36
  >
36
37
  <TldrawUiButton
@@ -61,6 +62,6 @@ export const PeopleMenuItem = track(function PeopleMenuItem({ userId }: { userId
61
62
  icon={theyAreFollowingYou ? 'leading' : youAreFollowingThem ? 'following' : 'follow'}
62
63
  />
63
64
  </TldrawUiButton>
64
- </div>
65
+ </TldrawUiRow>
65
66
  )
66
67
  })
@@ -5,6 +5,7 @@ import { useUiEvents } from '../../context/events'
5
5
  import { useTranslation } from '../../hooks/useTranslation/useTranslation'
6
6
  import { TldrawUiButton } from '../primitives/Button/TldrawUiButton'
7
7
  import { TldrawUiButtonIcon } from '../primitives/Button/TldrawUiButtonIcon'
8
+ import { TldrawUiGrid } from '../primitives/layout'
8
9
 
9
10
  export const UserPresenceColorPicker = track(function UserPresenceColorPicker() {
10
11
  const editor = useEditor()
@@ -100,7 +101,7 @@ export const UserPresenceColorPicker = track(function UserPresenceColorPicker()
100
101
  side="left"
101
102
  sideOffset={8}
102
103
  >
103
- <div className={'tlui-buttons__grid'}>
104
+ <TldrawUiGrid>
104
105
  {USER_COLORS.map((item: string) => (
105
106
  <TldrawUiButton
106
107
  type="icon"
@@ -110,7 +111,6 @@ export const UserPresenceColorPicker = track(function UserPresenceColorPicker()
110
111
  aria-label={item}
111
112
  isActive={value === item}
112
113
  title={item}
113
- className={'tlui-button-grid__button'}
114
114
  style={{ color: item }}
115
115
  onPointerEnter={handleButtonPointerEnter}
116
116
  onPointerDown={handleButtonPointerDown}
@@ -120,7 +120,7 @@ export const UserPresenceColorPicker = track(function UserPresenceColorPicker()
120
120
  <TldrawUiButtonIcon icon="color" />
121
121
  </TldrawUiButton>
122
122
  ))}
123
- </div>
123
+ </TldrawUiGrid>
124
124
  </_Popover.Content>
125
125
  </_Popover.Portal>
126
126
  </_Popover.Root>
@@ -1,4 +1,4 @@
1
- import { useEditor, usePassThroughWheelEvents } from '@tldraw/editor'
1
+ import { useEditor, usePassThroughWheelEvents, useValue } from '@tldraw/editor'
2
2
  import classNames from 'classnames'
3
3
  import { ReactNode, memo, useCallback, useEffect, useRef } from 'react'
4
4
  import { useRelevantStyles } from '../../hooks/useRelevantStyles'
@@ -16,6 +16,7 @@ export const DefaultStylePanel = memo(function DefaultStylePanel({
16
16
  children,
17
17
  }: TLUiStylePanelProps) {
18
18
  const editor = useEditor()
19
+ const showUiLabels = useValue('showUiLabels', () => editor.user.getShowUiLabels(), [editor])
19
20
 
20
21
  const ref = useRef<HTMLDivElement>(null)
21
22
  usePassThroughWheelEvents(ref)
@@ -50,6 +51,7 @@ export const DefaultStylePanel = memo(function DefaultStylePanel({
50
51
  ref={ref}
51
52
  className={classNames('tlui-style-panel', { 'tlui-style-panel__wrapper': !isMobile })}
52
53
  data-ismobile={isMobile}
54
+ data-show-ui-labels={showUiLabels}
53
55
  onPointerLeave={handlePointerOut}
54
56
  >
55
57
  {content}
@@ -35,6 +35,11 @@ import { TldrawUiToolbar, TldrawUiToolbarButton } from '../primitives/TldrawUiTo
35
35
  import { DoubleDropdownPicker } from './DoubleDropdownPicker'
36
36
  import { DropdownPicker } from './DropdownPicker'
37
37
 
38
+ // Local component for style panel subheadings
39
+ function StylePanelSubheading({ children }: { children: React.ReactNode }) {
40
+ return <h3 className="tlui-style-panel__subheading">{children}</h3>
41
+ }
42
+
38
43
  /** @public */
39
44
  export interface TLUiStylePanelContentProps {
40
45
  styles: ReturnType<typeof useRelevantStyles>
@@ -115,6 +120,7 @@ export function CommonStylePickerSet({ styles, theme }: ThemeStylePickerSetProps
115
120
  const editor = useEditor()
116
121
 
117
122
  const onHistoryMark = useCallback((id: string) => editor.markHistoryStoppingPoint(id), [editor])
123
+ const showUiLabels = useValue('showUiLabels', () => editor.user.getShowUiLabels(), [editor])
118
124
 
119
125
  const handleValueChange = useStyleChangeCallback()
120
126
 
@@ -129,70 +135,90 @@ export function CommonStylePickerSet({ styles, theme }: ThemeStylePickerSetProps
129
135
  <>
130
136
  <div className="tlui-style-panel__section__common" data-testid="style.panel">
131
137
  {color === undefined ? null : (
132
- <TldrawUiToolbar label={msg('style-panel.color')}>
133
- <TldrawUiButtonPicker
134
- title={msg('style-panel.color')}
135
- uiType="color"
136
- style={DefaultColorStyle}
137
- items={STYLES.color}
138
- value={color}
139
- onValueChange={handleValueChange}
140
- theme={theme}
141
- onHistoryMark={onHistoryMark}
142
- />
143
- </TldrawUiToolbar>
144
- )}
145
- <OpacitySlider />
146
- </div>
147
- {showPickers && (
148
- <div className="tlui-style-panel__section">
149
- {fill === undefined ? null : (
150
- <TldrawUiToolbar label={msg('style-panel.fill')}>
138
+ <>
139
+ {showUiLabels && (
140
+ <StylePanelSubheading>{msg('style-panel.color')}</StylePanelSubheading>
141
+ )}
142
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.color')}>
151
143
  <TldrawUiButtonPicker
152
- title={msg('style-panel.fill')}
153
- uiType="fill"
154
- style={DefaultFillStyle}
155
- items={STYLES.fill}
156
- value={fill}
144
+ title={msg('style-panel.color')}
145
+ uiType="color"
146
+ style={DefaultColorStyle}
147
+ items={STYLES.color}
148
+ value={color}
157
149
  onValueChange={handleValueChange}
158
150
  theme={theme}
159
151
  onHistoryMark={onHistoryMark}
160
152
  />
161
153
  </TldrawUiToolbar>
154
+ </>
155
+ )}
156
+ <OpacitySlider />
157
+ </div>
158
+ {showPickers && (
159
+ <div className="tlui-style-panel__section">
160
+ {fill === undefined ? null : (
161
+ <>
162
+ {showUiLabels && (
163
+ <StylePanelSubheading>{msg('style-panel.fill')}</StylePanelSubheading>
164
+ )}
165
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.fill')}>
166
+ <TldrawUiButtonPicker
167
+ title={msg('style-panel.fill')}
168
+ uiType="fill"
169
+ style={DefaultFillStyle}
170
+ items={STYLES.fill}
171
+ value={fill}
172
+ onValueChange={handleValueChange}
173
+ theme={theme}
174
+ onHistoryMark={onHistoryMark}
175
+ />
176
+ </TldrawUiToolbar>
177
+ </>
162
178
  )}
163
179
  {dash === undefined ? null : (
164
- <TldrawUiToolbar label={msg('style-panel.dash')}>
165
- <TldrawUiButtonPicker
166
- title={msg('style-panel.dash')}
167
- uiType="dash"
168
- style={DefaultDashStyle}
169
- items={STYLES.dash}
170
- value={dash}
171
- onValueChange={handleValueChange}
172
- theme={theme}
173
- onHistoryMark={onHistoryMark}
174
- />
175
- </TldrawUiToolbar>
180
+ <>
181
+ {showUiLabels && (
182
+ <StylePanelSubheading>{msg('style-panel.dash')}</StylePanelSubheading>
183
+ )}
184
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.dash')}>
185
+ <TldrawUiButtonPicker
186
+ title={msg('style-panel.dash')}
187
+ uiType="dash"
188
+ style={DefaultDashStyle}
189
+ items={STYLES.dash}
190
+ value={dash}
191
+ onValueChange={handleValueChange}
192
+ theme={theme}
193
+ onHistoryMark={onHistoryMark}
194
+ />
195
+ </TldrawUiToolbar>
196
+ </>
176
197
  )}
177
198
  {size === undefined ? null : (
178
- <TldrawUiToolbar label={msg('style-panel.size')}>
179
- <TldrawUiButtonPicker
180
- title={msg('style-panel.size')}
181
- uiType="size"
182
- style={DefaultSizeStyle}
183
- items={STYLES.size}
184
- value={size}
185
- onValueChange={(style, value) => {
186
- handleValueChange(style, value)
187
- const selectedShapeIds = editor.getSelectedShapeIds()
188
- if (selectedShapeIds.length > 0) {
189
- kickoutOccludedShapes(editor, selectedShapeIds)
190
- }
191
- }}
192
- theme={theme}
193
- onHistoryMark={onHistoryMark}
194
- />
195
- </TldrawUiToolbar>
199
+ <>
200
+ {showUiLabels && (
201
+ <StylePanelSubheading>{msg('style-panel.size')}</StylePanelSubheading>
202
+ )}
203
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.size')}>
204
+ <TldrawUiButtonPicker
205
+ title={msg('style-panel.size')}
206
+ uiType="size"
207
+ style={DefaultSizeStyle}
208
+ items={STYLES.size}
209
+ value={size}
210
+ onValueChange={(style, value) => {
211
+ handleValueChange(style, value)
212
+ const selectedShapeIds = editor.getSelectedShapeIds()
213
+ if (selectedShapeIds.length > 0) {
214
+ kickoutOccludedShapes(editor, selectedShapeIds)
215
+ }
216
+ }}
217
+ theme={theme}
218
+ onHistoryMark={onHistoryMark}
219
+ />
220
+ </TldrawUiToolbar>
221
+ </>
196
222
  )}
197
223
  </div>
198
224
  )}
@@ -207,6 +233,8 @@ export function TextStylePickerSet({ theme, styles }: ThemeStylePickerSetProps)
207
233
 
208
234
  const editor = useEditor()
209
235
  const onHistoryMark = useCallback((id: string) => editor.markHistoryStoppingPoint(id), [editor])
236
+ const showUiLabels = useValue('showUiLabels', () => editor.user.getShowUiLabels(), [editor])
237
+ const labelStr = showUiLabels && msg('style-panel.font')
210
238
 
211
239
  const font = styles.get(DefaultFontStyle)
212
240
  const textAlign = styles.get(DefaultTextAlignStyle)
@@ -219,33 +247,37 @@ export function TextStylePickerSet({ theme, styles }: ThemeStylePickerSetProps)
219
247
  return (
220
248
  <div className="tlui-style-panel__section">
221
249
  {font === undefined ? null : (
222
- <TldrawUiToolbar label={msg('style-panel.font')}>
223
- <TldrawUiButtonPicker
224
- title={msg('style-panel.font')}
225
- uiType="font"
226
- style={DefaultFontStyle}
227
- items={STYLES.font}
228
- value={font}
229
- onValueChange={handleValueChange}
230
- theme={theme}
231
- onHistoryMark={onHistoryMark}
232
- />
233
- </TldrawUiToolbar>
250
+ <>
251
+ {labelStr && <StylePanelSubheading>{labelStr}</StylePanelSubheading>}
252
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.font')}>
253
+ <TldrawUiButtonPicker
254
+ title={msg('style-panel.font')}
255
+ uiType="font"
256
+ style={DefaultFontStyle}
257
+ items={STYLES.font}
258
+ value={font}
259
+ onValueChange={handleValueChange}
260
+ theme={theme}
261
+ onHistoryMark={onHistoryMark}
262
+ />
263
+ </TldrawUiToolbar>
264
+ </>
234
265
  )}
235
266
 
236
267
  {textAlign === undefined ? null : (
237
- <TldrawUiToolbar label={msg('style-panel.align')} className="tlui-style-panel__row">
238
- <TldrawUiButtonPicker
239
- title={msg('style-panel.align')}
240
- uiType="align"
241
- style={DefaultTextAlignStyle}
242
- items={STYLES.textAlign}
243
- value={textAlign}
244
- onValueChange={handleValueChange}
245
- theme={theme}
246
- onHistoryMark={onHistoryMark}
247
- />
248
- <div className="tlui-style-panel__row__extra-button">
268
+ <>
269
+ {showUiLabels && <StylePanelSubheading>{msg('style-panel.align')}</StylePanelSubheading>}
270
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.align')}>
271
+ <TldrawUiButtonPicker
272
+ title={msg('style-panel.align')}
273
+ uiType="align"
274
+ style={DefaultTextAlignStyle}
275
+ items={STYLES.textAlign}
276
+ value={textAlign}
277
+ onValueChange={handleValueChange}
278
+ theme={theme}
279
+ onHistoryMark={onHistoryMark}
280
+ />
249
281
  <TldrawUiToolbarButton
250
282
  type="icon"
251
283
  title={msg('style-panel.vertical-align')}
@@ -254,23 +286,26 @@ export function TextStylePickerSet({ theme, styles }: ThemeStylePickerSetProps)
254
286
  >
255
287
  <TldrawUiButtonIcon icon="vertical-align-middle" />
256
288
  </TldrawUiToolbarButton>
257
- </div>
258
- </TldrawUiToolbar>
289
+ </TldrawUiToolbar>
290
+ </>
259
291
  )}
260
292
 
261
293
  {labelAlign === undefined ? null : (
262
- <TldrawUiToolbar label={msg('style-panel.label-align')} className="tlui-style-panel__row">
263
- <TldrawUiButtonPicker
264
- title={msg('style-panel.label-align')}
265
- uiType="align"
266
- style={DefaultHorizontalAlignStyle}
267
- items={STYLES.horizontalAlign}
268
- value={labelAlign}
269
- onValueChange={handleValueChange}
270
- theme={theme}
271
- onHistoryMark={onHistoryMark}
272
- />
273
- <div className="tlui-style-panel__row__extra-button">
294
+ <>
295
+ {showUiLabels && (
296
+ <StylePanelSubheading>{msg('style-panel.label-align')}</StylePanelSubheading>
297
+ )}
298
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.label-align')}>
299
+ <TldrawUiButtonPicker
300
+ title={msg('style-panel.label-align')}
301
+ uiType="align"
302
+ style={DefaultHorizontalAlignStyle}
303
+ items={STYLES.horizontalAlign}
304
+ value={labelAlign}
305
+ onValueChange={handleValueChange}
306
+ theme={theme}
307
+ onHistoryMark={onHistoryMark}
308
+ />
274
309
  {verticalLabelAlign === undefined ? (
275
310
  <TldrawUiToolbarButton
276
311
  type="icon"
@@ -292,8 +327,8 @@ export function TextStylePickerSet({ theme, styles }: ThemeStylePickerSetProps)
292
327
  onValueChange={handleValueChange}
293
328
  />
294
329
  )}
295
- </div>
296
- </TldrawUiToolbar>
330
+ </TldrawUiToolbar>
331
+ </>
297
332
  )}
298
333
  </div>
299
334
  )
@@ -309,7 +344,7 @@ export function GeoStylePickerSet({ styles }: StylePickerSetProps) {
309
344
  }
310
345
 
311
346
  return (
312
- <TldrawUiToolbar label={msg('style-panel.geo')}>
347
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.geo')}>
313
348
  <DropdownPicker
314
349
  id="geo"
315
350
  type="menu"
@@ -335,7 +370,7 @@ export function SplineStylePickerSet({ styles }: StylePickerSetProps) {
335
370
  }
336
371
 
337
372
  return (
338
- <TldrawUiToolbar label={msg('style-panel.spline')}>
373
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.spline')}>
339
374
  <DropdownPicker
340
375
  id="spline"
341
376
  type="menu"
@@ -361,7 +396,7 @@ export function ArrowStylePickerSet({ styles }: StylePickerSetProps) {
361
396
  }
362
397
 
363
398
  return (
364
- <TldrawUiToolbar label={msg('style-panel.arrow-kind')}>
399
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.arrow-kind')}>
365
400
  <DropdownPicker
366
401
  id="arrow-kind"
367
402
  type="menu"
@@ -410,6 +445,7 @@ export function OpacitySlider() {
410
445
  const editor = useEditor()
411
446
 
412
447
  const onHistoryMark = useCallback((id: string) => editor.markHistoryStoppingPoint(id), [editor])
448
+ const showUiLabels = useValue('showUiLabels', () => editor.user.getShowUiLabels(), [editor])
413
449
 
414
450
  const opacity = useValue('opacity', () => editor.getSharedOpacity(), [editor])
415
451
  const trackEvent = useUiEvents()
@@ -443,15 +479,18 @@ export function OpacitySlider() {
443
479
  )
444
480
 
445
481
  return (
446
- <TldrawUiSlider
447
- data-testid="style.opacity"
448
- value={opacityIndex >= 0 ? opacityIndex : tldrawSupportedOpacities.length - 1}
449
- label={opacity.type === 'mixed' ? 'style-panel.mixed' : `opacity-style.${opacity.value}`}
450
- onValueChange={handleOpacityValueChange}
451
- steps={tldrawSupportedOpacities.length - 1}
452
- title={msg('style-panel.opacity')}
453
- onHistoryMark={onHistoryMark}
454
- ariaValueModifier={25}
455
- />
482
+ <>
483
+ {showUiLabels && <StylePanelSubheading>{msg('style-panel.opacity')}</StylePanelSubheading>}
484
+ <TldrawUiSlider
485
+ data-testid="style.opacity"
486
+ value={opacityIndex >= 0 ? opacityIndex : tldrawSupportedOpacities.length - 1}
487
+ label={opacity.type === 'mixed' ? 'style-panel.mixed' : `opacity-style.${opacity.value}`}
488
+ onValueChange={handleOpacityValueChange}
489
+ steps={tldrawSupportedOpacities.length - 1}
490
+ title={msg('style-panel.opacity')}
491
+ onHistoryMark={onHistoryMark}
492
+ ariaValueModifier={25}
493
+ />
494
+ </>
456
495
  )
457
496
  }
@@ -68,7 +68,7 @@ function DoubleDropdownPickerInner<T extends string>({
68
68
  <div title={msg(label)} className="tlui-style-panel__double-select-picker-label">
69
69
  {msg(label)}
70
70
  </div>
71
- <TldrawUiToolbar label={msg(label)} className="tlui-buttons__horizontal">
71
+ <TldrawUiToolbar orientation="horizontal" label={msg(label)}>
72
72
  <TldrawUiPopover id={idA} open={isOpenA} onOpenChange={setIsOpenA}>
73
73
  <TldrawUiPopoverTrigger>
74
74
  <TldrawUiToolbarButton
@@ -86,7 +86,7 @@ function DoubleDropdownPickerInner<T extends string>({
86
86
  </TldrawUiToolbarButton>
87
87
  </TldrawUiPopoverTrigger>
88
88
  <TldrawUiPopoverContent side="left" align="center" sideOffset={80} alignOffset={0}>
89
- <TldrawUiToolbar label={msg(labelA)} className="tlui-buttons__grid">
89
+ <TldrawUiToolbar orientation="grid" label={msg(labelA)}>
90
90
  <TldrawUiMenuContextProvider type="icons" sourceId="style-panel">
91
91
  {itemsA.map((item) => {
92
92
  return (
@@ -126,7 +126,7 @@ function DoubleDropdownPickerInner<T extends string>({
126
126
  </TldrawUiToolbarButton>
127
127
  </TldrawUiPopoverTrigger>
128
128
  <TldrawUiPopoverContent side="left" align="center" sideOffset={116} alignOffset={0}>
129
- <TldrawUiToolbar label={msg(labelB)} className="tlui-buttons__grid">
129
+ <TldrawUiToolbar orientation="grid" label={msg(labelB)}>
130
130
  <TldrawUiMenuContextProvider type="icons" sourceId="style-panel">
131
131
  {itemsB.map((item) => {
132
132
  return (
@@ -1,5 +1,4 @@
1
1
  import { SharedStyle, StyleProp, tlmenus, useEditor } from '@tldraw/editor'
2
- import classNames from 'classnames'
3
2
  import * as React from 'react'
4
3
  import { StyleValuesForUi } from '../../../styles'
5
4
  import { TLUiTranslationKey } from '../../hooks/useTranslation/TLUiTranslationKey'
@@ -57,7 +56,12 @@ function DropdownPickerInner<T extends string>({
57
56
 
58
57
  const popoverId = `style panel ${id}`
59
58
  return (
60
- <TldrawUiPopover id={popoverId} open={isOpen} onOpenChange={setIsOpen}>
59
+ <TldrawUiPopover
60
+ id={popoverId}
61
+ open={isOpen}
62
+ onOpenChange={setIsOpen}
63
+ className="tlui-style-panel__dropdown-picker"
64
+ >
61
65
  <TldrawUiPopoverTrigger>
62
66
  <TldrawUiToolbarButton
63
67
  type={type}
@@ -70,10 +74,7 @@ function DropdownPickerInner<T extends string>({
70
74
  </TldrawUiToolbarButton>
71
75
  </TldrawUiPopoverTrigger>
72
76
  <TldrawUiPopoverContent side="left" align="center">
73
- <TldrawUiToolbar
74
- label={labelStr}
75
- className={classNames('tlui-buttons__grid', `tlui-buttons__${stylePanelType}`)}
76
- >
77
+ <TldrawUiToolbar orientation="grid" label={labelStr}>
77
78
  <TldrawUiMenuContextProvider type="icons" sourceId="style-panel">
78
79
  {items.map((item) => {
79
80
  return (
@@ -44,14 +44,15 @@ export const DefaultToolbar = memo(function DefaultToolbar({ children }: Default
44
44
  : breakpoint < PORTRAIT_BREAKPOINT.TABLET
45
45
 
46
46
  return (
47
- <div ref={ref} className="tlui-toolbar">
48
- <div className="tlui-toolbar__inner">
49
- <div className="tlui-toolbar__left">
47
+ <div ref={ref} className="tlui-main-toolbar">
48
+ <div className="tlui-main-toolbar__inner">
49
+ <div className="tlui-main-toolbar__left">
50
50
  {!isReadonlyMode && (
51
- <div className="tlui-toolbar__extras">
51
+ <div className="tlui-main-toolbar__extras">
52
52
  {showQuickActions && (
53
53
  <TldrawUiToolbar
54
- className="tlui-toolbar__extras__controls tlui-buttons__horizontal"
54
+ orientation="horizontal"
55
+ className="tlui-main-toolbar__extras__controls"
55
56
  label={msg('actions-menu.title')}
56
57
  >
57
58
  {QuickActions && <QuickActions />}
@@ -64,7 +65,7 @@ export const DefaultToolbar = memo(function DefaultToolbar({ children }: Default
64
65
  <OverflowingToolbar>{children ?? <DefaultToolbarContent />}</OverflowingToolbar>
65
66
  </div>
66
67
  {breakpoint < PORTRAIT_BREAKPOINT.TABLET_SM && !isReadonlyMode && (
67
- <div className="tlui-toolbar__tools">
68
+ <div className="tlui-main-toolbar__tools">
68
69
  <MobileStylePanel />
69
70
  </div>
70
71
  )}