88 lines
2.1 KiB
TypeScript
88 lines
2.1 KiB
TypeScript
import styled, { css, keyframes } from 'styled-components';
|
|
import { ControlledMenu } from '@szhsin/react-menu';
|
|
import { menuSelector, menuItemSelector } from '@szhsin/react-menu/style-utils';
|
|
|
|
import '@szhsin/react-menu/dist/core.css';
|
|
|
|
const menuShow = keyframes`
|
|
from {
|
|
opacity: 0;
|
|
}
|
|
`;
|
|
const menuHide = keyframes`
|
|
to {
|
|
opacity: 0;
|
|
}
|
|
`;
|
|
|
|
export const Dropdown = styled(ControlledMenu)(
|
|
({ theme: { dropdown } }) => css`
|
|
// container for the menu items
|
|
${menuSelector.name} {
|
|
border: 1px solid ${dropdown.borderColor};
|
|
box-shadow: 0 4px 16px ${dropdown.shadow};
|
|
padding: 8px 0;
|
|
border-radius: 4px;
|
|
font-size: 14px;
|
|
background-color: ${dropdown.backgroundColor};
|
|
text-align: left;
|
|
}
|
|
|
|
${menuSelector.stateOpening} {
|
|
animation: ${menuShow} 0.15s ease-out;
|
|
}
|
|
|
|
// NOTE: animation-fill-mode: forwards is required to
|
|
// prevent flickering with React 18 createRoot()
|
|
${menuSelector.stateClosing} {
|
|
animation: ${menuHide} 0.2s ease-out forwards;
|
|
}
|
|
|
|
${menuItemSelector.name} {
|
|
padding: 6px 16px;
|
|
min-width: 150px;
|
|
background-color: ${dropdown.item.backgroundColor.default};
|
|
white-space: nowrap;
|
|
}
|
|
|
|
${menuItemSelector.hover} {
|
|
background-color: ${dropdown.item.backgroundColor.hover};
|
|
}
|
|
|
|
${menuItemSelector.disabled} {
|
|
cursor: not-allowed;
|
|
opacity: 0.5;
|
|
}
|
|
`
|
|
);
|
|
|
|
export const DropdownButton = styled.button`
|
|
background-color: transparent;
|
|
border: none;
|
|
display: flex;
|
|
cursor: pointer;
|
|
align-self: center;
|
|
|
|
&:disabled {
|
|
opacity: 0.5;
|
|
cursor: not-allowed;
|
|
}
|
|
`;
|
|
|
|
export const DangerItem = styled.div`
|
|
color: ${({ theme: { dropdown } }) => dropdown.item.color.danger};
|
|
`;
|
|
|
|
export const DropdownItemHint = styled.div`
|
|
color: ${({ theme }) => theme.topicMetaData.color.label};
|
|
font-size: 12px;
|
|
line-height: 1.4;
|
|
margin-top: 5px;
|
|
`;
|
|
|
|
export const Wrapper = styled.div`
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: end;
|
|
color: ${({ theme: { dropdown } }) => dropdown.item.color.normal};
|
|
`;
|