diff options
| author | Armand Philippot <git@armandphilippot.com> | 2022-04-06 18:40:17 +0200 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2022-04-06 18:45:08 +0200 |
| commit | 47e12259d512e476326e83929efebf036b57f7c1 (patch) | |
| tree | ff175aa349caf2a3872f78a239d8f35d72affcc5 /src/components/molecules/layout/modal.tsx | |
| parent | dfd816d1891545aa8ead982b57891858f1c82bb4 (diff) | |
chore: add a Modal component
Diffstat (limited to 'src/components/molecules/layout/modal.tsx')
| -rw-r--r-- | src/components/molecules/layout/modal.tsx | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/components/molecules/layout/modal.tsx b/src/components/molecules/layout/modal.tsx new file mode 100644 index 0000000..4dc3b0a --- /dev/null +++ b/src/components/molecules/layout/modal.tsx @@ -0,0 +1,48 @@ +import Heading from '@components/atoms/headings/heading'; +import dynamic from 'next/dynamic'; +import { FC, ReactNode } from 'react'; +import styles from './modal.module.scss'; + +export type Icons = 'cogs' | 'search'; + +export type ModalProps = { + icon?: Icons; + title?: string; +}; + +const CogIcon = dynamic<ReactNode>(() => import('@components/atoms/icons/cog')); +const SearchIcon = dynamic<ReactNode>( + () => import('@components/atoms/icons/magnifying-glass') +); + +/** + * Modal component + * + * Render a modal component with an optional title and icon. + */ +const Modal: FC<ModalProps> = ({ children, icon, title }) => { + const getIcon = (id: Icons) => { + switch (id) { + case 'cogs': + return <CogIcon />; + case 'search': + return <SearchIcon />; + default: + return <></>; + } + }; + + return ( + <div className={styles.wrapper}> + {title && ( + <Heading isFake={true} level={3}> + {icon && <span className={styles.icon}>{getIcon(icon)}</span>} + {title} + </Heading> + )} + {children} + </div> + ); +}; + +export default Modal; |
