'use client'; import React from 'react'; import { View, Pressable, ScrollView, ViewStyle } from 'react-native'; import { Motion, createMotionAnimatedComponent, AnimatePresence, MotionComponentProps, } from '@legendapp/motion'; import { createPopover } from '@gluestack-ui/popover'; import { tva } from '@gluestack-ui/nativewind-utils/tva'; import { withStyleContext, useStyleContext, } from '@gluestack-ui/nativewind-utils/withStyleContext'; import { cssInterop } from 'nativewind'; import type { VariantProps } from '@gluestack-ui/nativewind-utils'; type IAnimatedPressableProps = React.ComponentProps & MotionComponentProps; const AnimatedPressable = createMotionAnimatedComponent( Pressable ) as React.ComponentType; const SCOPE = 'POPOVER'; type IMotionViewProps = React.ComponentProps & MotionComponentProps; const MotionView = Motion.View as React.ComponentType; const UIPopover = createPopover({ Root: withStyleContext(View, SCOPE), Arrow: MotionView, Backdrop: AnimatedPressable, Body: ScrollView, CloseButton: Pressable, Content: MotionView, Footer: View, Header: View, AnimatePresence: AnimatePresence, }); cssInterop(MotionView, { className: 'style' }); cssInterop(AnimatedPressable, { className: 'style' }); const popoverStyle = tva({ base: 'group/popover w-full h-full justify-center items-center web:pointer-events-none', variants: { size: { xs: '', sm: '', md: '', lg: '', full: '', }, }, }); const popoverArrowStyle = tva({ base: 'bg-background-0 z-[1] border absolute overflow-hidden h-3.5 w-3.5 border-outline-100', 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 data-[focus-visible=true]:web:bg-background-100 web:outline-0 web:cursor-pointer', }); const popoverContentStyle = tva({ base: 'bg-background-0 rounded-lg overflow-hidden border border-outline-100 w-full', parentVariants: { size: { xs: 'max-w-[360px] p-3.5', sm: 'max-w-[420px] p-4', md: 'max-w-[510px] p-[18px]', lg: 'max-w-[640px] p-5', full: 'p-6', }, }, }); 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, size = 'md', placement = 'bottom', ...props }, ref ) { return ( ); }); const PopoverContent = React.forwardRef< React.ComponentRef, IPopoverContentProps >(function PopoverContent({ className, size, ...props }, ref) { const { size: parentSize } = useStyleContext(SCOPE); 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, PopoverBackdrop, PopoverArrow, PopoverCloseButton, PopoverFooter, PopoverHeader, PopoverBody, PopoverContent, };