diff options
| author | Armand Philippot <git@armandphilippot.com> | 2023-10-31 17:41:43 +0100 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2023-11-11 18:15:27 +0100 |
| commit | 2844a2bd71dcf1eb17a53992c10129b7496332e0 (patch) | |
| tree | 6b59044ade226c7dad7d1e64c9586e8d6ff0374b /src/components/atoms/overlay/overlay.tsx | |
| parent | 3ff4c37a7a2c40340c17f9e6c1754444bce0f839 (diff) | |
feat(components): add an Overlay component
* add useScrollbarWidth hook
* add useScrollLock hook
* add a new component to lock scroll with an overlay (it can be useful
especially on small screens to prevent background contents to be
scrolled)
Diffstat (limited to 'src/components/atoms/overlay/overlay.tsx')
| -rw-r--r-- | src/components/atoms/overlay/overlay.tsx | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/components/atoms/overlay/overlay.tsx b/src/components/atoms/overlay/overlay.tsx new file mode 100644 index 0000000..7dd7446 --- /dev/null +++ b/src/components/atoms/overlay/overlay.tsx @@ -0,0 +1,47 @@ +import { + forwardRef, + type ForwardRefRenderFunction, + type HTMLAttributes, + type ReactNode, +} from 'react'; +import { useScrollLock } from '../../../utils/hooks'; +import styles from './overlay.module.scss'; + +export type OverlayProps = HTMLAttributes<HTMLDivElement> & { + /** + * The elements to display in front of the overlay. + */ + children: ReactNode; + /** + * Should the overlay be visible? + * + * Use it if you want an animated overlay instead of mounting/demounting it. + * + * @default true + */ + isVisible?: boolean; +}; + +const OverlayWithRef: ForwardRefRenderFunction<HTMLDivElement, OverlayProps> = ( + { children, className = '', isVisible = true, ...props }, + ref +) => { + const overlayClass = [ + styles.overlay, + styles[isVisible ? 'overlay--visible' : 'overlay--hidden'], + className, + ].join(' '); + + useScrollLock(isVisible); + + return ( + <div {...props} className={overlayClass} ref={ref}> + {children} + </div> + ); +}; + +/** + * Overlay component. + */ +export const Overlay = forwardRef(OverlayWithRef); |
