mirror of
				https://github.com/excalidraw/excalidraw.git
				synced 2025-10-31 02:44:50 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			64 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { Island } from "../Island";
 | |
| import { useDevice } from "../App";
 | |
| import clsx from "clsx";
 | |
| import Stack from "../Stack";
 | |
| import React, { useRef } from "react";
 | |
| import { DropdownMenuContentPropsContext } from "./common";
 | |
| import { useOutsideClick } from "../../hooks/useOutsideClick";
 | |
| 
 | |
| const MenuContent = ({
 | |
|   children,
 | |
|   onClickOutside,
 | |
|   className = "",
 | |
|   onSelect,
 | |
|   style,
 | |
| }: {
 | |
|   children?: React.ReactNode;
 | |
|   onClickOutside?: () => void;
 | |
|   className?: string;
 | |
|   /**
 | |
|    * Called when any menu item is selected (clicked on).
 | |
|    */
 | |
|   onSelect?: (event: Event) => void;
 | |
|   style?: React.CSSProperties;
 | |
| }) => {
 | |
|   const device = useDevice();
 | |
|   const menuRef = useRef<HTMLDivElement>(null);
 | |
| 
 | |
|   useOutsideClick(menuRef, () => {
 | |
|     onClickOutside?.();
 | |
|   });
 | |
| 
 | |
|   const classNames = clsx(`dropdown-menu ${className}`, {
 | |
|     "dropdown-menu--mobile": device.editor.isMobile,
 | |
|   }).trim();
 | |
| 
 | |
|   return (
 | |
|     <DropdownMenuContentPropsContext.Provider value={{ onSelect }}>
 | |
|       <div
 | |
|         ref={menuRef}
 | |
|         className={classNames}
 | |
|         style={style}
 | |
|         data-testid="dropdown-menu"
 | |
|       >
 | |
|         {/* the zIndex ensures this menu has higher stacking order,
 | |
|     see https://github.com/excalidraw/excalidraw/pull/1445 */}
 | |
|         {device.editor.isMobile ? (
 | |
|           <Stack.Col className="dropdown-menu-container">{children}</Stack.Col>
 | |
|         ) : (
 | |
|           <Island
 | |
|             className="dropdown-menu-container"
 | |
|             padding={2}
 | |
|             style={{ zIndex: 2 }}
 | |
|           >
 | |
|             {children}
 | |
|           </Island>
 | |
|         )}
 | |
|       </div>
 | |
|     </DropdownMenuContentPropsContext.Provider>
 | |
|   );
 | |
| };
 | |
| MenuContent.displayName = "DropdownMenuContent";
 | |
| 
 | |
| export default MenuContent;
 | 
