Nav Drawer

Navigation

Slide-out navigation drawer panel.

Preview

Navigation
Dashboard
Analytics
Settings

Usage

example.jsx
import { NavDrawer, NavDrawerHeader, NavDrawerContent } from "@/components/ui/nav-drawer";

export default function Example() {
  return <NavDrawer />;
}

Source Code

Copy this file into components/ui/nav-drawer.jsx in your project.

nav-drawer.jsx
"use client";

import { forwardRef, useEffect } from "react";
import { cn } from "@/lib/utils";

const NavDrawer = forwardRef(({ className, open, onClose, side = "left", children, ...props }, ref) => {
  useEffect(() => {
    if (open) { document.body.style.overflow = "hidden"; }
    return () => { document.body.style.overflow = ""; };
  }, [open]);

  return (
    <>
      {open && <div className="fixed inset-0 z-40 bg-black/50 backdrop-blur-sm" onClick={onClose} />}
      <div ref={ref}
        className={cn("fixed top-0 z-50 flex h-full w-72 flex-col border bg-background transition-transform duration-300 ease-in-out",
          side === "left" && "left-0",
          side === "right" && "right-0",
          side === "left" && (open ? "translate-x-0" : "-translate-x-full"),
          side === "right" && (open ? "translate-x-0" : "translate-x-full"),
          className
        )}
        {...props}
      >
        {children}
      </div>
    </>
  );
});
NavDrawer.displayName = "NavDrawer";

const NavDrawerHeader = forwardRef(({ className, ...props }, ref) => (
  <div ref={ref} className={cn("flex h-16 items-center justify-between border-b px-4", className)} {...props} />
));
NavDrawerHeader.displayName = "NavDrawerHeader";

const NavDrawerContent = forwardRef(({ className, ...props }, ref) => (
  <div ref={ref} className={cn("flex-1 overflow-auto p-4", className)} {...props} />
));
NavDrawerContent.displayName = "NavDrawerContent";

export { NavDrawer, NavDrawerHeader, NavDrawerContent };

Quick Install

Make sure you have the cn() utility set up. It requires clsx and tailwind-merge.

npm install clsx tailwind-merge