'use client'; import { createPopover } from '@gluestack-ui/core/popover/creator'; import type { VariantProps } from '@gluestack-ui/utils/nativewind-utils'; import { tva, useStyleContext, withStyleContext, } from '@gluestack-ui/utils/nativewind-utils'; import { styled } from 'nativewind'; import React from 'react'; import { Pressable, ScrollView, View } from 'react-native'; import Animated, { FadeIn, FadeOut } from 'react-native-reanimated'; const AnimatedPressable = Animated.createAnimatedComponent(Pressable); const AnimatedView = Animated.createAnimatedComponent(View); const SCOPE = 'POPOVER'; const StyledAnimatedView = styled(AnimatedView, { className: 'style' }); const StyledAnimatedPressable = styled(AnimatedPressable, { className: 'style' }); const UIPopover = createPopover({ Root: withStyleContext(StyledAnimatedView, SCOPE), Arrow: View, Backdrop: StyledAnimatedPressable, Body: ScrollView, CloseButton: Pressable, Content: View, Footer: View, Header: View }); const popoverStyle = tva({ base: 'group/popover w-full h-full justify-center items-center web:pointer-events-none', }); const popoverArrowStyle = tva({ base: 'bg-popover z-[1] border absolute overflow-hidden h-3.5 w-3.5 border-border dark:border-border/90', variants: { placement: { 'top left': 'data-[flip=false]:border-t-0 data-[flip=false]:border-l-0 data-[flip=true]:border-b-0 data-[flip=true]:border-r-0', 'top': 'data-[flip=false]:border-t-0 data-[flip=false]:border-l-0 data-[flip=true]:border-b-0 data-[flip=true]:border-r-0', 'top right': 'data-[flip=false]:border-t-0 data-[flip=false]:border-l-0 data-[flip=true]:border-b-0 data-[flip=true]:border-r-0', 'bottom': 'data-[flip=false]:border-b-0 data-[flip=false]:border-r-0 data-[flip=true]:border-t-0 data-[flip=true]:border-l-0', 'bottom left': 'data-[flip=false]:border-b-0 data-[flip=false]:border-r-0 data-[flip=true]:border-t-0 data-[flip=true]:border-l-0', 'bottom right': 'data-[flip=false]:border-b-0 data-[flip=false]:border-r-0 data-[flip=true]:border-t-0 data-[flip=true]:border-l-0', 'left': 'data-[flip=false]:border-l-0 data-[flip=false]:border-b-0 data-[flip=true]:border-r-0 data-[flip=true]:border-t-0', 'left top': 'data-[flip=false]:border-l-0 data-[flip=false]:border-b-0 data-[flip=true]:border-r-0 data-[flip=true]:border-t-0', 'left bottom': 'data-[flip=false]:border-l-0 data-[flip=false]:border-b-0 data-[flip=true]:border-r-0 data-[flip=true]:border-t-0', 'right': 'data-[flip=false]:border-r-0 data-[flip=false]:border-t-0 data-[flip=true]:border-l-0 data-[flip=true]:border-b-0', 'right top': 'data-[flip=false]:border-r-0 data-[flip=false]:border-t-0 data-[flip=true]:border-l-0 data-[flip=true]:border-b-0', 'right bottom': 'data-[flip=false]:border-r-0 data-[flip=false]:border-t-0 data-[flip=true]:border-l-0 data-[flip=true]:border-b-0', }, }, }); const popoverBackdropStyle = tva({ base: 'absolute left-0 top-0 right-0 bottom-0 web:cursor-default', }); const popoverCloseButtonStyle = tva({ base: 'group/popover-close-button z-[1] rounded-sm p-2 data-[focus-visible=true]:bg-accent web:outline-0 web:cursor-pointer data-[hover=true]:bg-accent/50', }); const popoverContentStyle = tva({ base: 'bg-popover text-popover-foreground rounded-lg overflow-hidden border border-border dark:border-border/10 shadow-md p-4 w-full max-w-xs web:pointer-events-auto', }); const popoverHeaderStyle = tva({ base: 'flex-row justify-between items-center', }); const popoverBodyStyle = tva({ base: '', }); const popoverFooterStyle = tva({ base: 'flex-row justify-between items-center', }); type IPopoverProps = React.ComponentProps & VariantProps & { className?: string }; type IPopoverArrowProps = React.ComponentProps & VariantProps & { className?: string }; type IPopoverContentProps = React.ComponentProps & VariantProps & { className?: string }; type IPopoverHeaderProps = React.ComponentProps & VariantProps & { className?: string }; type IPopoverFooterProps = React.ComponentProps & VariantProps & { className?: string }; type IPopoverBodyProps = React.ComponentProps & VariantProps & { className?: string }; type IPopoverBackdropProps = React.ComponentProps & VariantProps & { className?: string }; type IPopoverCloseButtonProps = React.ComponentProps< typeof UIPopover.CloseButton > & VariantProps & { className?: string }; const Popover = React.forwardRef< React.ComponentRef, IPopoverProps >(function Popover( { className, placement = 'bottom', style, ...props }, ref ) { return ( ); }); const PopoverContent = React.forwardRef< React.ComponentRef, IPopoverContentProps >(function PopoverContent({ className, ...props }, ref) { const { style, ...restProps } = props; return ( ); }); const PopoverArrow = React.forwardRef< React.ComponentRef, IPopoverArrowProps >(function PopoverArrow({ className, ...props }, ref) { const { placement } = useStyleContext(SCOPE); return ( ); }); const PopoverBackdrop = React.forwardRef< React.ComponentRef, IPopoverBackdropProps >(function PopoverBackdrop({ className, ...props }, ref) { return ( ); }); const PopoverBody = React.forwardRef< React.ComponentRef, IPopoverBodyProps >(function PopoverBody({ className, ...props }, ref) { return ( ); }); const PopoverCloseButton = React.forwardRef< React.ComponentRef, IPopoverCloseButtonProps >(function PopoverCloseButton({ className, ...props }, ref) { return ( ); }); const PopoverFooter = React.forwardRef< React.ComponentRef, IPopoverFooterProps >(function PopoverFooter({ className, ...props }, ref) { return ( ); }); const PopoverHeader = React.forwardRef< React.ComponentRef, IPopoverHeaderProps >(function PopoverHeader({ className, ...props }, ref) { return ( ); }); Popover.displayName = 'Popover'; PopoverArrow.displayName = 'PopoverArrow'; PopoverBackdrop.displayName = 'PopoverBackdrop'; PopoverContent.displayName = 'PopoverContent'; PopoverHeader.displayName = 'PopoverHeader'; PopoverFooter.displayName = 'PopoverFooter'; PopoverBody.displayName = 'PopoverBody'; PopoverCloseButton.displayName = 'PopoverCloseButton'; export { Popover, PopoverArrow, PopoverBackdrop, PopoverBody, PopoverCloseButton, PopoverContent, PopoverFooter, PopoverHeader };