Skip to content

Tooltip

A neo-brutalist tooltip built on reka-ui's Tooltip primitive, showing informational text on hover. TooltipProvider provides global configuration for all descendant tooltips, supporting custom delay, controlled mode, and more.

Demo

Preview

Installation

pnpm dlx brutx-vue@latest add tooltip

Usage

Basic Usage

vue
<script setup>
import { TooltipRoot as Tooltip, TooltipTrigger } from 'reka-ui'
import { TooltipProvider, TooltipContent, Button } from 'brutx-ui-vue'
</script>

<template>
    <TooltipProvider>
        <Tooltip>
            <TooltipTrigger as-child>
                <Button variant="outline">Hover me</Button>
            </TooltipTrigger>
            <TooltipContent>
                <p>This is a tooltip</p>
            </TooltipContent>
        </Tooltip>
    </TooltipProvider>
</template>

Using with Provider

Wrap your application (or a section) with TooltipProvider to enable tooltips:

vue
<script setup>
import { TooltipProvider } from 'brutx-ui-vue'
</script>

<template>
    <TooltipProvider>
        <router-view />
    </TooltipProvider>
</template>

Trigger Delay

Control the delay from when the pointer enters the trigger element to when the tooltip opens via the delayDuration prop on TooltipProvider (in milliseconds). You can also override the global setting on individual Tooltip components via delayDuration.

vue
<TooltipProvider :delay-duration="0">
    <Tooltip>
        <TooltipTrigger>
            <Button>Show Immediately</Button>
        </TooltipTrigger>
        <TooltipContent>
            <p>No delay</p>
        </TooltipContent>
    </Tooltip>
</TooltipProvider>

<TooltipProvider>
    <Tooltip :delay-duration="1500">
        <TooltipTrigger>
            <Button>Long Delay</Button>
        </TooltipTrigger>
        <TooltipContent>
            <p>Overridden to 1500ms</p>
        </TooltipContent>
    </Tooltip>
</TooltipProvider>

Controlled Mode

Control the tooltip's visibility via open and @update:open:

vue
<script setup>
import { ref } from 'vue'
import { TooltipRoot as Tooltip, TooltipTrigger } from 'reka-ui'
import { TooltipProvider, TooltipContent, Button } from 'brutx-ui-vue'

const isOpen = ref(false)
</script>

<template>
    <TooltipProvider>
        <Tooltip v-model:open="isOpen">
            <TooltipTrigger as-child>
                <Button variant="outline">Controlled Tooltip</Button>
            </TooltipTrigger>
            <TooltipContent>
                <p>Current state: {{ isOpen ? 'Open' : 'Closed' }}</p>
            </TooltipContent>
        </Tooltip>
    </TooltipProvider>
</template>

Sub-components

ComponentDescription
TooltipProviderContext provider (required ancestor component)
TooltipRoot component (re-exported from reka-ui's TooltipRoot)
TooltipTriggerElement that triggers the tooltip on hover
TooltipContentTooltip content panel

Props

TooltipProvider

Re-exported from reka-ui's TooltipProvider. Provides global configuration for all descendant tooltips.

PropTypeDefaultDescription
delayDurationnumber400Delay from pointer entering the trigger element to tooltip opening (in milliseconds)
skipDelayDurationnumber300Time window to skip delay when moving between tooltips (in milliseconds)
disableHoverableContentbooleanfalseWhen true, moving the pointer into the content area will close the tooltip
disableClosingTriggerbooleanfalseWhen true, clicking the trigger element will not close the tooltip
disabledbooleanfalseWhen true, disables all tooltips
ignoreNonKeyboardFocusbooleanfalseWhen true, only keyboard focus (:focus-visible) triggers the tooltip

Tooltip

Re-exported from reka-ui's TooltipRoot. Manages the state of a single tooltip.

PropTypeDefaultDescription
defaultOpenbooleanInitial open state in uncontrolled mode
openbooleanControlled open state
delayDurationnumber700Overrides the Provider's delay duration for this individual tooltip
disableHoverableContentbooleanInherited from Provider, can be overridden individually
disableClosingTriggerbooleanfalseWhen true, clicking the trigger element will not close the tooltip
disabledbooleanfalseWhen true, disables this tooltip
ignoreNonKeyboardFocusbooleanfalseWhen true, only keyboard focus triggers

TooltipTrigger

Trigger component that opens the tooltip on hover or focus.

PropTypeDefaultDescription
asstring | Component'button'Element type to render
asChildbooleanRender styles onto the child element

TooltipContent

Tooltip content panel with neo-brutalist styling. Rendered via Portal to body by default.

PropTypeDefaultDescription
sideOffsetnumber6Distance from the trigger (in pixels)
side'top' | 'right' | 'bottom' | 'left''top'Display direction
align'start' | 'center' | 'end''center'Alignment relative to the trigger
alignOffsetnumberAlignment offset (in pixels)
avoidCollisionsbooleanWhether to automatically avoid collisions
collisionBoundaryElement | Element[]Collision detection boundary
collisionPaddingnumber | Record<string, number>Collision detection padding
arrowPaddingnumberArrow padding
sticky'partial' | 'always'Sticky positioning strategy
hideWhenDetachedbooleanHide when obscured
forceMountbooleanForce mount (for custom animation control)
ariaLabelstringScreen reader label
classstringCustom CSS class

Events

Tooltip

EventPayloadDescription
update:openvalue: booleanEmitted when the open state changes

TooltipContent

EventPayloadDescription
escapeKeyDownKeyboardEventEmitted when the Escape key is pressed, can prevent default behavior
pointerDownOutsideEventEmitted when pressing a pointer outside, can prevent default behavior

Slots

Tooltip

SlotScopeDescription
default{ open: boolean }Scoped slot, provides current open state

TooltipTrigger / TooltipContent

SlotScopeDescription
defaultDefault slot content

Accessibility

  • Keyboard: Press Escape to close the tooltip
  • ARIA Attributes: Tooltip content is readable by screen readers; ariaLabel provides a more precise screen reader description
  • Focus Management: Tooltip appears on hover and focus; supports ignoreNonKeyboardFocus to avoid triggering on non-keyboard interactions

Brute force builds.