tldraw 3.16.0-next.34fddf633325 → 3.16.0-next.4337ae1ab96d

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 (438) hide show
  1. package/dist-cjs/index.d.ts +324 -105
  2. package/dist-cjs/index.js +40 -14
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/Tldraw.js +12 -2
  5. package/dist-cjs/lib/Tldraw.js.map +2 -2
  6. package/dist-cjs/lib/canvas/TldrawScribble.js +1 -1
  7. package/dist-cjs/lib/canvas/TldrawScribble.js.map +2 -2
  8. package/dist-cjs/lib/defaultExternalContentHandlers.js +5 -4
  9. package/dist-cjs/lib/defaultExternalContentHandlers.js.map +2 -2
  10. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js +3 -3
  11. package/dist-cjs/lib/shapes/arrow/ArrowShapeUtil.js.map +2 -2
  12. package/dist-cjs/lib/shapes/arrow/arrowLabel.js +6 -0
  13. package/dist-cjs/lib/shapes/arrow/arrowLabel.js.map +3 -3
  14. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js +3 -3
  15. package/dist-cjs/lib/shapes/arrow/elbow/ElbowArrowDebug.js.map +1 -1
  16. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js +3 -3
  17. package/dist-cjs/lib/shapes/draw/DrawShapeUtil.js.map +2 -2
  18. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js +1 -1
  19. package/dist-cjs/lib/shapes/embed/EmbedShapeUtil.js.map +1 -1
  20. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js +18 -12
  21. package/dist-cjs/lib/shapes/frame/FrameShapeUtil.js.map +2 -2
  22. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js +1 -1
  23. package/dist-cjs/lib/shapes/frame/components/FrameHeading.js.map +2 -2
  24. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js +2 -2
  25. package/dist-cjs/lib/shapes/geo/GeoShapeUtil.js.map +2 -2
  26. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js +2 -1
  27. package/dist-cjs/lib/shapes/geo/components/GeoShapeBody.js.map +2 -2
  28. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js +5 -1
  29. package/dist-cjs/lib/shapes/highlight/HighlightShapeUtil.js.map +2 -2
  30. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js +6 -3
  31. package/dist-cjs/lib/shapes/image/ImageShapeUtil.js.map +2 -2
  32. package/dist-cjs/lib/shapes/line/LineShapeUtil.js +5 -1
  33. package/dist-cjs/lib/shapes/line/LineShapeUtil.js.map +2 -2
  34. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js +4 -4
  35. package/dist-cjs/lib/shapes/note/NoteShapeUtil.js.map +2 -2
  36. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js +1 -3
  37. package/dist-cjs/lib/shapes/shared/PlainTextLabel.js.map +2 -2
  38. package/dist-cjs/lib/shapes/shared/ShapeFill.js +4 -4
  39. package/dist-cjs/lib/shapes/shared/ShapeFill.js.map +2 -2
  40. package/dist-cjs/lib/shapes/shared/freehand/svg.js.map +2 -2
  41. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js +0 -2
  42. package/dist-cjs/lib/shapes/shared/useEditablePlainText.js.map +2 -2
  43. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js +0 -2
  44. package/dist-cjs/lib/shapes/shared/useImageOrVideoAsset.js.map +2 -2
  45. package/dist-cjs/lib/shapes/text/TextShapeUtil.js +2 -2
  46. package/dist-cjs/lib/shapes/text/TextShapeUtil.js.map +2 -2
  47. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js +3 -3
  48. package/dist-cjs/lib/shapes/video/VideoShapeUtil.js.map +1 -1
  49. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js +25 -1
  50. package/dist-cjs/lib/tools/EraserTool/childStates/Erasing.js.map +2 -2
  51. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js +12 -0
  52. package/dist-cjs/lib/tools/EraserTool/childStates/Pointing.js.map +2 -2
  53. package/dist-cjs/lib/tools/SelectTool/childStates/Translating.js.map +2 -2
  54. package/dist-cjs/lib/ui/TldrawUi.js +27 -12
  55. package/dist-cjs/lib/ui/TldrawUi.js.map +3 -3
  56. package/dist-cjs/lib/ui/assetUrls.js +13 -10
  57. package/dist-cjs/lib/ui/assetUrls.js.map +2 -2
  58. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js +12 -3
  59. package/dist-cjs/lib/ui/components/ActionsMenu/DefaultActionsMenu.js.map +2 -2
  60. package/dist-cjs/lib/ui/components/{FollowingIndicator.js → DefaultFollowingIndicator.js} +6 -6
  61. package/dist-cjs/lib/ui/components/DefaultFollowingIndicator.js.map +7 -0
  62. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js +3 -2
  63. package/dist-cjs/lib/ui/components/DefaultMenuPanel.js.map +2 -2
  64. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js +6 -6
  65. package/dist-cjs/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.js.map +1 -1
  66. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js +4 -4
  67. package/dist-cjs/lib/ui/components/Minimap/MinimapManager.js.map +2 -2
  68. package/dist-cjs/lib/ui/components/MobileStylePanel.js +5 -3
  69. package/dist-cjs/lib/ui/components/MobileStylePanel.js.map +2 -2
  70. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js +1 -1
  71. package/dist-cjs/lib/ui/components/NavigationPanel/DefaultNavigationPanel.js.map +2 -2
  72. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js +2 -1
  73. package/dist-cjs/lib/ui/components/PageMenu/DefaultPageMenu.js.map +2 -2
  74. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js +3 -2
  75. package/dist-cjs/lib/ui/components/SharePanel/PeopleMenuItem.js.map +2 -2
  76. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js +2 -2
  77. package/dist-cjs/lib/ui/components/SharePanel/UserPresenceColorPicker.js.map +2 -2
  78. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js +9 -4
  79. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanel.js.map +2 -2
  80. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js +255 -316
  81. package/dist-cjs/lib/ui/components/StylePanel/DefaultStylePanelContent.js.map +2 -2
  82. package/dist-cjs/lib/ui/components/{primitives/TldrawUiButtonPicker.js → StylePanel/StylePanelButtonPicker.js} +52 -56
  83. package/dist-cjs/lib/ui/components/StylePanel/StylePanelButtonPicker.js.map +7 -0
  84. package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js +68 -0
  85. package/dist-cjs/lib/ui/components/StylePanel/StylePanelContext.js.map +7 -0
  86. package/dist-cjs/lib/ui/components/StylePanel/{DoubleDropdownPicker.js → StylePanelDoubleDropdownPicker.js} +26 -25
  87. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.js.map +7 -0
  88. package/dist-cjs/lib/ui/components/StylePanel/{DropdownPicker.js → StylePanelDropdownPicker.js} +47 -43
  89. package/dist-cjs/lib/ui/components/StylePanel/StylePanelDropdownPicker.js.map +7 -0
  90. package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js +28 -0
  91. package/dist-cjs/lib/ui/components/StylePanel/StylePanelSubheading.js.map +7 -0
  92. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js +3 -2
  93. package/dist-cjs/lib/ui/components/Toolbar/AltTextEditor.js.map +2 -2
  94. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js +39 -10
  95. package/dist-cjs/lib/ui/components/Toolbar/DefaultImageToolbarContent.js.map +2 -2
  96. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js +66 -21
  97. package/dist-cjs/lib/ui/components/Toolbar/DefaultToolbar.js.map +3 -3
  98. package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js +15 -3
  99. package/dist-cjs/lib/ui/components/Toolbar/DefaultVideoToolbarContent.js.map +2 -2
  100. package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js +3 -3
  101. package/dist-cjs/lib/ui/components/Toolbar/LinkEditor.js.map +2 -2
  102. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js +189 -80
  103. package/dist-cjs/lib/ui/components/Toolbar/OverflowingToolbar.js.map +3 -3
  104. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js +2 -2
  105. package/dist-cjs/lib/ui/components/Toolbar/ToggleToolLockedButton.js.map +2 -2
  106. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js +10 -1
  107. package/dist-cjs/lib/ui/components/primitives/TldrawUiContextualToolbar.js.map +2 -2
  108. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js +3 -2
  109. package/dist-cjs/lib/ui/components/primitives/TldrawUiPopover.js.map +3 -3
  110. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js +17 -4
  111. package/dist-cjs/lib/ui/components/primitives/TldrawUiSlider.js.map +2 -2
  112. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js +21 -4
  113. package/dist-cjs/lib/ui/components/primitives/TldrawUiToolbar.js.map +2 -2
  114. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js +161 -159
  115. package/dist-cjs/lib/ui/components/primitives/TldrawUiTooltip.js.map +2 -2
  116. package/dist-cjs/lib/ui/components/primitives/layout.js +76 -0
  117. package/dist-cjs/lib/ui/components/primitives/layout.js.map +7 -0
  118. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuContext.js.map +2 -2
  119. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js +25 -12
  120. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuGroup.js.map +2 -2
  121. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js +154 -20
  122. package/dist-cjs/lib/ui/components/primitives/menus/TldrawUiMenuItem.js.map +2 -2
  123. package/dist-cjs/lib/ui/context/actions.js +23 -10
  124. package/dist-cjs/lib/ui/context/actions.js.map +2 -2
  125. package/dist-cjs/lib/ui/context/components.js +2 -0
  126. package/dist-cjs/lib/ui/context/components.js.map +2 -2
  127. package/dist-cjs/lib/ui/context/events.js.map +2 -2
  128. package/dist-cjs/lib/ui/hooks/useExportAs.js +3 -2
  129. package/dist-cjs/lib/ui/hooks/useExportAs.js.map +2 -2
  130. package/dist-cjs/lib/ui/hooks/useTools.js +94 -9
  131. package/dist-cjs/lib/ui/hooks/useTools.js.map +2 -2
  132. package/dist-cjs/lib/ui/hooks/useTranslation/TLUiTranslationKey.js.map +1 -1
  133. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js +2 -0
  134. package/dist-cjs/lib/ui/hooks/useTranslation/defaultTranslation.js.map +2 -2
  135. package/dist-cjs/lib/ui/kbd-utils.js +9 -3
  136. package/dist-cjs/lib/ui/kbd-utils.js.map +2 -2
  137. package/dist-cjs/lib/ui/version.js +3 -3
  138. package/dist-cjs/lib/ui/version.js.map +1 -1
  139. package/dist-cjs/lib/utils/export/copyAs.js +1 -2
  140. package/dist-cjs/lib/utils/export/copyAs.js.map +2 -2
  141. package/dist-cjs/lib/utils/export/export.js +0 -20
  142. package/dist-cjs/lib/utils/export/export.js.map +2 -2
  143. package/dist-cjs/lib/utils/export/exportAs.js +1 -2
  144. package/dist-cjs/lib/utils/export/exportAs.js.map +2 -2
  145. package/dist-esm/index.d.mts +324 -105
  146. package/dist-esm/index.mjs +75 -29
  147. package/dist-esm/index.mjs.map +2 -2
  148. package/dist-esm/lib/Tldraw.mjs +14 -4
  149. package/dist-esm/lib/Tldraw.mjs.map +2 -2
  150. package/dist-esm/lib/canvas/TldrawScribble.mjs +1 -1
  151. package/dist-esm/lib/canvas/TldrawScribble.mjs.map +2 -2
  152. package/dist-esm/lib/defaultExternalContentHandlers.mjs +5 -4
  153. package/dist-esm/lib/defaultExternalContentHandlers.mjs.map +2 -2
  154. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs +4 -3
  155. package/dist-esm/lib/shapes/arrow/ArrowShapeUtil.mjs.map +2 -2
  156. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs +6 -0
  157. package/dist-esm/lib/shapes/arrow/arrowLabel.mjs.map +3 -3
  158. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs +3 -3
  159. package/dist-esm/lib/shapes/arrow/elbow/ElbowArrowDebug.mjs.map +1 -1
  160. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs +4 -3
  161. package/dist-esm/lib/shapes/draw/DrawShapeUtil.mjs.map +2 -2
  162. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs +1 -1
  163. package/dist-esm/lib/shapes/embed/EmbedShapeUtil.mjs.map +1 -1
  164. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs +19 -12
  165. package/dist-esm/lib/shapes/frame/FrameShapeUtil.mjs.map +2 -2
  166. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs +1 -1
  167. package/dist-esm/lib/shapes/frame/components/FrameHeading.mjs.map +2 -2
  168. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs +3 -2
  169. package/dist-esm/lib/shapes/geo/GeoShapeUtil.mjs.map +2 -2
  170. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs +2 -1
  171. package/dist-esm/lib/shapes/geo/components/GeoShapeBody.mjs.map +2 -2
  172. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs +6 -1
  173. package/dist-esm/lib/shapes/highlight/HighlightShapeUtil.mjs.map +2 -2
  174. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs +6 -3
  175. package/dist-esm/lib/shapes/image/ImageShapeUtil.mjs.map +2 -2
  176. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs +6 -1
  177. package/dist-esm/lib/shapes/line/LineShapeUtil.mjs.map +2 -2
  178. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs +5 -4
  179. package/dist-esm/lib/shapes/note/NoteShapeUtil.mjs.map +2 -2
  180. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs +1 -3
  181. package/dist-esm/lib/shapes/shared/PlainTextLabel.mjs.map +2 -2
  182. package/dist-esm/lib/shapes/shared/ShapeFill.mjs +5 -4
  183. package/dist-esm/lib/shapes/shared/ShapeFill.mjs.map +2 -2
  184. package/dist-esm/lib/shapes/shared/freehand/svg.mjs.map +2 -2
  185. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs +0 -2
  186. package/dist-esm/lib/shapes/shared/useEditablePlainText.mjs.map +2 -2
  187. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs +0 -2
  188. package/dist-esm/lib/shapes/shared/useImageOrVideoAsset.mjs.map +2 -2
  189. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs +3 -2
  190. package/dist-esm/lib/shapes/text/TextShapeUtil.mjs.map +2 -2
  191. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs +3 -3
  192. package/dist-esm/lib/shapes/video/VideoShapeUtil.mjs.map +1 -1
  193. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs +26 -1
  194. package/dist-esm/lib/tools/EraserTool/childStates/Erasing.mjs.map +2 -2
  195. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs +13 -0
  196. package/dist-esm/lib/tools/EraserTool/childStates/Pointing.mjs.map +2 -2
  197. package/dist-esm/lib/tools/SelectTool/childStates/Translating.mjs.map +2 -2
  198. package/dist-esm/lib/ui/TldrawUi.mjs +29 -14
  199. package/dist-esm/lib/ui/TldrawUi.mjs.map +3 -3
  200. package/dist-esm/lib/ui/assetUrls.mjs +13 -10
  201. package/dist-esm/lib/ui/assetUrls.mjs.map +2 -2
  202. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs +12 -3
  203. package/dist-esm/lib/ui/components/ActionsMenu/DefaultActionsMenu.mjs.map +2 -2
  204. package/dist-esm/lib/ui/components/{FollowingIndicator.mjs → DefaultFollowingIndicator.mjs} +3 -3
  205. package/dist-esm/lib/ui/components/DefaultFollowingIndicator.mjs.map +7 -0
  206. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs +3 -2
  207. package/dist-esm/lib/ui/components/DefaultMenuPanel.mjs.map +2 -2
  208. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs +6 -6
  209. package/dist-esm/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.mjs.map +1 -1
  210. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs +4 -4
  211. package/dist-esm/lib/ui/components/Minimap/MinimapManager.mjs.map +2 -2
  212. package/dist-esm/lib/ui/components/MobileStylePanel.mjs +6 -3
  213. package/dist-esm/lib/ui/components/MobileStylePanel.mjs.map +2 -2
  214. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs +1 -1
  215. package/dist-esm/lib/ui/components/NavigationPanel/DefaultNavigationPanel.mjs.map +2 -2
  216. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs +2 -1
  217. package/dist-esm/lib/ui/components/PageMenu/DefaultPageMenu.mjs.map +2 -2
  218. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs +3 -2
  219. package/dist-esm/lib/ui/components/SharePanel/PeopleMenuItem.mjs.map +2 -2
  220. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs +2 -2
  221. package/dist-esm/lib/ui/components/SharePanel/UserPresenceColorPicker.mjs.map +2 -2
  222. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs +14 -5
  223. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanel.mjs.map +2 -2
  224. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs +257 -320
  225. package/dist-esm/lib/ui/components/StylePanel/DefaultStylePanelContent.mjs.map +2 -2
  226. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs +126 -0
  227. package/dist-esm/lib/ui/components/StylePanel/StylePanelButtonPicker.mjs.map +7 -0
  228. package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs +48 -0
  229. package/dist-esm/lib/ui/components/StylePanel/StylePanelContext.mjs.map +7 -0
  230. package/dist-esm/lib/ui/components/StylePanel/{DoubleDropdownPicker.mjs → StylePanelDoubleDropdownPicker.mjs} +23 -22
  231. package/dist-esm/lib/ui/components/StylePanel/StylePanelDoubleDropdownPicker.mjs.map +7 -0
  232. package/dist-esm/lib/ui/components/StylePanel/{DropdownPicker.mjs → StylePanelDropdownPicker.mjs} +44 -40
  233. package/dist-esm/lib/ui/components/StylePanel/StylePanelDropdownPicker.mjs.map +7 -0
  234. package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs +8 -0
  235. package/dist-esm/lib/ui/components/StylePanel/StylePanelSubheading.mjs.map +7 -0
  236. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs +3 -2
  237. package/dist-esm/lib/ui/components/Toolbar/AltTextEditor.mjs.map +2 -2
  238. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs +39 -10
  239. package/dist-esm/lib/ui/components/Toolbar/DefaultImageToolbarContent.mjs.map +2 -2
  240. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs +56 -21
  241. package/dist-esm/lib/ui/components/Toolbar/DefaultToolbar.mjs.map +2 -2
  242. package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs +15 -3
  243. package/dist-esm/lib/ui/components/Toolbar/DefaultVideoToolbarContent.mjs.map +2 -2
  244. package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs +3 -3
  245. package/dist-esm/lib/ui/components/Toolbar/LinkEditor.mjs.map +2 -2
  246. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs +192 -81
  247. package/dist-esm/lib/ui/components/Toolbar/OverflowingToolbar.mjs.map +3 -3
  248. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs +2 -2
  249. package/dist-esm/lib/ui/components/Toolbar/ToggleToolLockedButton.mjs.map +2 -2
  250. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs +10 -1
  251. package/dist-esm/lib/ui/components/primitives/TldrawUiContextualToolbar.mjs.map +2 -2
  252. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs +3 -2
  253. package/dist-esm/lib/ui/components/primitives/TldrawUiPopover.mjs.map +2 -2
  254. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs +17 -4
  255. package/dist-esm/lib/ui/components/primitives/TldrawUiSlider.mjs.map +2 -2
  256. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs +21 -4
  257. package/dist-esm/lib/ui/components/primitives/TldrawUiToolbar.mjs.map +2 -2
  258. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs +170 -161
  259. package/dist-esm/lib/ui/components/primitives/TldrawUiTooltip.mjs.map +2 -2
  260. package/dist-esm/lib/ui/components/primitives/layout.mjs +46 -0
  261. package/dist-esm/lib/ui/components/primitives/layout.mjs.map +7 -0
  262. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuContext.mjs.map +2 -2
  263. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs +25 -12
  264. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuGroup.mjs.map +2 -2
  265. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs +162 -22
  266. package/dist-esm/lib/ui/components/primitives/menus/TldrawUiMenuItem.mjs.map +2 -2
  267. package/dist-esm/lib/ui/context/actions.mjs +23 -10
  268. package/dist-esm/lib/ui/context/actions.mjs.map +2 -2
  269. package/dist-esm/lib/ui/context/components.mjs +2 -0
  270. package/dist-esm/lib/ui/context/components.mjs.map +2 -2
  271. package/dist-esm/lib/ui/context/events.mjs.map +2 -2
  272. package/dist-esm/lib/ui/hooks/useExportAs.mjs +3 -2
  273. package/dist-esm/lib/ui/hooks/useExportAs.mjs.map +2 -2
  274. package/dist-esm/lib/ui/hooks/useTools.mjs +102 -10
  275. package/dist-esm/lib/ui/hooks/useTools.mjs.map +2 -2
  276. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs +2 -0
  277. package/dist-esm/lib/ui/hooks/useTranslation/defaultTranslation.mjs.map +2 -2
  278. package/dist-esm/lib/ui/kbd-utils.mjs +9 -3
  279. package/dist-esm/lib/ui/kbd-utils.mjs.map +2 -2
  280. package/dist-esm/lib/ui/version.mjs +3 -3
  281. package/dist-esm/lib/ui/version.mjs.map +1 -1
  282. package/dist-esm/lib/utils/export/copyAs.mjs +1 -2
  283. package/dist-esm/lib/utils/export/copyAs.mjs.map +2 -2
  284. package/dist-esm/lib/utils/export/export.mjs +0 -20
  285. package/dist-esm/lib/utils/export/export.mjs.map +2 -2
  286. package/dist-esm/lib/utils/export/exportAs.mjs +1 -2
  287. package/dist-esm/lib/utils/export/exportAs.mjs.map +2 -2
  288. package/package.json +11 -34
  289. package/src/index.ts +56 -22
  290. package/src/lib/Tldraw.tsx +15 -2
  291. package/src/lib/canvas/TldrawScribble.tsx +1 -1
  292. package/src/lib/defaultExternalContentHandlers.ts +12 -4
  293. package/src/lib/shapes/arrow/ArrowShapeOptions.test.ts +2 -1
  294. package/src/lib/shapes/arrow/ArrowShapeTool.test.ts +4 -3
  295. package/src/lib/shapes/arrow/ArrowShapeUtil.test.ts +7 -6
  296. package/src/lib/shapes/arrow/ArrowShapeUtil.tsx +4 -3
  297. package/src/lib/shapes/arrow/arrowLabel.ts +8 -0
  298. package/src/lib/shapes/arrow/elbow/ElbowArrowDebug.tsx +3 -3
  299. package/src/lib/shapes/draw/DrawShapeTool.test.ts +0 -5
  300. package/src/lib/shapes/draw/DrawShapeUtil.tsx +4 -3
  301. package/src/lib/shapes/embed/EmbedShapeUtil.tsx +1 -1
  302. package/src/lib/shapes/frame/FrameShapeUtil.tsx +29 -14
  303. package/src/lib/shapes/frame/components/FrameHeading.tsx +1 -1
  304. package/src/lib/shapes/geo/GeoShapeUtil.tsx +3 -2
  305. package/src/lib/shapes/geo/components/GeoShapeBody.tsx +2 -2
  306. package/src/lib/shapes/highlight/HighlightShapeUtil.tsx +7 -1
  307. package/src/lib/shapes/image/ImageShapeUtil.tsx +6 -3
  308. package/src/lib/shapes/line/LineShapeUtil.test.tsx +4 -3
  309. package/src/lib/shapes/line/LineShapeUtil.tsx +6 -1
  310. package/src/lib/shapes/line/__snapshots__/LineShapeUtil.test.tsx.snap +2 -2
  311. package/src/lib/shapes/note/NoteShapeUtil.tsx +9 -4
  312. package/src/lib/shapes/shared/PlainTextLabel.tsx +0 -6
  313. package/src/lib/shapes/shared/ShapeFill.tsx +5 -4
  314. package/src/lib/shapes/shared/freehand/svg.ts +2 -0
  315. package/src/lib/shapes/shared/useEditablePlainText.ts +0 -6
  316. package/src/lib/shapes/shared/useImageOrVideoAsset.ts +0 -7
  317. package/src/lib/shapes/text/TextShapeTool.test.ts +6 -5
  318. package/src/lib/shapes/text/TextShapeUtil.tsx +3 -2
  319. package/src/lib/shapes/video/VideoShapeUtil.tsx +3 -3
  320. package/src/lib/tools/EraserTool/childStates/Erasing.ts +34 -1
  321. package/src/lib/tools/EraserTool/childStates/Pointing.ts +20 -0
  322. package/src/lib/tools/SelectTool/childStates/Translating.ts +0 -1
  323. package/src/lib/ui/TldrawUi.tsx +33 -12
  324. package/src/lib/ui/assetUrls.ts +13 -10
  325. package/src/lib/ui/components/ActionsMenu/DefaultActionsMenu.tsx +15 -3
  326. package/src/lib/ui/components/{FollowingIndicator.tsx → DefaultFollowingIndicator.tsx} +2 -1
  327. package/src/lib/ui/components/DefaultMenuPanel.tsx +4 -3
  328. package/src/lib/ui/components/KeyboardShortcutsDialog/DefaultKeyboardShortcutsDialogContent.tsx +6 -6
  329. package/src/lib/ui/components/Minimap/MinimapManager.ts +4 -4
  330. package/src/lib/ui/components/MobileStylePanel.tsx +9 -6
  331. package/src/lib/ui/components/NavigationPanel/DefaultNavigationPanel.tsx +1 -1
  332. package/src/lib/ui/components/PageMenu/DefaultPageMenu.tsx +3 -2
  333. package/src/lib/ui/components/SharePanel/PeopleMenuItem.tsx +4 -3
  334. package/src/lib/ui/components/SharePanel/UserPresenceColorPicker.tsx +3 -3
  335. package/src/lib/ui/components/StylePanel/DefaultStylePanel.tsx +27 -13
  336. package/src/lib/ui/components/StylePanel/DefaultStylePanelContent.tsx +260 -385
  337. package/src/lib/ui/components/{primitives/TldrawUiButtonPicker.tsx → StylePanel/StylePanelButtonPicker.tsx} +66 -50
  338. package/src/lib/ui/components/StylePanel/StylePanelContext.tsx +63 -0
  339. package/src/lib/ui/components/StylePanel/{DoubleDropdownPicker.tsx → StylePanelDoubleDropdownPicker.tsx} +31 -22
  340. package/src/lib/ui/components/StylePanel/StylePanelDropdownPicker.tsx +119 -0
  341. package/src/lib/ui/components/StylePanel/StylePanelSubheading.tsx +9 -0
  342. package/src/lib/ui/components/Toolbar/AltTextEditor.tsx +4 -3
  343. package/src/lib/ui/components/Toolbar/DefaultImageToolbarContent.tsx +33 -16
  344. package/src/lib/ui/components/Toolbar/DefaultToolbar.tsx +55 -23
  345. package/src/lib/ui/components/Toolbar/DefaultVideoToolbarContent.tsx +12 -4
  346. package/src/lib/ui/components/Toolbar/LinkEditor.tsx +5 -5
  347. package/src/lib/ui/components/Toolbar/OverflowingToolbar.tsx +212 -61
  348. package/src/lib/ui/components/Toolbar/ToggleToolLockedButton.tsx +2 -2
  349. package/src/lib/ui/components/primitives/TldrawUiContextualToolbar.tsx +6 -1
  350. package/src/lib/ui/components/primitives/TldrawUiPopover.tsx +4 -2
  351. package/src/lib/ui/components/primitives/TldrawUiSlider.tsx +50 -30
  352. package/src/lib/ui/components/primitives/TldrawUiToolbar.tsx +35 -9
  353. package/src/lib/ui/components/primitives/TldrawUiTooltip.tsx +203 -181
  354. package/src/lib/ui/components/primitives/layout.tsx +107 -0
  355. package/src/lib/ui/components/primitives/menus/TldrawUiMenuContext.tsx +0 -1
  356. package/src/lib/ui/components/primitives/menus/TldrawUiMenuGroup.tsx +29 -16
  357. package/src/lib/ui/components/primitives/menus/TldrawUiMenuItem.tsx +221 -19
  358. package/src/lib/ui/context/actions.tsx +23 -10
  359. package/src/lib/ui/context/components.tsx +3 -0
  360. package/src/lib/ui/context/events.tsx +2 -1
  361. package/src/lib/ui/hooks/useExportAs.ts +3 -2
  362. package/src/lib/ui/hooks/useTools.tsx +140 -10
  363. package/src/lib/ui/hooks/useTranslation/TLUiTranslationKey.ts +2 -0
  364. package/src/lib/ui/hooks/useTranslation/defaultTranslation.ts +2 -0
  365. package/src/lib/ui/kbd-utils.ts +10 -3
  366. package/src/lib/ui/version.ts +3 -3
  367. package/src/lib/ui.css +381 -306
  368. package/src/lib/utils/excalidraw/__snapshots__/putExcalidrawContent.test.tsx.snap +5 -5
  369. package/src/lib/utils/export/copyAs.ts +1 -24
  370. package/src/lib/utils/export/export.ts +0 -36
  371. package/src/lib/utils/export/exportAs.ts +1 -32
  372. package/src/lib/utils/tldr/__snapshots__/buildFromV1Document.test.ts.snap +4 -4
  373. package/src/test/A11y.test.tsx +3 -2
  374. package/src/test/ClickManager.test.ts +7 -6
  375. package/src/test/Editor.test.tsx +20 -19
  376. package/src/test/EraserTool.test.ts +184 -13
  377. package/src/test/HandTool.test.ts +10 -9
  378. package/src/test/HighlightShape.test.ts +2 -1
  379. package/src/test/SelectTool.test.ts +3 -2
  380. package/src/test/TLUserPreferences.test.ts +4 -3
  381. package/src/test/TestEditor.ts +13 -15
  382. package/src/test/TldrawEditor.test.tsx +11 -10
  383. package/src/test/ZoomTool.test.ts +7 -6
  384. package/src/test/__snapshots__/drawing.test.ts.snap +2 -2
  385. package/src/test/__snapshots__/groups.test.tsx.snap +6 -6
  386. package/src/test/__snapshots__/resizing.test.ts.snap +2 -2
  387. package/src/test/arrows-megabus.test.tsx +5 -4
  388. package/src/test/bindings.test.tsx +24 -37
  389. package/src/test/bookmark-shapes.test.ts +1 -8
  390. package/src/test/commands/__snapshots__/getSvgString.test.ts.snap +23 -7
  391. package/src/test/commands/__snapshots__/packShapes.test.ts.snap +8 -8
  392. package/src/test/commands/__snapshots__/zoomToFit.test.ts.snap +2 -2
  393. package/src/test/commands/alignShapes.test.tsx +25 -24
  394. package/src/test/commands/animationSpeed.test.ts +2 -1
  395. package/src/test/commands/centerOnPoint.test.ts +3 -2
  396. package/src/test/commands/clipboard.test.ts +3 -2
  397. package/src/test/commands/createShapes.test.ts +2 -1
  398. package/src/test/commands/deleteShapes.test.ts +2 -1
  399. package/src/test/commands/distributeShapes.test.tsx +11 -10
  400. package/src/test/commands/getSvgString.test.ts +2 -1
  401. package/src/test/commands/packShapes.test.ts +5 -4
  402. package/src/test/commands/resizeShape.test.ts +2 -1
  403. package/src/test/commands/rotateShapes.test.ts +7 -6
  404. package/src/test/commands/setCamera.test.ts +4 -3
  405. package/src/test/commands/setCurrentPage.test.ts +3 -2
  406. package/src/test/commands/stackShapes.test.ts +11 -10
  407. package/src/test/commands/stretch.test.tsx +13 -12
  408. package/src/test/createDeepLink.test.tsx +2 -1
  409. package/src/test/cropping.test.ts +3 -2
  410. package/src/test/custom-clipping.test.ts +436 -0
  411. package/src/test/drawing.test.ts +2 -1
  412. package/src/test/flipShapes.test.ts +4 -3
  413. package/src/test/frames.test.ts +25 -24
  414. package/src/test/getCulledShapes.test.tsx +3 -2
  415. package/src/test/groups.test.tsx +1 -1
  416. package/src/test/handleDeepLink.test.tsx +2 -1
  417. package/src/test/maxShapes.test.ts +3 -2
  418. package/src/test/modifiers.test.ts +5 -4
  419. package/src/test/navigation.test.ts +12 -11
  420. package/src/test/panning.test.ts +2 -1
  421. package/src/test/perf/perf.test.ts +2 -1
  422. package/src/test/registerDeepLinkListener.test.tsx +10 -9
  423. package/src/test/resizing.test.ts +39 -38
  424. package/src/test/select.test.tsx +4 -3
  425. package/src/test/selection-omnibus.test.ts +11 -10
  426. package/src/test/shapeutils.test.ts +4 -3
  427. package/src/test/translating.test.ts +9 -8
  428. package/tldraw.css +682 -596
  429. package/dist-cjs/lib/ui/components/FollowingIndicator.js.map +0 -7
  430. package/dist-cjs/lib/ui/components/StylePanel/DoubleDropdownPicker.js.map +0 -7
  431. package/dist-cjs/lib/ui/components/StylePanel/DropdownPicker.js.map +0 -7
  432. package/dist-cjs/lib/ui/components/primitives/TldrawUiButtonPicker.js.map +0 -7
  433. package/dist-esm/lib/ui/components/FollowingIndicator.mjs.map +0 -7
  434. package/dist-esm/lib/ui/components/StylePanel/DoubleDropdownPicker.mjs.map +0 -7
  435. package/dist-esm/lib/ui/components/StylePanel/DropdownPicker.mjs.map +0 -7
  436. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs +0 -115
  437. package/dist-esm/lib/ui/components/primitives/TldrawUiButtonPicker.mjs.map +0 -7
  438. package/src/lib/ui/components/StylePanel/DropdownPicker.tsx +0 -109
