Skip to content

Tooltip

Hover/focus-triggered text bubble. Built on Reka UI's Tooltip primitives, with floating-ui positioning.

bash
npm install @vuecs/overlays
vue
<script setup lang="ts">
import {
    VCTooltip,
    VCTooltipArrow,
    VCTooltipContent,
    VCTooltipProvider,
    VCTooltipTrigger,
} from '@vuecs/overlays';
</script>

<template>
    <VCTooltipProvider :delay-duration="200">
        <VCTooltip
            v-for="side in ['top', 'right', 'bottom', 'left'] as const"
            :key="side"
        >
            <VCTooltipTrigger>Hover ({{ side }})</VCTooltipTrigger>
            <VCTooltipContent :side="side" :side-offset="6">
                Tooltip on the {{ side }}
                <VCTooltipArrow />
            </VCTooltipContent>
        </VCTooltip>
    </VCTooltipProvider>
</template>
css
@import "tailwindcss";
@import "@vuecs/design";

@custom-variant dark (&:where(.dark, .dark *));

Compound API

ComponentWrapsNotes
VCTooltipProviderTooltipProviderApp-level config (delayDuration, skipDelayDuration). Wrap once near the app root.
VCTooltipTooltipRootOne tooltip instance. Per-instance delayDuration overrides the provider.
VCTooltipTriggerTooltipTriggerHover/focus target.
VCTooltipContentTooltipPortal + TooltipContentFloating bubble. inline skips the portal.
VCTooltipArrowTooltipArrowOptional pointer arrow.
vue
<script setup lang="ts">
import {
    VCTooltip,
    VCTooltipArrow,
    VCTooltipContent,
    VCTooltipProvider,
    VCTooltipTrigger,
} from '@vuecs/overlays';
</script>

<template>
    <VCTooltipProvider :delay-duration="200">
        <VCTooltip>
            <VCTooltipTrigger>Hover me</VCTooltipTrigger>
            <VCTooltipContent side="top" :side-offset="6">
                Helpful hint
                <VCTooltipArrow />
            </VCTooltipContent>
        </VCTooltip>
    </VCTooltipProvider>
</template>

For most apps, install <VCTooltipProvider> once at the root and wrap individual usages with <VCTooltip> / <VCTooltipTrigger> / <VCTooltipContent>.

Theme keys

KeyDefault classNotes
triggervc-tooltip-trigger
contentvc-tooltip-contentBubble; supports data-state="delayed-open|closed" for animation.
arrowvc-tooltip-arrow

Accessibility

Provided by Reka:

  • Hover + focus-visible open (no open on focus from clicks, per WCAG 2.1)
  • Escape key closes
  • ARIA role="tooltip" linked via aria-describedby on the trigger

Animations

Tooltip uses data-state="delayed-open|closed" (not open|closed). Both theme-tailwind and theme-bootstrap ship enter and exit animations (fade + zoom-95) via @vuecs/design's vanilla-CSS port of tw-animate-css. Tailwind theme gates via data-[state=delayed-open]: / data-[state=closed]: variants; BS5 theme uses the dual-state helper class vc-tooltip-anim (which knows about the delayed-open state, not open). Reka's TooltipContent wraps with Presence so exit animations play before unmount. prefers-reduced-motion: reduce disables every animation.

API Reference

<VCTooltipProvider>

App-level configuration. Wrap once near the app root (or around a specific subtree) so every nested <VCTooltip> shares the same delay and skip-grouping behavior. Wraps TooltipProvider.

PropTypeDefaultDescription
delayDurationnumber700Milliseconds to wait before opening on hover. Per-tooltip overrides take precedence.
skipDelayDurationnumber300Window after a tooltip closes during which sibling tooltips skip the delay (so a row of icon-buttons feels snappy).
disableHoverableContentbooleanfalseDisable hovering-only opens (focus still works).
disableClosingTriggerbooleanfalseDon't close the tooltip when the trigger is clicked.

<VCTooltip>

One tooltip instance. Wraps TooltipRoot.

PropTypeDefaultDescription
openboolean | undefinedundefinedControlled open state.
defaultOpenbooleanfalseInitial open state.
delayDurationnumber | undefinedundefinedPer-instance delay; overrides the provider value.
disableHoverableContentboolean | undefinedundefinedPer-instance override.
disableClosingTriggerboolean | undefinedundefinedPer-instance override.
EmitPayloadDescription
update:openbooleanFired on open/close.

<VCTooltipTrigger>

Hover/focus target. Wraps TooltipTrigger.

PropTypeDefaultDescription
asstring'button'HTML tag to render. Buttons are recommended for keyboard accessibility.
asChildbooleanfalseRender via the default slot's child element.
themeClassPartial<TooltipThemeClasses>undefinedPer-instance theme override.
themeVariantRecord<string, string | boolean>undefinedPer-instance variant values.

<VCTooltipContent>

Floating bubble. Bundles TooltipPortal + TooltipContent.

PropTypeDefaultDescription
inlinebooleanfalseSkip the portal.
side'top' | 'right' | 'bottom' | 'left''top'Preferred side relative to the trigger.
sideOffsetnumber4Distance in pixels between trigger and bubble.
align'start' | 'center' | 'end''center'Alignment along the chosen side.
alignOffsetnumber0Offset in pixels along the alignment axis.
avoidCollisionsbooleantrueFlip / shift to stay inside the viewport.
themeClassPartial<TooltipThemeClasses>undefinedPer-instance theme override.
themeVariantRecord<string, string | boolean>undefinedPer-instance variant values.

<VCTooltipArrow>

Optional pointer arrow. Wraps TooltipArrow.

PropTypeDefaultDescription
widthnumber10Arrow width in pixels.
heightnumber5Arrow height in pixels.
themeClassPartial<TooltipThemeClasses>undefinedPer-instance theme override.
themeVariantRecord<string, string | boolean>undefinedPer-instance variant values.

Released under the Apache 2.0 License.