diff --git a/components/common/Popover/index.scss b/components/common/Popover/index.scss new file mode 100644 index 00000000..73dc61d3 --- /dev/null +++ b/components/common/Popover/index.scss @@ -0,0 +1,26 @@ +.Popover { + animation: scaleIn $duration-zoom ease-out; + background: var(--dialog-bg); + border-radius: $card-corner; + border: 0.5px solid rgba(0, 0, 0, 0.18); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.24); + outline: none; + overflow: hidden; + padding: $unit; + transform-origin: var(--radix-popover-content-transform-origin); + width: var(--radix-popover-trigger-width); + z-index: 5; + + &.Flush { + padding: 0; + } + + .Arrow { + fill: var(--dialog-bg); + filter: drop-shadow(0px 1px 1px rgb(0 0 0 / 0.18)); + margin-top: -1px; + } +} + +[data-radix-popper-content-wrapper] { +} diff --git a/components/common/Popover/index.tsx b/components/common/Popover/index.tsx new file mode 100644 index 00000000..02a5066b --- /dev/null +++ b/components/common/Popover/index.tsx @@ -0,0 +1,106 @@ +import React, { + ComponentProps, + PropsWithChildren, + ReactNode, + useEffect, + useState, +} from 'react' +import classNames from 'classnames' + +import * as PopoverPrimitive from '@radix-ui/react-popover' +import ChevronIcon from '~public/icons/Chevron.svg' + +import './index.scss' + +interface Props extends ComponentProps<'div'> { + open: boolean + disabled?: boolean + icon?: { + src: string + alt: string + } + trigger?: { + className?: string + placeholder?: string + } + value?: { + element: ReactNode + rawValue: string + } + onOpenChange?: () => void +} + +const Popover = React.forwardRef(function Popover( + { children, ...props }: PropsWithChildren, + forwardedRef +) { + // Component state + const [open, setOpen] = useState(false) + + // Element classes + const triggerClasses = classNames( + { + SelectTrigger: true, + Disabled: props.disabled, + }, + props.trigger?.className + ) + + // Hooks + useEffect(() => { + setOpen(props.open) + }, [props.open]) + + // Elements + const value = props.value ? ( + + {props.value?.element} + + ) : ( + {props.placeholder} + ) + + const icon = props.icon ? ( + {props.icon.alt} + ) : ( + '' + ) + + const arrow = !props.disabled ? ( + + + + ) : ( + '' + ) + + return ( + + + {icon} + {value} + {arrow} + + + {children} + + + ) +}) + +Popover.defaultProps = { + disabled: false, +} + +export default Popover diff --git a/components/common/PopoverContent/index.scss b/components/common/PopoverContent/index.scss index eb2f80c9..e69de29b 100644 --- a/components/common/PopoverContent/index.scss +++ b/components/common/PopoverContent/index.scss @@ -1,17 +0,0 @@ -.Popover { - animation: scaleIn $duration-zoom ease-out; - background: var(--dialog-bg); - border-radius: $card-corner; - border: 0.5px solid rgba(0, 0, 0, 0.18); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.24); - outline: none; - padding: $unit; - transform-origin: var(--radix-popover-content-transform-origin); - z-index: 5; - - .Arrow { - fill: var(--dialog-bg); - filter: drop-shadow(0px 1px 1px rgb(0 0 0 / 0.18)); - margin-top: -1px; - } -}