eo-n/ui
UIComponentsTooltip

Tooltip

Displays additional information on hover or focus.

Installation

CLI

npx shadcn@latest add "https://eo-n.vercel.app/r/tooltip"

Manual

Copy and paste the following code into your project.

"use client";
 
import * as React from "react";
import { Tooltip as TooltipPrimitive } from "@base-ui-components/react/tooltip";
import { ChevronDown } from "lucide-react";
 
import { cn } from "@/lib/utils";
 
function TooltipProvider({
  delay = 0,
  ...props
}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
  return (
    <TooltipPrimitive.Provider
      data-slot="tooltip-provider"
      delay={delay}
      {...props}
    />
  );
}
 
function Tooltip({
  ...props
}: React.ComponentProps<typeof TooltipPrimitive.Root>) {
  return <TooltipPrimitive.Root data-slot="tooltip" {...props} />;
}
 
function TooltipTrigger({
  ...props
}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
  return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />;
}
 
function TooltipPortal({
  ...props
}: React.ComponentProps<typeof TooltipPrimitive.Portal>) {
  return <TooltipPrimitive.Portal data-slot="tooltip-portal" {...props} />;
}
 
interface TooltipContentProps
  extends Omit<
    React.ComponentProps<typeof TooltipPrimitive.Positioner>,
    "render"
  > {}
 
function TooltipContent({
  className,
  sideOffset = 10,
  children,
  ...props
}: TooltipContentProps) {
  return (
    <TooltipPortal>
      <TooltipPrimitive.Positioner
        data-slot="tooltip-positioner"
        sideOffset={sideOffset}
        className="z-50 size-auto"
        {...props}
      >
        <TooltipPrimitive.Popup
          data-slot="tooltip-popup"
          className={cn(
            "bg-primary text-primary-foreground w-fit rounded-md px-3 py-1.5 text-xs text-balance transition-[transform,scale,opacity] duration-150 ease-out",
            "origin-[var(--transform-origin)] data-[ending-style]:scale-95 data-[ending-style]:opacity-0 data-[starting-style]:scale-95 data-[starting-style]:opacity-0",
            className
          )}
        >
          {children}
          <TooltipPrimitive.Arrow className="data-[side=bottom]:top-[-10px] data-[side=bottom]:rotate-180 data-[side=left]:right-[-10px] data-[side=left]:-rotate-90 data-[side=right]:left-[-10px] data-[side=right]:rotate-90 data-[side=top]:bottom-[-10px]">
            <ChevronDown className="fill-primary stroke-primary size-4 shrink-0" />
          </TooltipPrimitive.Arrow>
        </TooltipPrimitive.Popup>
      </TooltipPrimitive.Positioner>
    </TooltipPortal>
  );
}
 
export {
  TooltipProvider,
  Tooltip,
  TooltipTrigger,
  TooltipPortal,
  TooltipContent,
};
Update the import paths to match your project setup.

Usage

Import all parts and piece them together.

import {
  Tooltip,
  TooltipContent,
  TooltipProvider,
  TooltipTrigger,
} from "@/components/ui/tooltip";
<TooltipProvider>
  <Tooltip>
    <TooltipTrigger render={<Button>Send</Button>} />
    <TooltipContent>
      <p>Send message</p>
    </TooltipContent>
  </Tooltip>
</TooltipProvider>

On this page