summaryrefslogtreecommitdiffstats
path: root/packages/excalidraw/element/ElementCanvasButtons.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'packages/excalidraw/element/ElementCanvasButtons.tsx')
-rw-r--r--packages/excalidraw/element/ElementCanvasButtons.tsx63
1 files changed, 63 insertions, 0 deletions
diff --git a/packages/excalidraw/element/ElementCanvasButtons.tsx b/packages/excalidraw/element/ElementCanvasButtons.tsx
new file mode 100644
index 0000000..1bcad97
--- /dev/null
+++ b/packages/excalidraw/element/ElementCanvasButtons.tsx
@@ -0,0 +1,63 @@
+import type { AppState } from "../types";
+import { sceneCoordsToViewportCoords } from "../utils";
+import type { ElementsMap, NonDeletedExcalidrawElement } from "./types";
+import { getElementAbsoluteCoords } from ".";
+import { useExcalidrawAppState } from "../components/App";
+
+import "./ElementCanvasButtons.scss";
+
+const CONTAINER_PADDING = 5;
+
+const getContainerCoords = (
+ element: NonDeletedExcalidrawElement,
+ appState: AppState,
+ elementsMap: ElementsMap,
+) => {
+ const [x1, y1] = getElementAbsoluteCoords(element, elementsMap);
+ const { x: viewportX, y: viewportY } = sceneCoordsToViewportCoords(
+ { sceneX: x1 + element.width, sceneY: y1 },
+ appState,
+ );
+ const x = viewportX - appState.offsetLeft + 10;
+ const y = viewportY - appState.offsetTop;
+ return { x, y };
+};
+
+export const ElementCanvasButtons = ({
+ children,
+ element,
+ elementsMap,
+}: {
+ children: React.ReactNode;
+ element: NonDeletedExcalidrawElement;
+ elementsMap: ElementsMap;
+}) => {
+ const appState = useExcalidrawAppState();
+
+ if (
+ appState.contextMenu ||
+ appState.newElement ||
+ appState.resizingElement ||
+ appState.isRotating ||
+ appState.openMenu ||
+ appState.viewModeEnabled
+ ) {
+ return null;
+ }
+
+ const { x, y } = getContainerCoords(element, appState, elementsMap);
+
+ return (
+ <div
+ className="excalidraw-canvas-buttons"
+ style={{
+ top: `${y}px`,
+ left: `${x}px`,
+ // width: CONTAINER_WIDTH,
+ padding: CONTAINER_PADDING,
+ }}
+ >
+ {children}
+ </div>
+ );
+};