|
@@ -1,9 +1,12 @@
|
|
|
import { useApp } from '@tldraw/react'
|
|
|
-import { MOD_KEY } from '@tldraw/core'
|
|
|
+import { MOD_KEY, AlignType, DistributeType } from '@tldraw/core'
|
|
|
import { observer } from 'mobx-react-lite'
|
|
|
+import { TablerIcon } from '../icons'
|
|
|
+import { Button } from '../Button'
|
|
|
import * as React from 'react'
|
|
|
|
|
|
import * as ReactContextMenu from '@radix-ui/react-context-menu'
|
|
|
+import * as Separator from '@radix-ui/react-separator'
|
|
|
|
|
|
const preventDefault = (e: Event) => e.stopPropagation()
|
|
|
|
|
@@ -28,7 +31,7 @@ export const ContextMenu = observer(function ContextMenu({
|
|
|
<ReactContextMenu.Root>
|
|
|
<ReactContextMenu.Trigger>{children}</ReactContextMenu.Trigger>
|
|
|
<ReactContextMenu.Content
|
|
|
- className="tl-context-menu"
|
|
|
+ className="tl-menu tl-context-menu"
|
|
|
ref={rContent}
|
|
|
onEscapeKeyDown={() => app.transition('select')}
|
|
|
collisionBoundary={collisionRef.current}
|
|
@@ -36,25 +39,84 @@ export const ContextMenu = observer(function ContextMenu({
|
|
|
tabIndex={-1}
|
|
|
>
|
|
|
<div>
|
|
|
+ {app.selectedShapes?.size > 1 && (
|
|
|
+ <ReactContextMenu.Item>
|
|
|
+ <div className="tl-menu-button-row pb-0">
|
|
|
+ <Button
|
|
|
+ title="Align left"
|
|
|
+ onClick={() => runAndTransition(() => app.align(AlignType.Left))}
|
|
|
+ >
|
|
|
+ <TablerIcon name="layout-align-left" />
|
|
|
+ </Button>
|
|
|
+ <Button
|
|
|
+ title="Align center horizontally"
|
|
|
+ onClick={() => runAndTransition(() => app.align(AlignType.CenterHorizontal))}
|
|
|
+ >
|
|
|
+ <TablerIcon name="layout-align-center" />
|
|
|
+ </Button>
|
|
|
+ <Button
|
|
|
+ title="Align right"
|
|
|
+ onClick={() => runAndTransition(() => app.align(AlignType.Right))}
|
|
|
+ >
|
|
|
+ <TablerIcon name="layout-align-right" />
|
|
|
+ </Button>
|
|
|
+ <Separator.Root className="tl-toolbar-separator" orientation="vertical" />
|
|
|
+ <Button
|
|
|
+ title="Distribute horizontally"
|
|
|
+ onClick={() => runAndTransition(() => app.distribute(DistributeType.Horizontal))}
|
|
|
+ >
|
|
|
+ <TablerIcon name="layout-distribute-vertical" />
|
|
|
+ </Button>
|
|
|
+ </div>
|
|
|
+ <div className="tl-menu-button-row pt-0">
|
|
|
+ <Button
|
|
|
+ title="Align top"
|
|
|
+ onClick={() => runAndTransition(() => app.align(AlignType.Top))}
|
|
|
+ >
|
|
|
+ <TablerIcon name="layout-align-top" />
|
|
|
+ </Button>
|
|
|
+ <Button
|
|
|
+ title="Align center vertically"
|
|
|
+ onClick={() => runAndTransition(() => app.align(AlignType.CenterVertical))}
|
|
|
+ >
|
|
|
+ <TablerIcon name="layout-align-middle" />
|
|
|
+ </Button>
|
|
|
+ <Button
|
|
|
+ title="Align bottom"
|
|
|
+ onClick={() => runAndTransition(() => app.align(AlignType.Bottom))}
|
|
|
+ >
|
|
|
+ <TablerIcon name="layout-align-bottom" />
|
|
|
+ </Button>
|
|
|
+ <Separator.Root className="tl-toolbar-separator" orientation="vertical" />
|
|
|
+ <Button
|
|
|
+ title="Distribute vertically"
|
|
|
+ onClick={() => runAndTransition(() => app.distribute(DistributeType.Vertical))}
|
|
|
+ >
|
|
|
+ <TablerIcon name="layout-distribute-horizontal" />
|
|
|
+ </Button>
|
|
|
+ </div>
|
|
|
+ <ReactContextMenu.Separator className="menu-separator" />
|
|
|
+ </ReactContextMenu.Item>
|
|
|
+ )}
|
|
|
{app.selectedShapes?.size > 0 && (
|
|
|
<>
|
|
|
<ReactContextMenu.Item
|
|
|
- className="tl-context-menu-button"
|
|
|
+ className="tl-menu-item"
|
|
|
onClick={() => runAndTransition(app.cut)}
|
|
|
>
|
|
|
Cut
|
|
|
- <div className="tl-context-menu-right-slot">
|
|
|
+ <div className="tl-menu-right-slot">
|
|
|
<span className="keyboard-shortcut">
|
|
|
<code>{MOD_KEY}</code> <code>X</code>
|
|
|
</span>
|
|
|
</div>
|
|
|
</ReactContextMenu.Item>
|
|
|
<ReactContextMenu.Item
|
|
|
- className="tl-context-menu-button"
|
|
|
+ className="tl-menu-item"
|
|
|
onClick={() => runAndTransition(app.copy)}
|
|
|
>
|
|
|
Copy
|
|
|
- <div className="tl-context-menu-right-slot">
|
|
|
+ <div className="tl-menu-right-slot">
|
|
|
<span className="keyboard-shortcut">
|
|
|
<code>{MOD_KEY}</code> <code>C</code>
|
|
|
</span>
|
|
@@ -63,11 +125,11 @@ export const ContextMenu = observer(function ContextMenu({
|
|
|
</>
|
|
|
)}
|
|
|
<ReactContextMenu.Item
|
|
|
- className="tl-context-menu-button"
|
|
|
+ className="tl-menu-item"
|
|
|
onClick={() => runAndTransition(app.paste)}
|
|
|
>
|
|
|
Paste
|
|
|
- <div className="tl-context-menu-right-slot">
|
|
|
+ <div className="tl-menu-right-slot">
|
|
|
<span className="keyboard-shortcut">
|
|
|
<code>{MOD_KEY}</code> <code>V</code>
|
|
|
</span>
|
|
@@ -75,11 +137,11 @@ export const ContextMenu = observer(function ContextMenu({
|
|
|
</ReactContextMenu.Item>
|
|
|
<ReactContextMenu.Separator className="menu-separator" />
|
|
|
<ReactContextMenu.Item
|
|
|
- className="tl-context-menu-button"
|
|
|
+ className="tl-menu-item"
|
|
|
onClick={() => runAndTransition(app.api.selectAll)}
|
|
|
>
|
|
|
Select all
|
|
|
- <div className="tl-context-menu-right-slot">
|
|
|
+ <div className="tl-menu-right-slot">
|
|
|
<span className="keyboard-shortcut">
|
|
|
<code>{MOD_KEY}</code> <code>A</code>
|
|
|
</span>
|
|
@@ -87,7 +149,7 @@ export const ContextMenu = observer(function ContextMenu({
|
|
|
</ReactContextMenu.Item>
|
|
|
{app.selectedShapes?.size > 1 && (
|
|
|
<ReactContextMenu.Item
|
|
|
- className="tl-context-menu-button"
|
|
|
+ className="tl-menu-item"
|
|
|
onClick={() => runAndTransition(app.api.deselectAll)}
|
|
|
>
|
|
|
Deselect all
|
|
@@ -96,11 +158,11 @@ export const ContextMenu = observer(function ContextMenu({
|
|
|
{app.selectedShapes?.size > 0 && (
|
|
|
<>
|
|
|
<ReactContextMenu.Item
|
|
|
- className="tl-context-menu-button"
|
|
|
+ className="tl-menu-item"
|
|
|
onClick={() => runAndTransition(app.api.deleteShapes)}
|
|
|
>
|
|
|
Delete
|
|
|
- <div className="tl-context-menu-right-slot">
|
|
|
+ <div className="tl-menu-right-slot">
|
|
|
<span className="keyboard-shortcut">
|
|
|
<code>Del</code>
|
|
|
</span>
|
|
@@ -110,13 +172,13 @@ export const ContextMenu = observer(function ContextMenu({
|
|
|
<>
|
|
|
<ReactContextMenu.Separator className="menu-separator" />
|
|
|
<ReactContextMenu.Item
|
|
|
- className="tl-context-menu-button"
|
|
|
+ className="tl-menu-item"
|
|
|
onClick={() => runAndTransition(app.flipHorizontal)}
|
|
|
>
|
|
|
Flip horizontally
|
|
|
</ReactContextMenu.Item>
|
|
|
<ReactContextMenu.Item
|
|
|
- className="tl-context-menu-button"
|
|
|
+ className="tl-menu-item"
|
|
|
onClick={() => runAndTransition(app.flipVertical)}
|
|
|
>
|
|
|
Flip vertically
|
|
@@ -125,22 +187,22 @@ export const ContextMenu = observer(function ContextMenu({
|
|
|
)}
|
|
|
<ReactContextMenu.Separator className="menu-separator" />
|
|
|
<ReactContextMenu.Item
|
|
|
- className="tl-context-menu-button"
|
|
|
+ className="tl-menu-item"
|
|
|
onClick={() => runAndTransition(app.bringToFront)}
|
|
|
>
|
|
|
Move to front
|
|
|
- <div className="tl-context-menu-right-slot">
|
|
|
+ <div className="tl-menu-right-slot">
|
|
|
<span className="keyboard-shortcut">
|
|
|
<code>⇧</code> <code>]</code>
|
|
|
</span>
|
|
|
</div>
|
|
|
</ReactContextMenu.Item>
|
|
|
<ReactContextMenu.Item
|
|
|
- className="tl-context-menu-button"
|
|
|
+ className="tl-menu-item"
|
|
|
onClick={() => runAndTransition(app.sendToBack)}
|
|
|
>
|
|
|
Move to back
|
|
|
- <div className="tl-context-menu-right-slot">
|
|
|
+ <div className="tl-menu-right-slot">
|
|
|
<span className="keyboard-shortcut">
|
|
|
<code>⇧</code> <code>[</code>
|
|
|
</span>
|