diff options
| author | Armand Philippot <git@armandphilippot.com> | 2023-09-20 16:38:54 +0200 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2023-09-20 16:38:54 +0200 |
| commit | f861e6a269ba9f62700776d3cd13b644a9e836d4 (patch) | |
| tree | a5a107e7a6e4ff8b4261fe04349357bc00b783ee /src/components/atoms/lists/description-list-group.tsx | |
| parent | 03331c44276ec56e9f235e4d5ee75030455a753f (diff) | |
refactor: use named export for everything except pages
Next expect a default export for pages so only those components should
use default exports. Everything else should use named exports to
reduce the number of import statements.
Diffstat (limited to 'src/components/atoms/lists/description-list-group.tsx')
| -rw-r--r-- | src/components/atoms/lists/description-list-group.tsx | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/components/atoms/lists/description-list-group.tsx b/src/components/atoms/lists/description-list-group.tsx new file mode 100644 index 0000000..63ae541 --- /dev/null +++ b/src/components/atoms/lists/description-list-group.tsx @@ -0,0 +1,70 @@ +import { FC, ReactNode, useId } from 'react'; +import styles from './description-list-group.module.scss'; + +export type ItemLayout = 'inline' | 'inline-values' | 'stacked'; + +export type DescriptionListGroupProps = { + /** + * Set additional classnames to the list item wrapper. + */ + className?: string; + /** + * Set additional classnames to the list item description. + */ + descriptionClassName?: string; + /** + * The item label. + */ + label: string; + /** + * The item layout. + */ + layout?: ItemLayout; + /** + * Set additional classnames to the list item term. + */ + termClassName?: string; + /** + * The item value. + */ + value: ReactNode | ReactNode[]; + /** + * If true, use a slash to delimitate multiple values. + */ + withSeparator?: boolean; +}; + +/** + * DescriptionListItem component + * + * Render a couple of dt/dd wrapped in a div. + */ +export const DescriptionListGroup: FC<DescriptionListGroupProps> = ({ + className = '', + descriptionClassName = '', + label, + termClassName = '', + value, + layout = 'stacked', + withSeparator = false, +}) => { + const id = useId(); + const layoutStyles = styles[`wrapper--${layout}`]; + const separatorStyles = withSeparator ? styles['wrapper--has-separator'] : ''; + const itemValues = Array.isArray(value) ? value : [value]; + const groupClass = `${styles.wrapper} ${layoutStyles} ${separatorStyles} ${className}`; + + return ( + <div className={groupClass}> + <dt className={`${styles.term} ${termClassName}`}>{label}</dt> + {itemValues.map((currentValue, index) => ( + <dd + className={`${styles.description} ${descriptionClassName}`} + key={`${id}-${index}`} + > + {currentValue} + </dd> + ))} + </div> + ); +}; |
