designali
blockheader-04source: ok · hit
Header 04
A simple header section.
npx shadcn add "https://designali.com/r/header-04.json"free
Where it goes
navbar
Tags auto-generated by rules on 9/24/2026 — empty means no evidence, not lack of support.
Dependencies
Bundle weight · lightRegistry dependencies
buttoncommandtoggleseparator
Files4 · source cached 10/8/2026, 10:50:31 PM
registry/designali/blocks/header/header-04/page.tsx
import { Header } from "@/registry/designali/blocks/header/header-04/components/header"
export default function Header04() {
return (
<div className="flex min-h-screen w-full flex-col">
<Header />
<main className="flex-1">
<section className="flex h-screen items-center justify-center">
<h1 className="text-4xl font-bold">Hero</h1>
</section>
<section className="flex h-screen items-center justify-center">
<h1 className="text-4xl font-bold">Section</h1>
</section>
</main>
</div>
)
}
registry/designali/blocks/header/header-04/components/header.tsx
"use client"
import React from "react"
import Link from "next/link"
import { Menu, X } from "lucide-react"
import { useScroll } from "motion/react"
import { cn } from "@workspace/ui/lib/utils"
import { Button } from "@workspace/ui/components/button"
import { Separator } from "@workspace/ui/components/separator"
import { Search } from "./search"
import { ModeToggle } from "./theme-switch"
import { Logo } from "@workspace/ui/designali/logo"
const menuItems = [
{ name: "Features", href: "#link" },
{ name: "Solution", href: "#link" },
{ name: "Pricing", href: "#link" },
{ name: "About", href: "#link" },
{ name: "Contact", href: "#link" },
]
export const Header = () => {
const [menuState, setMenuState] = React.useState(false)
const [scrolled, setScrolled] = React.useState(false)
const { scrollYProgress } = useScroll()
React.useEffect(() => {
const unsubscribe = scrollYProgress.on("change", (latest) => {
setScrolled(latest > 0.05)
})
return () => unsubscribe()
}, [scrollYProgress])
return (
<header>
<nav
data-state={menuState && "active"}
className={cn(
"fixed z-20 h-14 w-full border-b transition-colors duration-150",
scrolled && "bg-background/50 backdrop-blur-xl"
)}
>
<div className="h-full px-3 transition-all duration-300">
<div className="relative flex h-full flex-wrap items-center justify-between gap-3 lg:gap-0">
<div className="flex h-full w-full items-center justify-between gap-6 lg:w-auto">
<a
href="#"
aria-label="home"
className="-mr-3 flex items-center gap-2 whitespace-nowrap"
>
<Logo className="size-8" />
</a>
<Separator className="hidden lg:block" orientation="vertical" />
<button
onClick={() => setMenuState(!menuState)}
aria-label={menuState == true ? "Close Menu" : "Open Menu"}
className="relative z-20 -m-2.5 mr-2 block cursor-pointer p-2.5 lg:hidden"
>
<Menu className="m-auto size-6 duration-200 in-data-[state=active]:scale-0 in-data-[state=active]:rotate-180 in-data-[state=active]:opacity-0" />
<X className="absolute inset-0 m-auto size-6 scale-0 -rotate-180 opacity-0 duration-200 in-data-[state=active]:scale-100 in-data-[state=active]:rotate-0 in-data-[state=active]:opacity-100" />
</button>
<div className="hidden lg:block">
<ul className="flex gap-10 text-sm">
{menuItems.map((item, index) => (
<li key={index}>
<Link
href={item.href}
className="block text-muted-foreground duration-150 hover:text-accent-foreground"
>
<span>{item.name}</span>
</Link>
</li>
))}
</ul>
</div>
</div>
<div className="mb-6 hidden w-full flex-wrap items-center justify-end space-y-8 rounded-3xl border bg-background p-6 shadow-2xl in-data-[state=active]:block md:flex-nowrap lg:m-0 lg:flex lg:h-14 lg:w-fit lg:gap-4 lg:space-y-0 lg:border-transparent lg:bg-transparent lg:p-0 lg:shadow-none lg:in-data-[state=active]:flex dark:shadow-none dark:lg:bg-transparent">
<div className="lg:hidden">
<ul className="space-y-6 text-base">
{menuItems.map((item, index) => (
<li key={index}>
<Link
href={item.href}
className="block text-muted-foreground duration-150 hover:text-accent-foreground"
>
<span>{item.name}</span>
</Link>
</li>
))}
</ul>
</div>
<Separator orientation="vertical" />
<Search />
<Separator orientation="vertical" />
<ModeToggle />
<Separator orientation="vertical" />
<div className="flex w-full flex-col space-y-3 sm:flex-row sm:gap-3 sm:space-y-0 md:w-fit">
<Button variant="outline" size="sm">
<Link href="#">
<span>Login</span>
</Link>
</Button>
<Button size="sm">
<Link href="#">
<span>Sign Up</span>
</Link>
</Button>
</div>
</div>
</div>
</div>
</nav>
</header>
)
}
registry/designali/blocks/header/header-04/components/theme-switch.tsx
"use client"
import { Moon, Sun } from "lucide-react"
import { useTheme } from "next-themes"
import { Toggle } from "@workspace/ui/components/toggle"
export function ModeToggle() {
const { resolvedTheme, setTheme } = useTheme()
const isDark = resolvedTheme === "dark"
return (
<div className="flex flex-col justify-center">
<Toggle
className="group size-9 cursor-pointer bg-secondary data-[state=on]:bg-transparent data-[state=on]:hover:bg-muted dark:bg-secondary"
pressed={isDark}
onPressedChange={() => setTheme(isDark ? "light" : "dark")}
aria-label={`Switch to ${isDark ? "light" : "dark"} mode`}
>
<Moon
size={16}
className="shrink-0 scale-0 opacity-0 transition-all group-data-[state=on]:scale-100 group-data-[state=on]:opacity-100"
aria-hidden="true"
/>
<Sun
size={16}
className="absolute shrink-0 scale-100 opacity-100 transition-all group-data-[state=on]:scale-0 group-data-[state=on]:opacity-0"
aria-hidden="true"
/>
</Toggle>
</div>
)
}
registry/designali/blocks/header/header-04/components/search.tsx
"use client"
import * as React from "react"
import {
ArrowUpRightIcon,
FilePlus2Icon,
LayoutTemplateIcon,
PaletteIcon,
PenToolIcon,
SearchIcon,
} from "lucide-react"
import {
Command,
CommandDialog,
CommandEmpty,
CommandGroup,
CommandInput,
CommandItem,
CommandList,
CommandSeparator,
CommandShortcut,
} from "@workspace/ui/components/command"
export function Search() {
const [open, setOpen] = React.useState(false)
React.useEffect(() => {
const down = (e: KeyboardEvent) => {
if (e.key === "k" && (e.metaKey || e.ctrlKey)) {
e.preventDefault()
setOpen((open) => !open)
}
}
document.addEventListener("keydown", down)
return () => {
document.removeEventListener("keydown", down)
}
}, [])
return (
<div className="">
<button
type="button"
onClick={() => setOpen(true)}
className="hidden h-9 w-full max-w-xs items-center border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 lg:inline-flex"
>
<span className="flex grow items-center">
<SearchIcon
className="-ms-1 me-3 text-muted-foreground/80"
size={16}
aria-hidden="true"
/>
<span className="font-normal text-muted-foreground/70">
Search design...
</span>
</span>
<kbd className="ms-12 -me-1 inline-flex h-5 items-center border bg-background px-1 font-[inherit] text-[0.625rem] font-medium text-muted-foreground/70">
⌘K
</kbd>
</button>
{/* Command Dialog */}
<CommandDialog open={open} onOpenChange={setOpen}>
<Command>
<CommandInput placeholder="Type to search components, assets, or docs..." />
<CommandList>
<CommandEmpty>No matches found.</CommandEmpty>
{/* Create */}
<CommandGroup heading="Create">
<CommandItem>
<FilePlus2Icon
size={16}
className="opacity-60"
aria-hidden="true"
/>
<span>New project</span>
<CommandShortcut>⌘N</CommandShortcut>
</CommandItem>
<CommandItem>
<LayoutTemplateIcon
size={16}
className="opacity-60"
aria-hidden="true"
/>
<span>New template</span>
<CommandShortcut>⌘T</CommandShortcut>
</CommandItem>
<CommandItem>
<PenToolIcon
size={16}
className="opacity-60"
aria-hidden="true"
/>
<span>Start design</span>
<CommandShortcut>⌘S</CommandShortcut>
</CommandItem>
</CommandGroup>
<CommandSeparator />
{/* Navigate */}
<CommandGroup heading="Navigate">
<CommandItem>
<ArrowUpRightIcon
size={16}
className="opacity-60"
aria-hidden="true"
/>
<span>Go to workspace</span>
</CommandItem>
<CommandItem>
<ArrowUpRightIcon
size={16}
className="opacity-60"
aria-hidden="true"
/>
<span>Go to templates</span>
</CommandItem>
<CommandItem>
<ArrowUpRightIcon
size={16}
className="opacity-60"
aria-hidden="true"
/>
<span>Go to documentation</span>
</CommandItem>
<CommandItem>
<ArrowUpRightIcon
size={16}
className="opacity-60"
aria-hidden="true"
/>
<span>Go to blocks</span>
</CommandItem>
<CommandItem>
<ArrowUpRightIcon
size={16}
className="opacity-60"
aria-hidden="true"
/>
<span>Go to icons</span>
</CommandItem>
</CommandGroup>
<CommandSeparator />
{/* Themes */}
<CommandGroup heading="Themes">
<CommandItem>
<PaletteIcon
size={16}
className="opacity-60"
aria-hidden="true"
/>
<span>Switch theme</span>
<CommandShortcut>⌘⇧T</CommandShortcut>
</CommandItem>
</CommandGroup>
</CommandList>
</Command>
</CommandDialog>
</div>
)
}