Spaces:
Paused
Paused
| import React from 'react'; | |
| import { cn } from '@/lib/utils'; | |
| interface HeaderProps extends React.HTMLAttributes<HTMLElement> { | |
| fixed?: boolean; | |
| ref?: React.Ref<HTMLElement>; | |
| } | |
| export const Header = ({ className, fixed, children, ...props }: HeaderProps) => { | |
| const [offset, setOffset] = React.useState(0); | |
| React.useEffect(() => { | |
| const onScroll = () => { | |
| setOffset(document.body.scrollTop || document.documentElement.scrollTop); | |
| }; | |
| // Add scroll listener to the body | |
| document.addEventListener('scroll', onScroll, { passive: true }); | |
| // Clean up the event listener on unmount | |
| return () => document.removeEventListener('scroll', onScroll); | |
| }, []); | |
| // Don't render if there's no children | |
| if (!children) { | |
| return null; | |
| } | |
| return ( | |
| <header | |
| className={cn( | |
| 'bg-background flex h-16 items-center gap-3 p-4 sm:gap-4', | |
| fixed && 'header-fixed peer/header fixed z-50 w-[inherit] rounded-md', | |
| offset > 10 && fixed ? 'shadow-sm' : 'shadow-none', | |
| className | |
| )} | |
| {...props} | |
| > | |
| {children} | |
| </header> | |
| ); | |
| }; | |
| Header.displayName = 'Header'; | |