@@ -12,421 +12,333 @@ import {
12
12
  DefaultVerticalAlignStyle,
13
13
  GeoShapeGeoStyle,
14
14
  LineShapeSplineStyle,
15
- ReadonlySharedStyleMap,
16
- StyleProp,
17
15
  TLArrowShapeArrowheadStyle,
18
- TLDefaultColorTheme,
19
- getDefaultColorTheme,
20
16
  kickoutOccludedShapes,
21
17
  minBy,
22
18
  useEditor,
23
- useIsDarkMode,
24
19
  useValue,
25
20
  } from '@tldraw/editor'
26
- import React, { useCallback } from 'react'
21
+ import React from 'react'
27
22
  import { STYLES } from '../../../styles'
28
23
  import { useUiEvents } from '../../context/events'
29
- import { useRelevantStyles } from '../../hooks/useRelevantStyles'
30
24
  import { useTranslation } from '../../hooks/useTranslation/useTranslation'
31
25
  import { TldrawUiButtonIcon } from '../primitives/Button/TldrawUiButtonIcon'
32
- import { TldrawUiButtonPicker } from '../primitives/TldrawUiButtonPicker'
33
26
  import { TldrawUiSlider } from '../primitives/TldrawUiSlider'
34
27
  import { TldrawUiToolbar, TldrawUiToolbarButton } from '../primitives/TldrawUiToolbar'
