import * as React from 'react'; import * as AccordionPrimitive from '@radix-ui/react-accordion'; import { tv, type VariantProps } from 'tailwind-variants'; import { type ElementProps } from '../../types'; import { cn } from '../../utils/cn'; import { ChevronDownIcon, ChevronUpIcon } from '../icons'; import { AccordionProvider, useAccordionContext, type AccordionContext } from './accordion-context'; export interface AccordionSingleProps extends AccordionContext, AccordionPrimitive.AccordionSingleProps {} export interface AccordionMultipleProps extends AccordionContext, AccordionPrimitive.AccordionMultipleProps {} const iconSize: Record = { sm: 'w-4 h-4', md: 'w-5 h-5', lg: 'w-6 h-6', }; const accordionVariant = tv({ base: 'flex flex-col [&>div:first-of-type]:border-none', variants: { variant: { default: '', outline: 'border-divider border', solid: 'bg-background shadow-sm', }, rounded: { default: '', sm: 'rounded-sm', md: 'rounded-md', lg: 'rounded-lg', }, }, defaultVariants: { variant: 'default', }, }); export interface AccordionProps extends AccordionContext, ElementProps, Pick, 'rounded'> { className?: string; } const Accordion = React.forwardRef, AccordionProps>( (props: any, ref) => { const { children, divider = false, activeIcon = , inactiveIcon = , iconPosition = 'right', hideIcon, size, variant, rounded, singleIndicator, className, type = 'single', ...etc } = props; return (
{children}
); } ); export interface AccordionItemProps extends ElementProps {} const AccordionItem = React.forwardRef, AccordionItemProps>( ({ className, ...props }, ref) => { const { divider = false } = useAccordionContext(); return ( ); } ); AccordionItem.displayName = 'AccordionItem'; const accordionTriggerVariant = tv({ base: 'text-foreground group flex flex-1 items-center gap-6 font-medium transition-all', variants: { variant: { default: '', outline: '', solid: '', }, size: { sm: 'px-4 py-2 text-sm', md: 'text-md px-4 py-3', lg: 'p-4 text-lg', }, singleIndicator: { true: '[&[data-state=open]_svg]:rotate-180 [&_svg]:transition-all', }, }, defaultVariants: { size: 'md', }, }); export interface AccordionTriggerProps extends ElementProps, VariantProps {} const AccordionTrigger = React.forwardRef, AccordionTriggerProps>( ({ className, children, size: sizeProp, variant: variantProp, ...props }, ref) => { const { iconPosition, size, hideIcon, singleIndicator, activeIcon, variant, inactiveIcon } = useAccordionContext(); return ( {children} {hideIcon ? null : ( <> {singleIndicator ? (
{inactiveIcon}
) : ( <>
{inactiveIcon}
{activeIcon}
)} )}
); } ); AccordionPrimitive.AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName; const accordionContentVariant = tv({ base: '', variants: { variant: { default: '', outline: '', solid: '', }, size: { sm: 'px-4 pb-4 text-sm', md: 'text-md px-4 pb-4', lg: 'px-4 pb-4 text-lg', }, }, defaultVariants: { size: 'md', }, }); export interface AccordionContentProps extends ElementProps, VariantProps {} const AccordionContent = React.forwardRef, AccordionContentProps>( ({ className, children, size: sizeProp, variant: variantProp, ...props }, ref) => { const { iconPosition, hideIcon, size, variant } = useAccordionContext(); const shiftClassName = iconPosition === 'left' ? 'pl-12' : 'pr-12'; return (
{children}
); } ); AccordionContent.displayName = AccordionPrimitive.Content.displayName; export { Accordion, AccordionContent, AccordionItem, AccordionTrigger };