Tooltip

A tooltip on web, with only accessibility output on native

yarnbunnpmpnpm
import {
ChevronDown,
ChevronLeft,
ChevronRight,
ChevronUp,
Circle,
} from '@tamagui/lucide-icons'
import type { TooltipProps } from 'tamagui'
import { Button, Paragraph, Tooltip, TooltipGroup, XStack, YStack } from 'tamagui'
export function TooltipDemo() {
return (
<TooltipGroup delay={{ open: 3000, close: 100 }}>
<YStack gap="$2" alignSelf="center">
<XStack gap="$2">
<Demo groupId="0" placement="top-end" Icon={Circle} />
<Demo groupId="1" placement="top" Icon={ChevronUp} />
<Demo groupId="2" placement="top-start" Icon={Circle} />
</XStack>
<XStack gap="$2">
<Demo groupId="3" placement="left" Icon={ChevronLeft} />
<YStack flex={1} />
<Demo groupId="4" placement="right" Icon={ChevronRight} />
</XStack>
<XStack gap="$2">
<Demo groupId="5" placement="bottom-end" Icon={Circle} />
<Demo groupId="6" placement="bottom" Icon={ChevronDown} />
<Demo groupId="7" placement="bottom-start" Icon={Circle} />
</XStack>
</YStack>
</TooltipGroup>
)
}
function Demo({ Icon, ...props }: TooltipProps & { Icon?: any }) {
return (
<Tooltip {...props}>
<Tooltip.Trigger>
<Button icon={Icon} circular />
</Tooltip.Trigger>
<Tooltip.Content enterStyle={{ x: 0, y: -5, opacity: 0, scale: 0.9 }} exitStyle={{ x: 0, y: -5, opacity: 0, scale: 0.9 }} scale={1} x={0} y={0} opacity={1} animation={[ 'quick', { opacity: { overshootClamping: true, }, }, ]} >
<Tooltip.Arrow />
<Paragraph size="$2" lineHeight="$1">
Hello world
</Paragraph>
</Tooltip.Content>
</Tooltip>
)
}

Features

  • Doesn't open until your mouse stops moving.

  • Easy to animate enter and exit.

  • Sizable, positionable, unstyled or styled.

Note that Tooltip doesn't render on native platforms.

Installation

Tooltip is already installed in tamagui, or you can install it independently:

yarn add @tamagui/tooltip

PortalProvider

Only if you aren't not using tamagui (but rather @tamagui/core) you'll need to install the @tamagui/portal package:

yarn add @tamagui/portal

Then add PortalProvider to the root of your app:

App.tsx

import { PortalProvider } from '@tamagui/portal'
import YourApp from './components/YourApp'
function App() {
return (
<PortalProvider shouldAddRootHost>
<YourApp />
</PortalProvider>
)
}
export default App

Props

  • shouldAddRootHost

    boolean

    Defines whether to add a default root host or not.

  • Anatomy

    import { Tooltip } from 'tamagui' // or '@tamagui/tooltip'
    export default () => (
    <Tooltip>
    <Tooltip.Trigger />
    <Tooltip.Content>
    <Tooltip.Arrow />
    {/* ... */}
    </Tooltip.Content>
    </Tooltip>
    )

    API Reference

    Tooltip

    Contains every component for the tooltip.

    Props

  • children (required)

    React.ReactNode

    Must contain Popover.Content

  • groupId

    string

    If given, will work alongside TooltipGroup to ensure only one tooltip in the groups stays open.

  • restMs

    number

    Time needed for cursor to rest before showing.

  • delay

    number | { open?: number; close?: number }

    Maximum time before showing (can be set independently for open/close).

  • size

    SizeTokens

    Passes size down too all sub-components when set for padding, arrow, borderRadius

  • placement

    Placement

    'top' | 'right' | 'bottom' | 'left' | 'top-start' | 'top-end' | 'right-start' | 'right-end' | 'bottom-start' | 'bottom-end' | 'left-start' | 'left-end'

  • open

    boolean

  • defaultOpen

    boolean

  • onOpenChange

    (open: boolean) => void

  • modal

    boolean

    Default: 

    true

    Renders into root of app instead of inline

  • stayInFrame

    ShiftProps

    See floating-ui shift()

  • allowFlip

    FlipProps

    See floating-ui flip

  • offset

    OffsetOptions

    Determines the distance the Popover appears from the target, see floating-ui offset().

  • If using modal={true} (which is true by default), refer to the PortalProvider installation for more information.

    Tooltip.Trigger

    Used to trigger opening of the popover when uncontrolled, see YStack in Stacks.

    Tooltip.Content

    Renders as SizableStack (see Stacks) with an extra size prop that accepts any SizeTokens.

    Tooltip.Anchor

    Renders as YStack, see Stacks.

    When you want the Trigger to be in another location from where the Tooltip attaches, use Anchor. When used, Anchor is where the Tooltip will attach, while Trigger will open it.

    TooltipGroup

    This allows you to logically group any tooltips rendered below this component. You can control their delay props, and components inside a TooltipGroup will be smart about opening quicker if you are moving between targets with tooltips, ensuring that subsequent tooltips show immediately rather than after a delay.

    See the Floating UI docs  for full details on how this works.

    Props

  • delay

    number | { open?: number; close?: number }

    The delay to use for the group.

  • timeoutMs

    number

    An optional timeout to use for the group, which represents when grouping logic will no longer be active after the close delay completes. Useful if you want grouping to last longer than the close delay, for example if there is no close delay at all.

  • preventAnimation

    boolean

    Will disable the enter/exit animations while the group is active, but not for the initial enter animation of the first hovered tooltip.