2023-08-06 21:29:26 -04:00
|
|
|
import { IconDefinition } from '@fortawesome/free-solid-svg-icons'
|
|
|
|
import { ActionIcon } from './ActionIcon'
|
|
|
|
import styles from './CollapsiblePanel.module.css'
|
|
|
|
|
|
|
|
export interface CollapsiblePanelProps
|
|
|
|
extends React.PropsWithChildren,
|
|
|
|
React.HTMLAttributes<HTMLDetailsElement> {
|
|
|
|
title: string
|
|
|
|
icon?: IconDefinition
|
|
|
|
open?: boolean
|
2023-09-09 01:38:36 -04:00
|
|
|
menu?: React.ReactNode
|
2023-11-24 08:59:24 +11:00
|
|
|
detailsTestId?: string
|
2023-08-06 21:29:26 -04:00
|
|
|
iconClassNames?: {
|
|
|
|
bg?: string
|
|
|
|
icon?: string
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export const PanelHeader = ({
|
|
|
|
title,
|
|
|
|
icon,
|
|
|
|
iconClassNames,
|
2023-09-09 01:38:36 -04:00
|
|
|
menu,
|
2023-08-06 21:29:26 -04:00
|
|
|
}: CollapsiblePanelProps) => {
|
|
|
|
return (
|
|
|
|
<summary className={styles.header}>
|
2023-12-06 14:44:13 -05:00
|
|
|
<div className="flex gap-2 align-center items-center flex-1">
|
2023-09-09 01:38:36 -04:00
|
|
|
<ActionIcon
|
|
|
|
icon={icon}
|
2023-12-06 14:44:13 -05:00
|
|
|
className="p-1"
|
|
|
|
size="sm"
|
2023-09-09 01:38:36 -04:00
|
|
|
bgClassName={
|
2023-12-06 14:44:13 -05:00
|
|
|
'dark:!bg-chalkboard-100 group-open:bg-chalkboard-80 dark:group-open:!bg-chalkboard-90 group-open:border dark:group-open:border-chalkboard-60 rounded-sm ' +
|
2023-09-09 01:38:36 -04:00
|
|
|
(iconClassNames?.bg || '')
|
|
|
|
}
|
|
|
|
iconClassName={
|
2023-12-06 14:44:13 -05:00
|
|
|
'group-open:text-energy-10 ' + (iconClassNames?.icon || '')
|
2023-09-09 01:38:36 -04:00
|
|
|
}
|
|
|
|
/>
|
|
|
|
{title}
|
|
|
|
</div>
|
|
|
|
<div className="group-open:opacity-100 opacity-0 group-open:pointer-events-auto pointer-events-none">
|
|
|
|
{menu}
|
|
|
|
</div>
|
2023-08-06 21:29:26 -04:00
|
|
|
</summary>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
export const CollapsiblePanel = ({
|
|
|
|
title,
|
|
|
|
icon,
|
|
|
|
children,
|
|
|
|
className,
|
|
|
|
iconClassNames,
|
2023-09-09 01:38:36 -04:00
|
|
|
menu,
|
2023-11-24 08:59:24 +11:00
|
|
|
detailsTestId,
|
2023-08-06 21:29:26 -04:00
|
|
|
...props
|
|
|
|
}: CollapsiblePanelProps) => {
|
|
|
|
return (
|
|
|
|
<details
|
|
|
|
{...props}
|
2023-11-24 08:59:24 +11:00
|
|
|
data-testid={detailsTestId}
|
2023-08-06 21:29:26 -04:00
|
|
|
className={styles.panel + ' group ' + (className || '')}
|
|
|
|
>
|
2023-09-09 01:38:36 -04:00
|
|
|
<PanelHeader
|
|
|
|
title={title}
|
|
|
|
icon={icon}
|
|
|
|
iconClassNames={iconClassNames}
|
|
|
|
menu={menu}
|
|
|
|
/>
|
2023-08-06 21:29:26 -04:00
|
|
|
{children}
|
|
|
|
</details>
|
|
|
|
)
|
|
|
|
}
|