Dock

Navigation

macOS-style dock with hover magnification effect.

Preview

Usage

example.jsx
import { Dock } from "@/components/ui/dock";

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

Source Code

Copy this file into components/ui/dock.jsx in your project.

dock.jsx
"use client";

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

const Dock = forwardRef(({ className, items = [], ...props }, ref) => {
  const [hovered, setHovered] = useState(-1);

  return (
    <div ref={ref} className={cn("flex items-end gap-1 rounded-2xl border bg-background/80 px-3 py-2 shadow-lg backdrop-blur-sm", className)} {...props}>
      {items.map((item, i) => (
        <button key={i}
          onMouseEnter={() => setHovered(i)}
          onMouseLeave={() => setHovered(-1)}
          className={cn("flex flex-col items-center gap-1 rounded-xl p-2 transition-all duration-200 hover:bg-accent",
            hovered === i && "scale-125",
            (hovered === i - 1 || hovered === i + 1) && "scale-110"
          )}
          title={item.label}
        >
          <span className="text-2xl">{item.icon}</span>
          {hovered === i && <span className="absolute -top-8 rounded-md bg-foreground px-2 py-1 text-xs text-background">{item.label}</span>}
        </button>
      ))}
    </div>
  );
});
Dock.displayName = "Dock";

export { Dock };

Quick Install

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

npm install clsx tailwind-merge