Header

PreviousNext

Responsive Header, with a logo and navigation links, supporting both desktop and mobile layouts, and toggles on scroll.

Docs
systaliko-uiblock

Preview

Loading preview…
registry/blocks/header/index.tsx
'use client';
import { cn } from '@/lib/utils';
import { useToggleOnScroll } from '@/components/systaliko-ui/utils/use-toggle-onscroll';
import { HTMLMotionProps, motion } from 'motion/react';
import Link from 'next/link';

export function HeaderLogo({
  ...props
}: React.AnchorHTMLAttributes<HTMLAnchorElement>) {
  return <Link aria-label="logo" href="/" {...props} />;
}

export function Header({
  toggleOnScroll = true,
  className,
  ...props
}: HTMLMotionProps<'header'> & { toggleOnScroll?: boolean }) {
  const { isHidden, setIsHidden } = toggleOnScroll
    ? useToggleOnScroll()
    : { isHidden: false, setIsHidden: () => {} };
  const showHeader = () => setIsHidden(false);

  return (
    <motion.header
      className={cn('flex justify-between items-center', className)}
      animate={isHidden ? { y: '-100%' } : { y: '0%' }}
      transition={{ duration: 0.4, ease: 'easeOut' }}
      whileHover={{ y: '0%' }}
      onFocusCapture={showHeader}
      {...props}
    />
  );
}

Installation

npx shadcn@latest add @systaliko-ui/header

Usage

import { Header } from "@/components/header"
<Header />