'use client'; import { H3 } from '@expo/html-elements'; import { AccordionItemContext, createAccordion, } from '@gluestack-ui/core/accordion/creator'; import { UIIcon } from '@gluestack-ui/core/icon/creator'; import { tva } from '@gluestack-ui/utils/nativewind-utils'; import { styled } from 'nativewind'; import React from 'react'; import { Platform, Pressable, Text, TextProps, View } from 'react-native'; import { AnimatedHeight } from './AccordionAnimatedHeight'; import { AnimatedIcon } from './AccordionAnimatedIcon'; import { accordionAnimationConfig } from './animation-config'; /** Styles */ const accordionStyle = tva({ base: 'w-full', }); const accordionItemStyle = tva({ base: '', }); const accordionTitleTextStyle = tva({ base: 'text-foreground font-medium flex-1 text-left text-sm', }); const accordionIconStyle = tva({ base: 'text-muted-foreground fill-none h-4 w-4', }); const accordionContentTextStyle = tva({ base: 'text-foreground text-sm font-normal', }); const accordionHeaderStyle = tva({ base: 'py-2.5 m-0', }); const accordionContentStyle = tva({ base: 'pb-4', }); const accordionTriggerStyle = tva({ base: 'w-full flex-row justify-between items-center web:outline-none focus:outline-none data-[disabled=true]:opacity-40 data-[disabled=true]:cursor-not-allowed data-[focus-visible=true]:bg-background/10 gap-3', }); const Header = ( Platform.OS === 'web' ? H3 : View ) as React.ComponentType; const StyledUIIcon = styled(UIIcon, { className: "style", }); /** Creator */ const UIAccordion = createAccordion({ Root: View, Item: View, Header: Header, Trigger: Pressable, Icon: StyledUIIcon, TitleText: Text, ContentText: Text, Content: View, }); type IAccordionProps = React.ComponentPropsWithoutRef; type IAccordionItemProps = React.ComponentPropsWithoutRef< typeof UIAccordion.Item >; type IAccordionContentProps = React.ComponentPropsWithoutRef< typeof UIAccordion.Content >; type IAccordionContentTextProps = React.ComponentPropsWithoutRef< typeof UIAccordion.ContentText >; type IAccordionIconProps = React.ComponentPropsWithoutRef< typeof UIAccordion.Icon > & { as?: React.ElementType; height?: number; width?: number; }; type IAccordionHeaderProps = React.ComponentPropsWithoutRef< typeof UIAccordion.Header >; type IAccordionTriggerProps = React.ComponentPropsWithoutRef< typeof UIAccordion.Trigger >; type IAccordionTitleTextProps = React.ComponentPropsWithoutRef< typeof UIAccordion.TitleText >; /** Components */ const Accordion = React.forwardRef< React.ComponentRef, IAccordionProps >(({ className, ...props }, ref) => { return ( ); }); const AccordionItem = React.forwardRef< React.ComponentRef, IAccordionItemProps >(({ className, ...props }, ref) => { return ( ); }); const AccordionContent = React.forwardRef< React.ComponentRef, IAccordionContentProps >(function AccordionContent({ className, ...props }, ref) { const { isExpanded } = React.useContext(AccordionItemContext); return ( ); }); const AccordionContentText = React.forwardRef< React.ComponentRef, IAccordionContentTextProps >(function AccordionContentText({ className, ...props }, ref) { return ( ); }); const AccordionIcon = React.forwardRef< React.ComponentRef, IAccordionIconProps >(function AccordionIcon({ className, ...props }, ref) { const { isExpanded } = React.useContext(AccordionItemContext); return ( ); }); const AccordionHeader = React.forwardRef< React.ComponentRef, IAccordionHeaderProps >(function AccordionHeader({ className, ...props }, ref) { return ( ); }); const AccordionTrigger = React.forwardRef< React.ComponentRef, IAccordionTriggerProps >(function AccordionTrigger({ className, ...props }, ref) { return ( ); }); const AccordionTitleText = React.forwardRef< React.ComponentRef, IAccordionTitleTextProps >(function AccordionTitleText({ className, ...props }, ref) { return ( ); }); Accordion.displayName = 'Accordion'; AccordionItem.displayName = 'AccordionItem'; AccordionHeader.displayName = 'AccordionHeader'; AccordionTrigger.displayName = 'AccordionTrigger'; AccordionTitleText.displayName = 'AccordionTitleText'; AccordionContentText.displayName = 'AccordionContentText'; AccordionIcon.displayName = 'AccordionIcon'; AccordionContent.displayName = 'AccordionContent'; export { Accordion, AccordionContent, AccordionContentText, AccordionHeader, AccordionIcon, AccordionItem, AccordionTitleText, AccordionTrigger };