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
Installation
pnpm dlx brutx-vue@latest add tooltipUsage
Basic Usage
<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:
<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.
<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:
<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
| Component | Description |
|---|---|
TooltipProvider | Context provider (required ancestor component) |
Tooltip | Root component (re-exported from reka-ui's TooltipRoot) |
TooltipTrigger | Element that triggers the tooltip on hover |
TooltipContent | Tooltip content panel |
API Composition
This package’s TooltipProvider and TooltipContent are local wrappers; their complete props are listed in the API reference below. Tooltip and TooltipTrigger are Reka UI primitives, whose primitive props are retained here.
TooltipProvider
Re-exported from reka-ui's TooltipProvider. Provides global configuration for all descendant tooltips.
Tooltip
Re-exported from reka-ui's TooltipRoot. Manages the state of a single tooltip.
| Prop | Type | Default | Description |
|---|---|---|---|
defaultOpen | boolean | — | Initial open state in uncontrolled mode |
open | boolean | — | Controlled open state |
delayDuration | number | 700 | Overrides the Provider's delay duration for this individual tooltip |
disableHoverableContent | boolean | — | Inherited from Provider, can be overridden individually |
disableClosingTrigger | boolean | false | When true, clicking the trigger element will not close the tooltip |
disabled | boolean | false | When true, disables this tooltip |
ignoreNonKeyboardFocus | boolean | false | When true, only keyboard focus triggers |
TooltipTrigger
Trigger component that opens the tooltip on hover or focus.
| Prop | Type | Default | Description |
|---|---|---|---|
as | string | Component | 'button' | Element type to render |
asChild | boolean | — | Render styles onto the child element |
TooltipContent
Tooltip content panel with neo-brutalist styling. Rendered via Portal to body by default.
Reka UI Primitive Events
Tooltip
| Event | Payload | Description |
|---|---|---|
update:open | value: boolean | Emitted when the open state changes |
TooltipContent
| Event | Payload | Description |
|---|---|---|
escapeKeyDown | KeyboardEvent | Emitted when the Escape key is pressed, can prevent default behavior |
pointerDownOutside | Event | Emitted when pressing a pointer outside, can prevent default behavior |
Reka UI Primitive Slots
Tooltip
| Slot | Scope | Description |
|---|---|---|
default | { open: boolean } | Scoped slot, provides current open state |
TooltipTrigger / TooltipContent
| Slot | Scope | Description |
|---|---|---|
default | — | Default slot content |
API Reference
TooltipContent
| Name | Type | Default | Description |
|---|---|---|---|
class | string | undefined | undefined | Additional CSS classes applied to the tooltip content panel rendered through the portal. |
DetailsDeclared typestring | undefined Default value details
Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | |||
to | string | HTMLElement | undefined | undefined | Selects the portal target using a CSS selector or HTMLElement. When omitted, the content is portaled to body. |
DetailsDeclared typestring | HTMLElement | undefined Default value details
Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | |||
forceMount | boolean | undefined | — | Keeps the content mounted while the tooltip is closed so a Vue animation library can control its transition. |
DetailsDeclared typeboolean | undefined Literal values
Default value details
Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | |||
ariaLabel | string | undefined | — | Provides an accessible name for the content panel when its contents do not adequately describe it. |
DetailsDeclared typestring | undefined Default value details
Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | |||
asChild | boolean | undefined | — | Merges the content panel props and behavior into its single child, which replaces the default panel element. |
DetailsDeclared typeboolean | undefined Literal values
Default value details
Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | |||
as | AsTag | Component | undefined | — | Selects the HTML tag or Vue component for the content panel; asChild takes precedence when both are set. |
DetailsDeclared typeAsTag | Component | undefined Literal values
Default value details
Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | |||
sideOffset | number | undefined | 6 | Sets the pixel distance between the content panel and its trigger. |
DetailsDeclared typenumber | undefined Default value details
Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | |||
align | "center" | "start" | "end" | undefined | — | Sets the preferred alignment of the content against its trigger; collision handling may adjust it. |
DetailsDeclared type"center" | "start" | "end" | undefined Literal values
Default value details
Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | |||
collisionPadding | number | Partial<Record<"right" | "bottom" | "left" | "top", number>> | undefined | 6 | Sets padding from the collision boundary. A number applies to every edge; an object can set each edge in pixels. |
DetailsDeclared typenumber | Partial<Record<"right" | "bottom" | "left" | "top", number>> | undefined Default value details
Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | |||
side | "right" | "bottom" | "left" | "top" | undefined | — | Sets the preferred side of the trigger for the content; collision handling may flip it to another side. |
DetailsDeclared type"right" | "bottom" | "left" | "top" | undefined Literal values
Default value details
Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | |||
alignOffset | number | undefined | — | Adds a pixel offset along the start or end alignment axis. |
DetailsDeclared typenumber | undefined Default value details
Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | |||
avoidCollisions | boolean | undefined | — | Adjusts the preferred side and alignment to keep content inside the collision boundary. |
DetailsDeclared typeboolean | undefined Literal values
Default value details
Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | |||
collisionBoundaryNullable | Element | (Element | null)[] | null | undefined | — | The element or elements used as collision boundaries. The viewport is used by default. |
DetailsDeclared typeElement | (Element | null)[] | null | undefined Literal values
Default value details
Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | |||
arrowPadding | number | undefined | — | Sets padding between the arrow and content edges so the arrow does not overlap rounded corners. |
DetailsDeclared typenumber | undefined Default value details
Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | |||
sticky | "partial" | "always" | undefined | — | Sets stickiness on the alignment axis. partial keeps content inside while the trigger remains partly visible; always keeps it inside throughout. |
DetailsDeclared type"partial" | "always" | undefined Literal values
Default value details
Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | |||
hideWhenDetached | boolean | undefined | — | Hides the content when its trigger becomes fully detached from the viewport or boundary. |
DetailsDeclared typeboolean | undefined Literal values
Default value details
Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | |||
positionStrategy | "fixed" | "absolute" | undefined | — | Selects the floating panel’s fixed or absolute CSS positioning strategy. |
DetailsDeclared type"fixed" | "absolute" | undefined Literal values
Default value details
Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | |||
updatePositionStrategy | "always" | "optimized" | undefined | — | Selects how the floating position is updated: always updates each animation frame, while optimized uses scheduled updates. |
DetailsDeclared type"always" | "optimized" | undefined Literal values
Default value details
Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | |||
| Name | Signature or type | Description |
|---|---|---|
#default | {} | Renders the explanatory content inside the tooltip panel. |
DetailsDeclared type{}Sourcepackages/ui/src/components/tooltip/TooltipContent.vue | ||
TooltipProvider
| Name | Type | Default | Description |
|---|---|---|---|
delayDuration | number | undefined | 400 | The delay in milliseconds between pointer entry and opening a tooltip; defaults to 400. |
DetailsDeclared typenumber | undefined Default value details
Sourcepackages/ui/src/components/tooltip/TooltipProvider.vue | |||
skipDelayDuration | number | undefined | — | The number of milliseconds after closing a tooltip during which entering another trigger skips its delay. |
DetailsDeclared typenumber | undefined Default value details
Sourcepackages/ui/src/components/tooltip/TooltipProvider.vue | |||
disableHoverableContent | boolean | undefined | — | When enabled, the tooltip closes as the pointer leaves its trigger instead of remaining open while the pointer enters its content. |
DetailsDeclared typeboolean | undefined Literal values
Default value details
Sourcepackages/ui/src/components/tooltip/TooltipProvider.vue | |||
disableClosingTrigger | boolean | undefined | — | When enabled, clicking a trigger does not close an open tooltip. |
DetailsDeclared typeboolean | undefined Literal values
Default value details
Sourcepackages/ui/src/components/tooltip/TooltipProvider.vue | |||
disabled | boolean | undefined | — | Disables all tooltips managed by this provider. |
DetailsDeclared typeboolean | undefined Literal values
Default value details
Sourcepackages/ui/src/components/tooltip/TooltipProvider.vue | |||
ignoreNonKeyboardFocus | boolean | undefined | — | Ignores focus not produced by keyboard navigation; only focus matching :focus-visible can open a tooltip. |
DetailsDeclared typeboolean | undefined Literal values
Default value details
Sourcepackages/ui/src/components/tooltip/TooltipProvider.vue | |||
content | TooltipContentProps | undefined | — | Provides default positioning and mounting options for TooltipContent instances under this provider; an individual content component can override them. |
DetailsDeclared typeTooltipContentProps | undefined Default value details
Sourcepackages/ui/src/components/tooltip/TooltipProvider.vue | |||
| Name | Signature or type | Description |
|---|---|---|
#default | {} | Contains Tooltip components managed by this provider’s settings. |
DetailsDeclared type{}Sourcepackages/ui/src/components/tooltip/TooltipProvider.vue | ||
Accessibility
- Keyboard: Press
Escapeto close the tooltip - ARIA Attributes: Tooltip content is readable by screen readers;
ariaLabelprovides a more precise screen reader description - Focus Management: Tooltip appears on hover and focus; supports
ignoreNonKeyboardFocusto avoid triggering on non-keyboard interactions