import React, { ReactNode } from 'react' import * as PopoverPrimitive from '@radix-ui/react-popover' import { styled, keyframes } from '../stitches.config' const slideUpAndFade = keyframes({ '0%': { opacity: 0, transform: 'translateY(2px)' }, '100%': { opacity: 1, transform: 'translateY(0)' } }) const slideRightAndFade = keyframes({ '0%': { opacity: 0, transform: 'translateX(-2px)' }, '100%': { opacity: 1, transform: 'translateX(0)' } }) const slideDownAndFade = keyframes({ '0%': { opacity: 0, transform: 'translateY(-2px)' }, '100%': { opacity: 1, transform: 'translateY(0)' } }) const slideLeftAndFade = keyframes({ '0%': { opacity: 0, transform: 'translateX(2px)' }, '100%': { opacity: 1, transform: 'translateX(0)' } }) const StyledContent = styled(PopoverPrimitive.Content, { borderRadius: 4, padding: '$3 $3', fontSize: 12, lineHeight: 1, color: '$text', backgroundColor: '$background', boxShadow: '0px 10px 38px -10px rgba(22, 23, 24, 0.35), 0px 10px 20px -15px rgba(22, 23, 24, 0.2)', '@media (prefers-reduced-motion: no-preference)': { animationDuration: '400ms', animationTimingFunction: 'cubic-bezier(0.16, 1, 0.3, 1)', willChange: 'transform, opacity', '&[data-state="open"]': { '&[data-side="top"]': { animationName: slideDownAndFade }, '&[data-side="right"]': { animationName: slideLeftAndFade }, '&[data-side="bottom"]': { animationName: slideUpAndFade }, '&[data-side="left"]': { animationName: slideRightAndFade } } }, '.dark &': { backgroundColor: '$mauve5', boxShadow: '0px 5px 38px -2px rgba(22, 23, 24, 1), 0px 10px 20px 0px rgba(22, 23, 24, 1)' } }) const StyledArrow = styled(PopoverPrimitive.Arrow, { fill: '$colors$mauve2', '.dark &': { fill: '$mauve5' } }) const StyledClose = styled(PopoverPrimitive.Close, { all: 'unset', fontFamily: 'inherit', borderRadius: '100%', height: 25, width: 25, display: 'inline-flex', alignItems: 'center', justifyContent: 'center', color: '$text', position: 'absolute', top: 5, right: 5 }) // Exports export const PopoverRoot = PopoverPrimitive.Root export const PopoverTrigger = PopoverPrimitive.Trigger export const PopoverContent = StyledContent export const PopoverArrow = StyledArrow export const PopoverClose = StyledClose interface IPopover { content: string | ReactNode open?: boolean defaultOpen?: boolean onOpenChange?: (open: boolean) => void } const Popover: React.FC> = ({ children, content, open, defaultOpen = false, onOpenChange, ...rest }) => ( {children} {content} ) export default Popover