2022-12-19 15:59:14 -08:00
|
|
|
import type {
|
2023-07-01 19:10:05 -07:00
|
|
|
MenuProps as MantineMenuProps,
|
|
|
|
|
MenuItemProps as MantineMenuItemProps,
|
|
|
|
|
MenuLabelProps as MantineMenuLabelProps,
|
|
|
|
|
MenuDividerProps as MantineMenuDividerProps,
|
|
|
|
|
MenuDropdownProps as MantineMenuDropdownProps,
|
2022-12-19 15:59:14 -08:00
|
|
|
} from '@mantine/core';
|
|
|
|
|
import { Menu as MantineMenu, createPolymorphicComponent } from '@mantine/core';
|
2023-05-14 02:00:23 -07:00
|
|
|
import { RiArrowLeftSFill } from 'react-icons/ri';
|
2022-12-19 15:59:14 -08:00
|
|
|
import styled from 'styled-components';
|
|
|
|
|
|
|
|
|
|
type MenuProps = MantineMenuProps;
|
|
|
|
|
type MenuLabelProps = MantineMenuLabelProps;
|
|
|
|
|
interface MenuItemProps extends MantineMenuItemProps {
|
2023-07-01 19:10:05 -07:00
|
|
|
$danger?: boolean;
|
|
|
|
|
$isActive?: boolean;
|
|
|
|
|
children: React.ReactNode;
|
2022-12-19 15:59:14 -08:00
|
|
|
}
|
|
|
|
|
type MenuDividerProps = MantineMenuDividerProps;
|
|
|
|
|
type MenuDropdownProps = MantineMenuDropdownProps;
|
|
|
|
|
|
|
|
|
|
const StyledMenu = styled(MantineMenu)<MenuProps>``;
|
|
|
|
|
|
|
|
|
|
const StyledMenuLabel = styled(MantineMenu.Label)<MenuLabelProps>`
|
2023-07-01 19:10:05 -07:00
|
|
|
padding: 0.5rem;
|
|
|
|
|
font-family: var(--content-font-family);
|
2022-12-19 15:59:14 -08:00
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
const StyledMenuItem = styled(MantineMenu.Item)<MenuItemProps>`
|
2023-07-01 19:10:05 -07:00
|
|
|
position: relative;
|
|
|
|
|
padding: var(--dropdown-menu-item-padding);
|
|
|
|
|
font-size: var(--dropdown-menu-item-font-size);
|
|
|
|
|
font-family: var(--content-font-family);
|
|
|
|
|
|
|
|
|
|
&:disabled {
|
|
|
|
|
opacity: 0.6;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
&:hover {
|
|
|
|
|
background-color: var(--dropdown-menu-bg-hover);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
& .mantine-Menu-itemLabel {
|
|
|
|
|
margin-right: 2rem;
|
|
|
|
|
margin-left: 1rem;
|
|
|
|
|
color: ${(props) => (props.$danger ? 'var(--danger-color)' : 'var(--dropdown-menu-fg)')};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
& .mantine-Menu-itemRightSection {
|
|
|
|
|
display: flex;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cursor: default;
|
2022-12-19 15:59:14 -08:00
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
const StyledMenuDropdown = styled(MantineMenu.Dropdown)`
|
2023-07-01 19:10:05 -07:00
|
|
|
margin: 0;
|
|
|
|
|
padding: 0;
|
|
|
|
|
background: var(--dropdown-menu-bg);
|
|
|
|
|
border: var(--dropdown-menu-border);
|
|
|
|
|
border-radius: var(--dropdown-menu-border-radius);
|
|
|
|
|
filter: drop-shadow(0 0 5px rgb(0, 0, 0, 50%));
|
|
|
|
|
|
|
|
|
|
/* *:first-child {
|
2023-02-08 11:45:29 -08:00
|
|
|
border-top-left-radius: var(--dropdown-menu-border-radius);
|
|
|
|
|
border-top-right-radius: var(--dropdown-menu-border-radius);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*:last-child {
|
|
|
|
|
border-bottom-right-radius: var(--dropdown-menu-border-radius);
|
|
|
|
|
border-bottom-left-radius: var(--dropdown-menu-border-radius);
|
2023-03-28 14:19:23 -07:00
|
|
|
} */
|
2022-12-19 15:59:14 -08:00
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
const StyledMenuDivider = styled(MantineMenu.Divider)`
|
2023-07-01 19:10:05 -07:00
|
|
|
margin: 0;
|
|
|
|
|
padding: 0;
|
2022-12-19 15:59:14 -08:00
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
export const DropdownMenu = ({ children, ...props }: MenuProps) => {
|
2023-07-01 19:10:05 -07:00
|
|
|
return (
|
|
|
|
|
<StyledMenu
|
|
|
|
|
withinPortal
|
|
|
|
|
styles={{
|
|
|
|
|
dropdown: {
|
|
|
|
|
filter: 'drop-shadow(0 0 5px rgb(0, 0, 0, 50%))',
|
|
|
|
|
},
|
|
|
|
|
}}
|
2023-07-15 11:19:27 -07:00
|
|
|
transitionProps={{
|
|
|
|
|
transition: 'pop',
|
|
|
|
|
}}
|
2023-07-01 19:10:05 -07:00
|
|
|
{...props}
|
|
|
|
|
>
|
|
|
|
|
{children}
|
|
|
|
|
</StyledMenu>
|
|
|
|
|
);
|
2022-12-19 15:59:14 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const MenuLabel = ({ children, ...props }: MenuLabelProps) => {
|
2023-07-01 19:10:05 -07:00
|
|
|
return <StyledMenuLabel {...props}>{children}</StyledMenuLabel>;
|
2022-12-19 15:59:14 -08:00
|
|
|
};
|
|
|
|
|
|
2023-01-04 23:56:09 -08:00
|
|
|
const pMenuItem = ({ $isActive, $danger, children, ...props }: MenuItemProps) => {
|
2023-07-01 19:10:05 -07:00
|
|
|
return (
|
|
|
|
|
<StyledMenuItem
|
|
|
|
|
$danger={$danger}
|
|
|
|
|
$isActive={$isActive}
|
|
|
|
|
rightSection={$isActive && <RiArrowLeftSFill size={15} />}
|
|
|
|
|
{...props}
|
|
|
|
|
>
|
|
|
|
|
{children}
|
|
|
|
|
</StyledMenuItem>
|
|
|
|
|
);
|
2022-12-19 15:59:14 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const MenuDropdown = ({ children, ...props }: MenuDropdownProps) => {
|
2023-07-01 19:10:05 -07:00
|
|
|
return <StyledMenuDropdown {...props}>{children}</StyledMenuDropdown>;
|
2022-12-19 15:59:14 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const MenuItem = createPolymorphicComponent<'button', MenuItemProps>(pMenuItem);
|
|
|
|
|
|
|
|
|
|
const MenuDivider = ({ ...props }: MenuDividerProps) => {
|
2023-07-01 19:10:05 -07:00
|
|
|
return <StyledMenuDivider {...props} />;
|
2022-12-19 15:59:14 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
DropdownMenu.Label = MenuLabel;
|
|
|
|
|
DropdownMenu.Item = MenuItem;
|
|
|
|
|
DropdownMenu.Target = MantineMenu.Target;
|
|
|
|
|
DropdownMenu.Dropdown = MenuDropdown;
|
|
|
|
|
DropdownMenu.Divider = MenuDivider;
|