Tooltip
Used to display additional information when a user hovers over an element.
import { Button } from "@chakra-ui/react"
import { Tooltip } from "@/components/ui/tooltip"
const Demo = () => {
return (
<Tooltip content="This is the tooltip content">
<Button variant="outline" size="sm">
Hover me
</Button>
</Tooltip>
)
}
Setup
If you don't already have the snippet, run the following command to add the
tooltip snippet
npx @chakra-ui/cli snippet add tooltip
The snippet includes a closed component composition for the Tooltip component.
Usage
import { Tooltip } from "@/components/ui/tooltip"
<Tooltip content="...">
<button />
</Tooltip>
Examples
Arrow
Use the showArrow prop to show an arrow on the tooltip.
import { Button } from "@chakra-ui/react"
import { Tooltip } from "@/components/ui/tooltip"
const Demo = () => {
return (
<Tooltip showArrow content="This is the tooltip content">
<Button variant="outline" size="sm">
Hover me
</Button>
</Tooltip>
)
}
Placement
Use the positioning.placement prop to change the position of the tooltip.
import { Button } from "@chakra-ui/react"
import { Tooltip } from "@/components/ui/tooltip"
const Demo = () => {
return (
<Tooltip
content="This is the tooltip content"
positioning={{ placement: "right-end" }}
>
<Button variant="outline" size="sm">
Hover me
</Button>
</Tooltip>
)
}
Offset
Use the positioning.offset prop to change the offset of the tooltip.
import { Button } from "@chakra-ui/react"
import { Tooltip } from "@/components/ui/tooltip"
const Demo = () => {
return (
<Tooltip
content="This is the tooltip content"
positioning={{ offset: { mainAxis: 4, crossAxis: 4 } }}
>
<Button variant="outline" size="sm">
Hover me
</Button>
</Tooltip>
)
}
Delay
Use the openDelay and closeDelay prop to change the delay of the tooltip.
import { Button } from "@chakra-ui/react"
import { Tooltip } from "@/components/ui/tooltip"
const Demo = () => {
return (
<Tooltip
content="This is the tooltip content"
openDelay={500}
closeDelay={100}
>
<Button variant="outline" size="sm">
Delay (open: 500ms, close: 100ms)
</Button>
</Tooltip>
)
}
Custom Background
Use the --tooltip-bg CSS variable to change the background color of the
tooltip.
import { Button } from "@chakra-ui/react"
import { Tooltip } from "@/components/ui/tooltip"
import { FaBell } from "react-icons/fa"
export const TooltipWithCustomBg = () => (
<Tooltip
showArrow
content="This is the tooltip content"
contentProps={{ css: { "--tooltip-bg": "tomato" } }}
>
<Button variant="outline" size="sm">
<FaBell /> 3
</Button>
</Tooltip>
)
Controlled
Use the open and onOpenChange prop to control the visibility of the tooltip.
"use client"
import { Button } from "@chakra-ui/react"
import { Tooltip } from "@/components/ui/tooltip"
import { useState } from "react"
const Demo = () => {
const [open, setOpen] = useState(false)
return (
<Tooltip
content="Tooltip Content"
open={open}
onOpenChange={(e) => setOpen(e.open)}
>
<Button size="sm">{open ? "Hide" : "Show"} tooltip</Button>
</Tooltip>
)
}
Store
An alternative way to control the tooltip is to use the RootProvider component
and the useTooltip store hook.
This way you can access the tooltip state and methods from outside the tooltip.
"use client"
import { Button, HStack, Tooltip, useTooltip } from "@chakra-ui/react"
const Demo = () => {
const tooltip = useTooltip()
const toggleOpen = () => tooltip.setOpen(!tooltip.open)
return (
<HStack>
<Button size="sm" variant="subtle" onClick={toggleOpen}>
Toggle
</Button>
<Tooltip.RootProvider value={tooltip}>
<Tooltip.Trigger asChild>
<Button variant="outline">Tooltip Target</Button>
</Tooltip.Trigger>
<Tooltip.Positioner>
<Tooltip.Content>This is the tooltip content</Tooltip.Content>
</Tooltip.Positioner>
</Tooltip.RootProvider>
</HStack>
)
}
Interactive
Use the interactive prop to keep the tooltip open when interacting with its
content.
import { Button } from "@chakra-ui/react"
import { Tooltip } from "@/components/ui/tooltip"
const Demo = () => {
return (
<Tooltip content="This is the tooltip content" interactive>
<Button variant="outline" size="sm">
Hover me
</Button>
</Tooltip>
)
}
Disabled
Use the disabled prop to disable the tooltip. When disabled, the tooltip will
not be shown.
import { Button } from "@chakra-ui/react"
import { Tooltip } from "@/components/ui/tooltip"
const Demo = () => {
return (
<Tooltip content="This is the tooltip content" disabled>
<Button variant="outline" size="sm">
Hover me
</Button>
</Tooltip>
)
}
With Avatar
Here's an example of how to use the Tooltip component with an Avatar
component.
import { Avatar } from "@/components/ui/avatar"
import { Tooltip } from "@/components/ui/tooltip"
import { useId } from "react"
const Demo = () => {
const id = useId()
return (
<Tooltip ids={{ trigger: id }} content="Segun Adebayo is online">
<Avatar
ids={{ root: id }}
name="Segun Adebayo"
src="https://bit.ly/sage-adebayo"
/>
</Tooltip>
)
}
With Checkbox
Here's an example of how to use the Tooltip component with a Checkbox
component.
import { Checkbox } from "@/components/ui/checkbox"
import { Tooltip } from "@/components/ui/tooltip"
import { useId } from "react"
const Demo = () => {
const id = useId()
return (
<Tooltip ids={{ trigger: id }} content="This is the tooltip content">
<Checkbox ids={{ root: id }}>Welcome</Checkbox>
</Tooltip>
)
}
With MenuItem
Here's an example of how to use the Tooltip with a MenuItem component.
import type { MenuItemProps } from "@chakra-ui/react"
import { Button } from "@chakra-ui/react"
import {
MenuContent,
MenuItem,
MenuRoot,
MenuTrigger,
} from "@/components/ui/menu"
import { Tooltip } from "@/components/ui/tooltip"
const Demo = () => {
return (
<MenuRoot>
<MenuTrigger asChild>
<Button variant="outline" size="sm">
Open
</Button>
</MenuTrigger>
<MenuContent>
<TooltipMenuItem value="new-txt" tooltip="This is the tooltip content">
Open tooltip
</TooltipMenuItem>
<MenuItem value="new-file">New File...</MenuItem>
<MenuItem value="new-win">New Window</MenuItem>
<MenuItem value="export">Export</MenuItem>
</MenuContent>
</MenuRoot>
)
}
const TooltipMenuItem = (props: MenuItemProps & { tooltip: string }) => {
const { value, tooltip, ...rest } = props
return (
<Tooltip
ids={{ trigger: value }}
openDelay={200}
closeDelay={0}
positioning={{ placement: "right" }}
content={tooltip}
>
<MenuItem value={value} {...rest} />
</Tooltip>
)
}
With MenuTrigger
Here's an example of how to use the Tooltip with a MenuTrigger component.
"use client"
import { Button } from "@chakra-ui/react"
import {
MenuContent,
MenuItem,
MenuRoot,
MenuTrigger,
} from "@/components/ui/menu"
import { Tooltip } from "@/components/ui/tooltip"
import { useId } from "react"
const Demo = () => {
const triggerId = useId()
return (
<MenuRoot ids={{ trigger: triggerId }}>
<Tooltip
ids={{ trigger: triggerId }}
positioning={{ placement: "top" }}
content="Tooltip content"
>
<MenuTrigger asChild>
<Button variant="outline" size="sm">
Open
</Button>
</MenuTrigger>
</Tooltip>
<MenuContent>
<MenuItem value="new-txt">Open tooltip</MenuItem>
<MenuItem value="new-file">New File...</MenuItem>
<MenuItem value="new-win">New Window</MenuItem>
<MenuItem value="export">Export</MenuItem>
</MenuContent>
</MenuRoot>
)
}
With Switch
Here's an example of how to wrap Tooltip around a Switch component.
import { Switch } from "@/components/ui/switch"
import { Tooltip } from "@/components/ui/tooltip"
import { useId } from "react"
const Demo = () => {
const id = useId()
return (
<Tooltip ids={{ trigger: id }} content="This is the tooltip content">
<Switch ids={{ root: id }} />
</Tooltip>
)
}
With Tabs
Here's an example of how to wrap Tooltip around a Tabs component.
import { Tabs } from "@chakra-ui/react"
import { Tooltip } from "@/components/ui/tooltip"
import { LuFolder, LuSquareCheck, LuUser } from "react-icons/lu"
const Demo = () => {
return (
<Tabs.Root defaultValue="members">
<Tabs.List>
<Tooltip
positioning={{ placement: "top" }}
ids={{ trigger: "members" }}
content="This is the tooltip content"
>
{/* TODO: Remove this once Zag.js is fixed */}
<span>
<Tabs.Trigger value="members">
<LuUser />
Members
</Tabs.Trigger>
</span>
</Tooltip>
<Tabs.Trigger value="projects">
<LuFolder />
Projects
</Tabs.Trigger>
<Tabs.Trigger value="tasks">
<LuSquareCheck />
Settings
</Tabs.Trigger>
</Tabs.List>
<Tabs.Content value="members">Manage your team members</Tabs.Content>
<Tabs.Content value="projects">Manage your projects</Tabs.Content>
<Tabs.Content value="tasks">
Manage your tasks for freelancers
</Tabs.Content>
</Tabs.Root>
)
}
Without Snippet
If you don't want to use the snippet, you can use the Tooltip component from
the @chakra-ui/react package.
import { Button, Portal, Tooltip } from "@chakra-ui/react"
const Demo = () => {
return (
<Tooltip.Root>
<Tooltip.Trigger asChild>
<Button variant="outline" size="sm">
Hover me
</Button>
</Tooltip.Trigger>
<Portal>
<Tooltip.Positioner>
<Tooltip.Content>This is the tooltip content</Tooltip.Content>
</Tooltip.Positioner>
</Portal>
</Tooltip.Root>
)
}