diff options
Diffstat (limited to 'src/components/WidgetParts/ExpandableWidget/ExpandableWidget.tsx')
| -rw-r--r-- | src/components/WidgetParts/ExpandableWidget/ExpandableWidget.tsx | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/components/WidgetParts/ExpandableWidget/ExpandableWidget.tsx b/src/components/WidgetParts/ExpandableWidget/ExpandableWidget.tsx new file mode 100644 index 0000000..52b5c06 --- /dev/null +++ b/src/components/WidgetParts/ExpandableWidget/ExpandableWidget.tsx @@ -0,0 +1,47 @@ +import { t } from '@lingui/macro'; +import { TitleLevel } from '@ts/types/app'; +import { ReactNode, useState } from 'react'; +import styles from './ExpandableWidget.module.scss'; + +const ExpandableWidget = ({ + children, + title, + titleLevel = 2, + expand = false, + withBorders = false, +}: { + children: ReactNode; + title: string; + titleLevel?: TitleLevel; + expand?: boolean; + withBorders?: boolean; +}) => { + const [isExpanded, setIsExpanded] = useState<boolean>(expand); + + const handleExpanse = () => setIsExpanded((prev) => !prev); + + const TitleTag = `h${titleLevel}` as keyof JSX.IntrinsicElements; + + const wrapperClasses = `${styles.wrapper} ${ + isExpanded ? styles['wrapper--expanded'] : '' + }`; + + const bodyClasses = `${styles.body} ${ + withBorders ? styles['body--borders'] : '' + }`; + + return ( + <div className={wrapperClasses}> + <button type="button" className={styles.header} onClick={handleExpanse}> + <span className="screen-reader-text"> + {isExpanded ? t`Collapse` : t`Expand`} + </span> + <TitleTag className={styles.title}>{title}</TitleTag> + <span className={styles.icon} aria-hidden={true}></span> + </button> + <div className={bodyClasses}>{children}</div> + </div> + ); +}; + +export default ExpandableWidget; |