35
- import { DoubleDropdownPicker } from './DoubleDropdownPicker'
36
- import { DropdownPicker } from './DropdownPicker'
28
+ import { StylePanelButtonPicker } from './StylePanelButtonPicker'
29
+ import { useStylePanelContext } from './StylePanelContext'
30
+ import { StylePanelDoubleDropdownPicker } from './StylePanelDoubleDropdownPicker'
31
+ import { StylePanelDropdownPicker } from './StylePanelDropdownPicker'
32
+ import { StylePanelSubheading } from './StylePanelSubheading'
37
33
 
38
- // Local component for style panel subheadings
39
- function StylePanelSubheading({ children }: { children: React.ReactNode }) {
40
- return <h3 className="tlui-style-panel__subheading">{children}</h3>
34
+ /** @public @react */
35
+ export function DefaultStylePanelContent() {
36
+ return (
37
+ <>
38
+ <StylePanelSection>
39
+ <StylePanelColorPicker />
40
+ <StylePanelOpacityPicker />
41
+ </StylePanelSection>
42
+ <StylePanelSection>
43
+ <StylePanelFillPicker />
44
+ <StylePanelDashPicker />
45
+ <StylePanelSizePicker />
46
+ </StylePanelSection>
47
+ <StylePanelSection>
48
+ <StylePanelFontPicker />
49
+ <StylePanelTextAlignPicker />
50
+ <StylePanelLabelAlignPicker />
51
+ </StylePanelSection>
52
+ <StylePanelSection>
53
+ <StylePanelGeoShapePicker />
54
+ <StylePanelArrowKindPicker />
55
+ <StylePanelArrowheadPicker />
56
+ <StylePanelSplinePicker />
57
+ </StylePanelSection>
58
+ </>
59
+ )
41
60
  }
42
61
 
43
62
  /** @public */
44
- export interface TLUiStylePanelContentProps {
45
- styles: ReturnType<typeof useRelevantStyles>
63
+ export interface StylePanelSectionProps {
64
+ children: React.ReactNode
46
65
  }
47
66
 
48
67
  /** @public @react */
49
- export function DefaultStylePanelContent({ styles }: TLUiStylePanelContentProps) {
50
- const isDarkMode = useIsDarkMode()
51
-
52
- if (!styles) return null
53
-
54
- const geo = styles.get(GeoShapeGeoStyle)
55
- const arrowheadEnd = styles.get(ArrowShapeArrowheadEndStyle)
56
- const arrowheadStart = styles.get(ArrowShapeArrowheadStartStyle)
57
- const arrowKind = styles.get(ArrowShapeKindStyle)
58
- const spline = styles.get(LineShapeSplineStyle)
59
- const font = styles.get(DefaultFontStyle)
60
-
61
- const hideGeo = geo === undefined
62
- const hideArrowHeads = arrowheadEnd === undefined && arrowheadStart === undefined
63
- const hideSpline = spline === undefined
64
- const hideArrowKind = arrowKind === undefined
65
- const hideText = font === undefined
68
+ export function StylePanelSection({ children }: StylePanelSectionProps) {
69
+ return <div className="tlui-style-panel__section">{children}</div>
70
+ }
66
71
 
67
- const theme = getDefaultColorTheme({ isDarkMode: isDarkMode })
72
+ /** @public @react */
73
+ export function StylePanelColorPicker() {
74
+ const { styles } = useStylePanelContext()
75
+ const msg = useTranslation()
76
+ const color = styles.get(DefaultColorStyle)
77
+ if (color === undefined) return null
68
78
 
69
79
  return (
70
- <>
71
- <CommonStylePickerSet theme={theme} styles={styles} />
72
- {!hideText && <TextStylePickerSet theme={theme} styles={styles} />}
73
- {!(hideGeo && hideArrowHeads && hideSpline && hideArrowKind) && (
74
- <div className="tlui-style-panel__section">
75
- <GeoStylePickerSet styles={styles} />
76
- <ArrowStylePickerSet styles={styles} />
77
- <ArrowheadStylePickerSet styles={styles} />
78
- <SplineStylePickerSet styles={styles} />
79
- </div>
80
- )}
81
- </>
80
+ <StylePanelButtonPicker
81
+ title={msg('style-panel.color')}
82
+ uiType="color"
83
+ style={DefaultColorStyle}
84
+ items={STYLES.color}
85
+ value={color}
86
+ />
82
87
  )
83
88
  }
84
89
 
85
- function useStyleChangeCallback() {
90
+ const tldrawSupportedOpacities = [0.1, 0.25, 0.5, 0.75, 1] as const
91
+ /** @public @react */
92
+ export function StylePanelOpacityPicker() {
86
93
  const editor = useEditor()
94
+ const { onHistoryMark, showUiLabels } = useStylePanelContext()
95
+
96
+ const opacity = useValue('opacity', () => editor.getSharedOpacity(), [editor])
87
97
  const trackEvent = useUiEvents()
98
+ const msg = useTranslation()
99
+
100
+ const handleOpacityValueChange = React.useCallback(
101
+ (value: number) => {
102
+ const item = tldrawSupportedOpacities[value]
103
+ editor.run(() => {
104
+ if (editor.isIn('select')) {
105
+ editor.setOpacityForSelectedShapes(item)
106
+ }
107
+ editor.setOpacityForNextShapes(item)
108
+ editor.updateInstanceState({ isChangingStyle: true })
109
+ })
88
110
 
89
- return React.useMemo(
90
- () =>
91
- function handleStyleChange<T>(style: StyleProp<T>, value: T) {
92
- editor.run(() => {
93
- if (editor.isIn('select')) {
94
- editor.setStyleForSelectedShapes(style, value)
95
- }
96
- editor.setStyleForNextShapes(style, value)
97
- editor.updateInstanceState({ isChangingStyle: true })
98
- })
99
-
100
- trackEvent('set-style', { source: 'style-panel', id: style.id, value: value as string })
101
- },
111
+ trackEvent('set-style', { source: 'style-panel', id: 'opacity', value })
112
+ },
102
113
  [editor, trackEvent]
103
114
  )
104
- }
105
115
 
106
- /** @public */
107
- export interface ThemeStylePickerSetProps {
108
- styles: ReadonlySharedStyleMap
109
- theme: TLDefaultColorTheme
110
- }
116
+ if (opacity === undefined) return null
111
117
 
112
- /** @public */
113
- export interface StylePickerSetProps {
114
- styles: ReadonlySharedStyleMap
118
+ const opacityIndex =
119
+ opacity.type === 'mixed'
120
+ ? -1
121
+ : tldrawSupportedOpacities.indexOf(
122
+ minBy(tldrawSupportedOpacities, (supportedOpacity) =>
123
+ Math.abs(supportedOpacity - opacity.value)
124
+ )!
125
+ )
126
+
127
+ return (
128
+ <>
129
+ {showUiLabels && <StylePanelSubheading>{msg('style-panel.opacity')}</StylePanelSubheading>}
130
+ <TldrawUiSlider
131
+ data-testid="style.opacity"
132
+ value={opacityIndex >= 0 ? opacityIndex : tldrawSupportedOpacities.length - 1}
133
+ label={opacity.type === 'mixed' ? 'style-panel.mixed' : `opacity-style.${opacity.value}`}
134
+ onValueChange={handleOpacityValueChange}
135
+ steps={tldrawSupportedOpacities.length - 1}
136
+ title={msg('style-panel.opacity')}
137
+ onHistoryMark={onHistoryMark}
138
+ ariaValueModifier={25}
139
+ />
140
+ </>
141
+ )
115
142
  }
116
143
 
117
144
  /** @public @react */
118
- export function CommonStylePickerSet({ styles, theme }: ThemeStylePickerSetProps) {
145
+ export function StylePanelFillPicker() {
146
+ const { styles } = useStylePanelContext()
119
147
  const msg = useTranslation()
120
- const editor = useEditor()
121
-
122
- const onHistoryMark = useCallback((id: string) => editor.markHistoryStoppingPoint(id), [editor])
123
- const showUiLabels = useValue('showUiLabels', () => editor.user.getShowUiLabels(), [editor])
148
+ const fill = styles.get(DefaultFillStyle)
149
+ if (fill === undefined) return null
124
150
 
125
- const handleValueChange = useStyleChangeCallback()
151
+ return (
152
+ <StylePanelButtonPicker
153
+ title={msg('style-panel.fill')}
154
+ uiType="fill"
155
+ style={DefaultFillStyle}
156
+ items={STYLES.fill}
157
+ value={fill}
158
+ />
159
+ )
160
+ }
126
161
 
127
- const color = styles.get(DefaultColorStyle)
128
- const fill = styles.get(DefaultFillStyle)
162
+ /** @public @react */
163
+ export function StylePanelDashPicker() {
164
+ const { styles } = useStylePanelContext()
165
+ const msg = useTranslation()
129
166
  const dash = styles.get(DefaultDashStyle)
130
- const size = styles.get(DefaultSizeStyle)
131
-
132
- const showPickers = fill !== undefined || dash !== undefined || size !== undefined
167
+ if (dash === undefined) return null
133
168
 
134
169
  return (
135
- <>
136
- <div className="tlui-style-panel__section__common" data-testid="style.panel">
137
- {color === undefined ? null : (
138
- <>
139
- {showUiLabels && (
140
- <StylePanelSubheading>{msg('style-panel.color')}</StylePanelSubheading>
141
- )}
142
- <TldrawUiToolbar label={msg('style-panel.color')}>
143
- <TldrawUiButtonPicker
144
- title={msg('style-panel.color')}
145
- uiType="color"
146
- style={DefaultColorStyle}
147
- items={STYLES.color}
148
- value={color}
149
- onValueChange={handleValueChange}
150
- theme={theme}
151
- onHistoryMark={onHistoryMark}
152
- />
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 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
- </>
178
- )}
179
- {dash === undefined ? null : (
180
- <>
181
- {showUiLabels && (
182
- <StylePanelSubheading>{msg('style-panel.dash')}</StylePanelSubheading>
183
- )}
184
- <TldrawUiToolbar 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
- </>
197
- )}
198
- {size === undefined ? null : (
199
- <>
200
- {showUiLabels && (
201
- <StylePanelSubheading>{msg('style-panel.size')}</StylePanelSubheading>
202
- )}
203
- <TldrawUiToolbar 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
- </>
222
- )}
223
- </div>
224
- )}
225
- </>
170
+ <StylePanelButtonPicker
171
+ title={msg('style-panel.dash')}
172
+ uiType="dash"
173
+ style={DefaultDashStyle}
174
+ items={STYLES.dash}
175
+ value={dash}
176
+ />
226
177
  )
227
178
  }
228
179
 
229
180
  /** @public @react */
230
- export function TextStylePickerSet({ theme, styles }: ThemeStylePickerSetProps) {
181
+ export function StylePanelSizePicker() {
182
+ const editor = useEditor()
183
+ const { styles, onValueChange } = useStylePanelContext()
231
184
  const msg = useTranslation()
232
- const handleValueChange = useStyleChangeCallback()
185
+ const size = styles.get(DefaultSizeStyle)
186
+ if (size === undefined) return null
233
187
 
234
- const editor = useEditor()
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')
188
+ return (
189
+ <StylePanelButtonPicker
190
+ title={msg('style-panel.size')}
191
+ uiType="size"
192
+ style={DefaultSizeStyle}
193
+ items={STYLES.size}
194
+ value={size}
195
+ onValueChange={(style, value) => {
196
+ onValueChange(style, value)
197
+ const selectedShapeIds = editor.getSelectedShapeIds()
198
+ if (selectedShapeIds.length > 0) {
199
+ kickoutOccludedShapes(editor, selectedShapeIds)
200
+ }
201
+ }}
202
+ />
203
+ )
204
+ }
238
205
 
206
+ /** @public @react */
207
+ export function StylePanelFontPicker() {
208
+ const { styles } = useStylePanelContext()
209
+ const msg = useTranslation()
239
210
  const font = styles.get(DefaultFontStyle)
240
- const textAlign = styles.get(DefaultTextAlignStyle)
241
- const labelAlign = styles.get(DefaultHorizontalAlignStyle)
242
- const verticalLabelAlign = styles.get(DefaultVerticalAlignStyle)
243
- if (font === undefined && labelAlign === undefined) {
244
- return null
245
- }
211
+ if (font === undefined) return null
246
212
 
247
213
  return (
248
- <div className="tlui-style-panel__section">
249
- {font === undefined ? null : (
250
- <>
251
- {labelStr && <StylePanelSubheading>{labelStr}</StylePanelSubheading>}
252
- <TldrawUiToolbar 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
- </>
265
- )}
266
-
267
- {textAlign === undefined ? null : (
268
- <>
269
- {showUiLabels && <StylePanelSubheading>{msg('style-panel.align')}</StylePanelSubheading>}
270
- <TldrawUiToolbar label={msg('style-panel.align')} className="tlui-style-panel__row">
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
- />
281
- <div className="tlui-style-panel__row__extra-button">
282
- <TldrawUiToolbarButton
283
- type="icon"
284
- title={msg('style-panel.vertical-align')}
285
- data-testid="vertical-align"
286
- disabled
287
- >
288
- <TldrawUiButtonIcon icon="vertical-align-middle" />
289
- </TldrawUiToolbarButton>
290
- </div>
291
- </TldrawUiToolbar>
292
- </>
293
- )}
294
-
295
- {labelAlign === undefined ? null : (
296
- <>
297
- {showUiLabels && (
298
- <StylePanelSubheading>{msg('style-panel.label-align')}</StylePanelSubheading>
299
- )}
300
- <TldrawUiToolbar label={msg('style-panel.label-align')} className="tlui-style-panel__row">
301
- <TldrawUiButtonPicker
302
- title={msg('style-panel.label-align')}
303
- uiType="align"
304
- style={DefaultHorizontalAlignStyle}
305
- items={STYLES.horizontalAlign}
306
- value={labelAlign}
307
- onValueChange={handleValueChange}
308
- theme={theme}
309
- onHistoryMark={onHistoryMark}
310
- />
311
- <div className="tlui-style-panel__row__extra-button">
312
- {verticalLabelAlign === undefined ? (
313
- <TldrawUiToolbarButton
314
- type="icon"
315
- title={msg('style-panel.vertical-align')}
316
- data-testid="vertical-align"
317
- disabled
318
- >
319
- <TldrawUiButtonIcon icon="vertical-align-middle" />
320
- </TldrawUiToolbarButton>
321
- ) : (
322
- <DropdownPicker
323
- type="icon"
324
- id="geo-vertical-alignment"
325
- uiType="verticalAlign"
326
- stylePanelType="vertical-align"
327
- style={DefaultVerticalAlignStyle}
328
- items={STYLES.verticalAlign}
329
- value={verticalLabelAlign}
330
- onValueChange={handleValueChange}
331
- />
332
- )}
333
- </div>
334
- </TldrawUiToolbar>
335
- </>
336
- )}
337
- </div>
214
+ <StylePanelButtonPicker
215
+ title={msg('style-panel.font')}
216
+ uiType="font"
217
+ style={DefaultFontStyle}
218
+ items={STYLES.font}
219
+ value={font}
220
+ />
338
221
  )
339
222
  }
223
+
340
224
  /** @public @react */
341
- export function GeoStylePickerSet({ styles }: StylePickerSetProps) {
225
+ export function StylePanelTextAlignPicker() {
226
+ const { styles } = useStylePanelContext()
342
227
  const msg = useTranslation()
343
- const handleValueChange = useStyleChangeCallback()
344
-
345
- const geo = styles.get(GeoShapeGeoStyle)
346
- if (geo === undefined) {
347
- return null
348
- }
228
+ const textAlign = styles.get(DefaultTextAlignStyle)
229
+ if (textAlign === undefined) return null
349
230
 
350
231
  return (
351
- <TldrawUiToolbar label={msg('style-panel.geo')}>
352
- <DropdownPicker
353
- id="geo"
354
- type="menu"
355
- label={'style-panel.geo'}
356
- uiType="geo"
357
- stylePanelType="geo"
358
- style={GeoShapeGeoStyle}
359
- items={STYLES.geo}
360
- value={geo}
361
- onValueChange={handleValueChange}
232
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.align')}>
233
+ <StylePanelButtonPicker
234
+ title={msg('style-panel.align')}
235
+ uiType="align"
236
+ style={DefaultTextAlignStyle}
237
+ items={STYLES.textAlign}
238
+ value={textAlign}
362
239
  />
240
+ <TldrawUiToolbarButton
241
+ type="icon"
242
+ title={msg('style-panel.vertical-align')}
243
+ data-testid="vertical-align"
244
+ disabled
245
+ >
246
+ <TldrawUiButtonIcon icon="vertical-align-middle" />
247
+ </TldrawUiToolbarButton>
363
248
  </TldrawUiToolbar>
364
249
  )
365
250
  }
251
+
366
252
  /** @public @react */
367
- export function SplineStylePickerSet({ styles }: StylePickerSetProps) {
253
+ export function StylePanelLabelAlignPicker() {
254
+ const { styles } = useStylePanelContext()
368
255
  const msg = useTranslation()
369
- const handleValueChange = useStyleChangeCallback()
370
-
371
- const spline = styles.get(LineShapeSplineStyle)
372
- if (spline === undefined) {
373
- return null
374
- }
256
+ const labelAlign = styles.get(DefaultHorizontalAlignStyle)
257
+ const verticalLabelAlign = styles.get(DefaultVerticalAlignStyle)
258
+ if (labelAlign === undefined) return null
375
259
 
376
260
  return (
377
- <TldrawUiToolbar label={msg('style-panel.spline')}>
378
- <DropdownPicker
379
- id="spline"
380
- type="menu"
381
- label={'style-panel.spline'}
382
- uiType="spline"
383
- stylePanelType="spline"
384
- style={LineShapeSplineStyle}
385
- items={STYLES.spline}
386
- value={spline}
387
- onValueChange={handleValueChange}
261
+ <TldrawUiToolbar orientation="horizontal" label={msg('style-panel.label-align')}>
262
+ <StylePanelButtonPicker
263
+ title={msg('style-panel.label-align')}
264
+ uiType="align"
265
+ style={DefaultHorizontalAlignStyle}
266
+ items={STYLES.horizontalAlign}
267
+ value={labelAlign}
388
268
  />
269
+ {verticalLabelAlign === undefined ? (
270
+ <TldrawUiToolbarButton
271
+ type="icon"
272
+ title={msg('style-panel.vertical-align')}
273
+ data-testid="vertical-align"
274
+ disabled
275
+ >
276
+ <TldrawUiButtonIcon icon="vertical-align-middle" />
277
+ </TldrawUiToolbarButton>
278
+ ) : (
279
+ <StylePanelDropdownPicker
280
+ type="icon"
281
+ id="geo-vertical-alignment"
282
+ uiType="verticalAlign"
283
+ stylePanelType="vertical-align"
284
+ style={DefaultVerticalAlignStyle}
285
+ items={STYLES.verticalAlign}
286
+ value={verticalLabelAlign}
287
+ />
288
+ )}
389
289
  </TldrawUiToolbar>
390
290
  )
391
291
  }
292
+
392
293
  /** @public @react */
393
- export function ArrowStylePickerSet({ styles }: StylePickerSetProps) {
394
- const msg = useTranslation()
395
- const handleValueChange = useStyleChangeCallback()
294
+ export function StylePanelGeoShapePicker() {
295
+ const { styles } = useStylePanelContext()
296
+ const geo = styles.get(GeoShapeGeoStyle)
297
+ if (geo === undefined) return null
298
+
299
+ return (
300
+ <StylePanelDropdownPicker
301
+ label="style-panel.geo"
302
+ type="menu"
303
+ id="geo"
304
+ uiType="geo"
305
+ stylePanelType="geo"
306
+ style={GeoShapeGeoStyle}
307
+ items={STYLES.geo}
308
+ value={geo}
309
+ />
310
+ )
311
+ }
396
312
 
313
+ /** @public @react */
314
+ export function StylePanelArrowKindPicker() {
315
+ const { styles } = useStylePanelContext()
397
316
  const arrowKind = styles.get(ArrowShapeKindStyle)
398
- if (arrowKind === undefined) {
399
- return null
400
- }
317
+ if (arrowKind === undefined) return null
401
318
 
402
319
  return (
403
- <TldrawUiToolbar label={msg('style-panel.arrow-kind')}>
404
- <DropdownPicker
405
- id="arrow-kind"
406
- type="menu"
407
- label={'style-panel.arrow-kind'}
408
- uiType="arrow-kind"
409
- stylePanelType="arrow-kind"
410
- style={ArrowShapeKindStyle}
411
- items={STYLES.arrowKind}
412
- value={arrowKind}
413
- onValueChange={handleValueChange}
414
- />
415
- </TldrawUiToolbar>
320
+ <StylePanelDropdownPicker
321
+ id="arrow-kind"
322
+ type="menu"
323
+ label={'style-panel.arrow-kind'}
324
+ uiType="arrow-kind"
325
+ stylePanelType="arrow-kind"
326
+ style={ArrowShapeKindStyle}
327
+ items={STYLES.arrowKind}
328
+ value={arrowKind}
329
+ />
416
330
  )
417
331
  }
418
- /** @public @react */
419
- export function ArrowheadStylePickerSet({ styles }: StylePickerSetProps) {
420
- const handleValueChange = useStyleChangeCallback()
421
332
 
333
+ /** @public @react */
334
+ export function StylePanelArrowheadPicker() {
335
+ const { styles } = useStylePanelContext()
422
336
  const arrowheadEnd = styles.get(ArrowShapeArrowheadEndStyle)
423
337
  const arrowheadStart = styles.get(ArrowShapeArrowheadStartStyle)
424
- if (!arrowheadEnd || !arrowheadStart) {
425
- return null
426
- }
338
+ if (arrowheadEnd === undefined || arrowheadStart === undefined) return null
427
339
 
428
340
  return (
429
- <DoubleDropdownPicker<TLArrowShapeArrowheadStyle>
341
+ <StylePanelDoubleDropdownPicker<TLArrowShapeArrowheadStyle>
430
342
  label={'style-panel.arrowheads'}
431
343
  uiTypeA="arrowheadStart"
432
344
  styleA={ArrowShapeArrowheadStartStyle}
@@ -436,65 +348,28 @@ export function ArrowheadStylePickerSet({ styles }: StylePickerSetProps) {
436
348
  styleB={ArrowShapeArrowheadEndStyle}
437
349
  itemsB={STYLES.arrowheadEnd}
438
350
  valueB={arrowheadEnd}
439
- onValueChange={handleValueChange}
440
351
  labelA="style-panel.arrowhead-start"
441
352
  labelB="style-panel.arrowhead-end"
442
353
  />
443
354
  )
444
355
  }
445
356
 
446
- const tldrawSupportedOpacities = [0.1, 0.25, 0.5, 0.75, 1] as const
447
357
  /** @public @react */
448
- export function OpacitySlider() {
449
- const editor = useEditor()
450
-
451
- const onHistoryMark = useCallback((id: string) => editor.markHistoryStoppingPoint(id), [editor])
452
- const showUiLabels = useValue('showUiLabels', () => editor.user.getShowUiLabels(), [editor])
453
-
454
- const opacity = useValue('opacity', () => editor.getSharedOpacity(), [editor])
455
- const trackEvent = useUiEvents()
456
- const msg = useTranslation()
457
-
458
- const handleOpacityValueChange = React.useCallback(
459
- (value: number) => {
460
- const item = tldrawSupportedOpacities[value]
461
- editor.run(() => {
462
- if (editor.isIn('select')) {
463
- editor.setOpacityForSelectedShapes(item)
464
- }
465
- editor.setOpacityForNextShapes(item)
466
- editor.updateInstanceState({ isChangingStyle: true })
467
- })
468
-
469
- trackEvent('set-style', { source: 'style-panel', id: 'opacity', value })
470
- },
471
- [editor, trackEvent]
472
- )
473
-
474
- if (opacity === undefined) return null
475
-
476
- const opacityIndex =
477
- opacity.type === 'mixed'
478
- ? -1
479
- : tldrawSupportedOpacities.indexOf(
480
- minBy(tldrawSupportedOpacities, (supportedOpacity) =>
481
- Math.abs(supportedOpacity - opacity.value)
482
- )!
483
- )
358
+ export function StylePanelSplinePicker() {
359
+ const { styles } = useStylePanelContext()
360
+ const spline = styles.get(LineShapeSplineStyle)
361
+ if (spline === undefined) return null
484
362
 
485
363
  return (
486
- <>
487
- {showUiLabels && <StylePanelSubheading>{msg('style-panel.opacity')}</StylePanelSubheading>}
488
- <TldrawUiSlider
489
- data-testid="style.opacity"
490
- value={opacityIndex >= 0 ? opacityIndex : tldrawSupportedOpacities.length - 1}
491
- label={opacity.type === 'mixed' ? 'style-panel.mixed' : `opacity-style.${opacity.value}`}
492
- onValueChange={handleOpacityValueChange}
493
- steps={tldrawSupportedOpacities.length - 1}
494
- title={msg('style-panel.opacity')}
495
- onHistoryMark={onHistoryMark}
496
- ariaValueModifier={25}
497
- />
498
- </>
364
+ <StylePanelDropdownPicker
365
+ type="menu"
366
+ id="spline"
367
+ uiType="spline"
368
+ stylePanelType="spline"
369
+ label="style-panel.spline"
370
+ style={LineShapeSplineStyle}
371
+ items={STYLES.spline}
372
+ value={spline}
373
+ />
499
374
  )
500
375
  }