From 6ec259a0e71174651bae95d4628138bf6fd68742 Mon Sep 17 00:00:00 2001 From: kj_sh604 Date: Sun, 15 Mar 2026 16:19:35 -0400 Subject: refactor: packages/ --- packages/excalidraw/components/MobileMenu.tsx | 211 ++++++++++++++++++++++++++ 1 file changed, 211 insertions(+) create mode 100644 packages/excalidraw/components/MobileMenu.tsx (limited to 'packages/excalidraw/components/MobileMenu.tsx') diff --git a/packages/excalidraw/components/MobileMenu.tsx b/packages/excalidraw/components/MobileMenu.tsx new file mode 100644 index 0000000..bef99a9 --- /dev/null +++ b/packages/excalidraw/components/MobileMenu.tsx @@ -0,0 +1,211 @@ +import type { JSX } from "react"; +import React from "react"; +import type { + AppClassProperties, + AppProps, + AppState, + Device, + ExcalidrawProps, + UIAppState, +} from "../types"; +import type { ActionManager } from "../actions/manager"; +import { t } from "../i18n"; +import Stack from "./Stack"; +import { showSelectedShapeActions } from "../element"; +import type { NonDeletedExcalidrawElement } from "../element/types"; +import { FixedSideContainer } from "./FixedSideContainer"; +import { Island } from "./Island"; +import { HintViewer } from "./HintViewer"; +import { calculateScrollCenter } from "../scene"; +import { SelectedShapeActions, ShapesSwitcher } from "./Actions"; +import { Section } from "./Section"; +import { SCROLLBAR_WIDTH, SCROLLBAR_MARGIN } from "../scene/scrollbars"; +import { LockButton } from "./LockButton"; +import { PenModeButton } from "./PenModeButton"; +import { HandButton } from "./HandButton"; +import { isHandToolActive } from "../appState"; +import { useTunnels } from "../context/tunnels"; + +type MobileMenuProps = { + appState: UIAppState; + actionManager: ActionManager; + renderJSONExportDialog: () => React.ReactNode; + renderImageExportDialog: () => React.ReactNode; + setAppState: React.Component["setState"]; + elements: readonly NonDeletedExcalidrawElement[]; + onLockToggle: () => void; + onHandToolToggle: () => void; + onPenModeToggle: AppClassProperties["togglePenMode"]; + + renderTopRightUI?: ( + isMobile: boolean, + appState: UIAppState, + ) => JSX.Element | null; + renderCustomStats?: ExcalidrawProps["renderCustomStats"]; + renderSidebars: () => JSX.Element | null; + device: Device; + renderWelcomeScreen: boolean; + UIOptions: AppProps["UIOptions"]; + app: AppClassProperties; +}; + +export const MobileMenu = ({ + appState, + elements, + actionManager, + setAppState, + onLockToggle, + onHandToolToggle, + onPenModeToggle, + + renderTopRightUI, + renderCustomStats, + renderSidebars, + device, + renderWelcomeScreen, + UIOptions, + app, +}: MobileMenuProps) => { + const { + WelcomeScreenCenterTunnel, + MainMenuTunnel, + DefaultSidebarTriggerTunnel, + } = useTunnels(); + const renderToolbar = () => { + return ( + + {renderWelcomeScreen && } +
+ {(heading: React.ReactNode) => ( + + + + {heading} + + + + + {renderTopRightUI && renderTopRightUI(true, appState)} +
+ {!appState.viewModeEnabled && + appState.openDialog?.name !== "elementLinkSelector" && ( + + )} + onPenModeToggle(null)} + title={t("toolBar.penMode")} + isMobile + penDetected={appState.penDetected} + /> + + onHandToolToggle()} + title={t("toolBar.hand")} + isMobile + /> +
+
+
+ )} +
+ +
+ ); + }; + + const renderAppToolbar = () => { + if ( + appState.viewModeEnabled || + appState.openDialog?.name === "elementLinkSelector" + ) { + return ( +
+ +
+ ); + } + + return ( +
+ + {actionManager.renderAction("toggleEditMenu")} + {actionManager.renderAction( + appState.multiElement ? "finalize" : "duplicateSelection", + )} + {actionManager.renderAction("deleteSelectedElements")} +
+ {actionManager.renderAction("undo")} + {actionManager.renderAction("redo")} +
+
+ ); + }; + + return ( + <> + {renderSidebars()} + {!appState.viewModeEnabled && + appState.openDialog?.name !== "elementLinkSelector" && + renderToolbar()} +
+ + {appState.openMenu === "shape" && + !appState.viewModeEnabled && + appState.openDialog?.name !== "elementLinkSelector" && + showSelectedShapeActions(appState, elements) ? ( +
+ +
+ ) : null} + +
+
+ + ); +}; -- cgit v1.2.3