UIPackage

Tooltip

React overlay
Edit on GitHub

Small popover triggered by hover/focus, used for short labels — icon-button names, abbreviation expansions, keyboard shortcuts. Auto-positions and respects `prefers-reduced-motion`.

Also available for Vue ->

Installation

$ npx shadcn@latest add https://react.uipkge.dev/r/react/tooltip.json

Or with the named registry: npx shadcn@latest add @uipkge-react/tooltip

Examples

Dependencies

Used by

Files (2)

  • components/ui/tooltip/tooltip.tsx 2.4 kB
    'use client'
    
    import * as React from 'react'
    import * as TooltipPrimitive from '@radix-ui/react-tooltip'
    import { cn } from '@/lib/utils'
    
    // Defaults follow Radix conventions: 700ms open delay for ambient tooltips,
    // 300ms skip-delay so once one tooltip opens, neighbors skip the wait.
    function TooltipProvider({
      delayDuration = 700,
      skipDelayDuration = 300,
      ...props
    }: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
      return (
        <TooltipPrimitive.Provider
          delayDuration={delayDuration}
          skipDelayDuration={skipDelayDuration}
          {...props}
        />
      )
    }
    
    function Tooltip(props: React.ComponentProps<typeof TooltipPrimitive.Root>) {
      return <TooltipPrimitive.Root data-uipkge="" data-slot="tooltip" {...props} />
    }
    
    const TooltipTrigger = React.forwardRef<
      React.ElementRef<typeof TooltipPrimitive.Trigger>,
      React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Trigger>
    >((props, ref) => (
      <TooltipPrimitive.Trigger ref={ref} data-uipkge="" data-slot="tooltip-trigger" {...props} />
    ))
    TooltipTrigger.displayName = TooltipPrimitive.Trigger.displayName
    
    const TooltipContent = React.forwardRef<
      React.ElementRef<typeof TooltipPrimitive.Content>,
      React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>
    >(({ className, sideOffset = 4, children, ...props }, ref) => (
      <TooltipPrimitive.Portal>
        <TooltipPrimitive.Content
          ref={ref}
          data-uipkge=""
          data-slot="tooltip-content"
          sideOffset={sideOffset}
          className={cn(
            'bg-foreground text-background motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:data-[state=closed]:animate-out motion-safe:data-[state=closed]:fade-out-0 motion-safe:data-[state=closed]:zoom-out-95 motion-safe:data-[side=bottom]:slide-in-from-top-2 motion-safe:data-[side=left]:slide-in-from-right-2 motion-safe:data-[side=right]:slide-in-from-left-2 motion-safe:data-[side=top]:slide-in-from-bottom-2 z-50 w-fit rounded-md px-3 py-1.5 text-xs text-balance',
            className,
          )}
          {...props}
        >
          {children}
          <TooltipPrimitive.Arrow className="bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" />
        </TooltipPrimitive.Content>
      </TooltipPrimitive.Portal>
    ))
    TooltipContent.displayName = TooltipPrimitive.Content.displayName
    
    export { Tooltip, TooltipProvider, TooltipTrigger, TooltipContent }
  • components/ui/tooltip/index.ts 0.1 kB
    export { Tooltip, TooltipProvider, TooltipTrigger, TooltipContent } from './tooltip'

Raw manifest: https://react.uipkge.dev/r/react/tooltip.json