import { CircleChevronDownIcon } from 'lucide-react'; import React, { useContext } from 'react'; import { Disclosure as AriaDisclosure, DisclosurePanel as AriaDisclosurePanel, type DisclosurePanelProps as AriaDisclosurePanelProps, type DisclosureProps as AriaDisclosureProps, Button, DisclosureStateContext, Heading, } from 'react-aria-components/Disclosure'; import { DisclosureGroup as AriaDisclosureGroup, type DisclosureGroupProps as AriaDisclosureGroupProps, } from 'react-aria-components/DisclosureGroup'; import { composeRenderProps } from 'react-aria-components/composeRenderProps'; import { tv } from 'tailwind-variants'; import { composeTailwindRenderProps, focusRing } from './utils'; const disclosure = tv({ base: 'group min-w-64 rounded-lg text-gray-900 dark:text-zinc-100', }); const disclosureButton = tv({ extend: focusRing, base: 'bg-primary-900 hover:bg-primary-700 pressed:bg-primary-800 flex w-full cursor-default items-center justify-between gap-2 rounded-lg p-2 text-start text-white aria-expanded:rounded-b-none', variants: { isDisabled: { true: 'dark:text-primary-300 text-gray-300 forced-colors:text-[GrayText]', }, }, }); const chevron = tv({ base: 'size-5 transition-transform duration-200 ease-in-out', variants: { isExpanded: { true: 'rotate-180 transform', }, isDisabled: { true: 'dark:text-primary-300 text-gray-300 forced-colors:text-[GrayText]', }, }, }); export interface DisclosureProps extends AriaDisclosureProps { children: React.ReactNode; } export function Disclosure({ children, ...props }: DisclosureProps) { return ( disclosure({ ...renderProps, className }), )} > {children} ); } export interface DisclosureHeaderProps { children: React.ReactNode; } export function DisclosureHeader({ children }: DisclosureHeaderProps) { const { isExpanded } = useContext(DisclosureStateContext)!; return ( ); } export interface DisclosurePanelProps extends AriaDisclosurePanelProps { children: React.ReactNode; } export function DisclosurePanel({ children, ...props }: DisclosurePanelProps) { return ( {children} ); } export interface DisclosureGroupProps extends AriaDisclosureGroupProps { children: React.ReactNode; } export function DisclosureGroup({ children, ...props }: DisclosureGroupProps) { return ( {children} ); }