feishin/src/renderer/components/dropdown-menu/index.tsx

128 lines
3.6 KiB
TypeScript
Raw Normal View History

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 {
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);
} */
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%))',
},
}}
{...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;