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}
);
});