@@ -12,6 +12,7 @@ interface AccordionProps {
1212 className ?: {
1313 button ?: string ;
1414 } ;
15+ disabled ?: boolean ;
1516}
1617
1718export function Accordion ( {
@@ -20,12 +21,19 @@ export function Accordion({
2021 onClick,
2122 initiallyOpen = false ,
2223 className,
24+ disabled = false ,
2325} : AccordionProps ) : ReactElement {
2426 const [ isOpen , setIsOpen ] = useState ( initiallyOpen ) ;
2527 const id = useId ( ) ;
2628 const contentId = `accordion-content-${ id } ` ;
2729
30+ const isOpenAndEnabled = isOpen && ! disabled ;
31+
2832 const handleClick : MouseEventHandler < HTMLButtonElement > = ( e ) => {
33+ if ( disabled ) {
34+ return ;
35+ }
36+
2937 onClick ?.( e ) ;
3038
3139 setIsOpen ( ( prev ) => ! prev ) ;
@@ -35,9 +43,10 @@ export function Accordion({
3543 < div className = "flex w-full flex-col" >
3644 < Button
3745 aria-controls = { contentId }
38- aria-expanded = { isOpen }
46+ aria-expanded = { isOpenAndEnabled }
3947 className = { classNames (
4048 'flex w-full flex-row gap-4 !px-0 text-left' ,
49+ disabled && '!cursor-default' ,
4150 className ?. button ,
4251 ) }
4352 type = "button"
@@ -46,22 +55,24 @@ export function Accordion({
4655 < div className = "min-w-0 flex-1" > { title } </ div >
4756 < ArrowIcon
4857 className = { classNames ( 'transition-transform ease-in-out' , {
49- 'rotate-180' : ! isOpen ,
58+ 'rotate-180' : ! isOpenAndEnabled ,
5059 } ) }
5160 />
5261 </ Button >
5362 < div
54- aria-hidden = { ! isOpen }
63+ aria-hidden = { ! isOpenAndEnabled }
5564 className = { classNames (
5665 'flex h-full min-h-0 w-full flex-col overflow-y-hidden break-words transition-[max-height,margin] duration-300 ease-in-out' ,
57- isOpen ? 'mt-3 max-h-full' : 'max-h-0' ,
66+ isOpenAndEnabled ? 'mt-3 max-h-full' : 'max-h-0' ,
5867 ) }
5968 id = { contentId }
6069 >
6170 < div
6271 className = { classNames (
6372 'transition-transform duration-150 ease-in-out' ,
64- isOpen ? 'translate-y-0 opacity-100' : '-translate-y-2 opacity-0' ,
73+ isOpenAndEnabled
74+ ? 'translate-y-0 opacity-100'
75+ : '-translate-y-2 opacity-0' ,
6576 ) }
6677 >
6778 { children }
0 commit comments