Yann
test
f23825d
raw
history blame
1.89 kB
import { keyframes } from "@emotion/react"
import styled from "@emotion/styled"
import {
Content,
DialogProps as Props,
Overlay,
Portal,
Root,
} from "@radix-ui/react-dialog"
import { FC } from "react"
const overlayShow = keyframes`
from {
opacity: 0;
}
to {
opacity: 1;
}
`
const contentShow = keyframes`
from {
opacity: 0;
transform: translate(-50%, -48%) scale(0.96);
}
to {
opacity: 1;
transform: translate(-50%, -50%) scale(1);
}
`
const StyledOverlay = styled(Overlay)`
background-color: rgba(0, 0, 0, 0.3);
position: fixed;
inset: 0;
animation: ${overlayShow} 150ms cubic-bezier(0.16, 1, 0.3, 1);
`
const StyledContent = styled(Content)`
background-color: ${({ theme }) => theme.backgroundColor};
border-radius: 0.5rem;
box-shadow: 0 0.5rem 3rem ${({ theme }) => theme.shadowColor};
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
margin-bottom: 1rem;
max-width: 30rem;
max-height: 85vh;
padding: 1rem;
animation: ${contentShow} 150ms cubic-bezier(0.16, 1, 0.3, 1);
display: flex;
flex-direction: column;
pointer-events: auto;
overflow: hidden;
&:focus {
outline: none;
}
`
export type DialogProps = Props & {
style?: React.CSSProperties
}
export const Dialog: FC<DialogProps> = ({ children, style, ...props }) => (
<Root {...props}>
<Portal>
<StyledOverlay />
<StyledContent style={style}>{children}</StyledContent>
</Portal>
</Root>
)
export const DialogTitle = styled.div`
font-size: 1.25rem;
color: ${({ theme }) => theme.textColor};
margin-bottom: 1.5rem;
`
export const DialogContent = styled.div`
overflow-x: hidden;
overflow-y: auto;
margin-bottom: 1rem;
`
export const DialogActions = styled.div`
display: flex;
justify-content: flex-end;
& > *:not(:last-child) {
margin-right: 1rem;
}
`