import { CheckIcon as MantineCheckIcon, Menu as MantineMenu, } from "@mantine/core"; import { assertEmpty } from "@blocknote/core"; import { ComponentProps } from "@blocknote/react"; import { createContext, forwardRef, useContext } from "react"; const SubMenuContext = createContext< | { onMenuMouseOver: () => void; onMenuMouseLeave: () => void; } | undefined >(undefined); export const Menu = (props: ComponentProps["Generic"]["Menu"]["Root"]) => { const { children, onOpenChange, position, portalElement, preventFocusOnOpen, sub, ...rest } = props; assertEmpty(rest); if (sub) { return ( {children} ); } return ( {children} ); }; export const MenuItem = forwardRef< HTMLButtonElement & HTMLDivElement, ComponentProps["Generic"]["Menu"]["Item"] >((props, ref) => { const { className, children, icon, checked, disabled, subTrigger, onClick, ...rest } = props; // false, because rest props can be added by mantine when button is used as a trigger // assertEmpty in this case is only used at typescript level, not runtime level assertEmpty(rest, false); if (subTrigger) { return ( ) : checked === false ? (
) : null } onClick={onClick} disabled={disabled} {...rest} > {children} ); } return ( ) : checked === false ? (
) : null } onClick={onClick} disabled={disabled} {...rest} > {children} ); }); export const MenuTrigger = ( props: ComponentProps["Generic"]["Menu"]["Trigger"], ) => { const { children, sub, // unused ...rest } = props; assertEmpty(rest); if (sub) { return {children}; } return {children}; }; export const MenuDropdown = forwardRef< HTMLDivElement, ComponentProps["Generic"]["Menu"]["Dropdown"] >((props, ref) => { const { className, children, sub, //unused ...rest } = props; assertEmpty(rest); const ctx = useContext(SubMenuContext); if (sub) { return ( {children} ); } return ( {children} ); }); export const MenuDivider = forwardRef< HTMLDivElement, ComponentProps["Generic"]["Menu"]["Divider"] >((props, ref) => { const { className, ...rest } = props; assertEmpty(rest); return ; }); export const MenuLabel = forwardRef< HTMLDivElement, ComponentProps["Generic"]["Menu"]["Label"] >((props, ref) => { const { className, children, ...rest } = props; assertEmpty(rest); return ( {children} ); });