Tooltip

A small informational popup that appears when users hover over or focus on an element.


Automatic Installation

This method is still working on progress, please use manual installation for now.

Manual Installation

Install dependencies

npm install radix-ui

Copy the code

components/tooltip/tooltip.tsx
import { Tooltip as TooltipPrimitive } from 'radix-ui'
import * as React from 'react'
import { type TooltipStyles, tooltipStyles } from './tooltip.css'
 
interface TooltipProps
  extends Pick<
    TooltipPrimitive.TooltipProps,
    'open' | 'defaultOpen' | 'onOpenChange' | 'delayDuration'
  > {
  delayDuration?: number
}
 
interface TooltipTriggerProps extends TooltipPrimitive.TooltipTriggerProps {
  onClick?: React.MouseEventHandler<HTMLButtonElement>
}
 
interface TooltipContentProps
  extends Omit<TooltipPrimitive.TooltipContentProps, 'content'>,
    TooltipStyles {
  side?: 'bottom' | 'left' | 'top' | 'right'
  content?: React.ReactNode
}
 
const Tooltip: React.FC<TooltipProps & { children: React.ReactNode }> = ({
  children,
  delayDuration = 150,
  ...rootProps
}) => {
  return (
    <TooltipPrimitive.Provider delayDuration={delayDuration}>
      <TooltipPrimitive.Root {...rootProps}>{children}</TooltipPrimitive.Root>
    </TooltipPrimitive.Provider>
  )
}
 
const TooltipTrigger = React.forwardRef<
  React.ComponentRef<typeof TooltipPrimitive.Trigger>,
  TooltipTriggerProps
>(({ onClick, asChild, ...props }: TooltipTriggerProps, forwardedRef) => {
  return (
    <TooltipPrimitive.Trigger ref={forwardedRef} onClick={onClick} asChild={asChild} {...props} />
  )
})
 
const TooltipPortal = TooltipPrimitive.Portal
 
const TooltipContent = React.forwardRef<
  React.ComponentRef<typeof TooltipPrimitive.Content>,
  TooltipContentProps
>(
  (
    {
      className,
      content,
      children,
      hideArrow,
      side,
      sideOffset = 10,
      ...props
    }: TooltipContentProps,
    forwardedRef
  ) => {
    const styles = tooltipStyles({ hideArrow })
    const contentToRender = content || children
 
    return (
      <TooltipPortal>
        <TooltipPrimitive.Content
          ref={forwardedRef}
          sideOffset={sideOffset}
          className={styles.content({ className })}
          align="center"
          side={side}
          {...props}
        >
          {contentToRender}
          {!hideArrow ? (
            <TooltipPrimitive.Arrow
              className={styles.arrow()}
              aria-hidden="true"
              width={12}
              height={7}
            />
          ) : null}
        </TooltipPrimitive.Content>
      </TooltipPortal>
    )
  }
)
 
Tooltip.displayName = 'Tooltip'
TooltipTrigger.displayName = 'TooltipTrigger'
TooltipContent.displayName = 'TooltipContent'
TooltipPortal.displayName = 'TooltipPortal'
 
export { Tooltip, TooltipTrigger, TooltipContent, TooltipPortal, type TooltipProps }

Usage

Imports

import {
  Tooltip,
  TooltipTrigger,
  TooltipContent,
  TooltipPortal
} from '#/components/tooltip'

Example

Browse the Storybook for more examples.

Anatomy

<Tooltip>
  <TooltipTrigger />
  <TooltipContent />
</Tooltip>

Props

PropTypeDefault
delayDuration?
number
150
defaultOpen?
boolean
false
open?
boolean
-
onOpenChange?
(open: boolean) => void
-

TooltipContent Props

PropTypeDefault
content?
React.ReactNode
-
side?
top | right | bottom | left
top
sideOffset?
number
10
align?
start | center | end
center
hideArrow?
boolean
false
className?
string
-

TooltipTrigger Props

PropTypeDefault
asChild?
boolean
false
onClick?
React.MouseEventHandler<HTMLButtonElement>
-
Edit on GitHub

Last updated on

On this page