UIPackage

Tooltip

Vue overlay
Edit on GitHub

Small popover triggered by hover/focus, used for short labels — icon-button names, abbreviation expansions, keyboard shortcuts. Auto-positions and respects `prefers-reduced-motion`.

Also available for React ->

Installation

$ npx shadcn-vue@latest add https://uipkge.dev/r/vue/tooltip.json

Or with the named registry: npx shadcn-vue@latest add @uipkge/tooltip

Examples

Dependencies

Used by

Files (5)

  • app/components/ui/tooltip/Tooltip.vue 0.5 kB
    <script setup lang="ts">
    import type { TooltipRootEmits, TooltipRootProps } from 'reka-ui'
    import { TooltipRoot, useForwardPropsEmits } from 'reka-ui'
    
    const props = defineProps<TooltipRootProps>()
    const emits = defineEmits<TooltipRootEmits>()
    
    const forwarded = useForwardPropsEmits(props, emits)
    </script>
    
    <template>
      <TooltipRoot v-slot="slotProps" data-uipkge data-slot="tooltip" v-bind="forwarded">
        <slot v-bind="slotProps" />
      </TooltipRoot>
    </template>
  • app/components/ui/tooltip/TooltipContent.vue 1.5 kB
    <script setup lang="ts">
    import type { TooltipContentEmits, TooltipContentProps } from 'reka-ui'
    import type { HTMLAttributes } from 'vue'
    import { reactiveOmit } from '@vueuse/core'
    import { TooltipArrow, TooltipContent, TooltipPortal, useForwardPropsEmits } from 'reka-ui'
    import { cn } from '@/lib/utils'
    
    defineOptions({
      inheritAttrs: false,
    })
    
    const props = withDefaults(defineProps<TooltipContentProps & { class?: HTMLAttributes['class'] }>(), {
      sideOffset: 4,
    })
    
    const emits = defineEmits<TooltipContentEmits>()
    
    const delegatedProps = reactiveOmit(props, 'class')
    const forwarded = useForwardPropsEmits(delegatedProps, emits)
    </script>
    
    <template>
      <TooltipPortal>
        <TooltipContent
          data-uipkge
          data-slot="tooltip-content"
          v-bind="{ ...forwarded, ...$attrs }"
          :class="
            cn(
              'bg-foreground text-background motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:data-[state=closed]:animate-out motion-safe:data-[state=closed]:fade-out-0 motion-safe:data-[state=closed]:zoom-out-95 motion-safe:data-[side=bottom]:slide-in-from-top-2 motion-safe:data-[side=left]:slide-in-from-right-2 motion-safe:data-[side=right]:slide-in-from-left-2 motion-safe:data-[side=top]:slide-in-from-bottom-2 z-50 w-fit rounded-md px-3 py-1.5 text-xs text-balance',
              props.class,
            )
          "
        >
          <slot />
    
          <TooltipArrow
            class="bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]"
          />
        </TooltipContent>
      </TooltipPortal>
    </template>
  • app/components/ui/tooltip/TooltipProvider.vue 0.5 kB
    <script setup lang="ts">
    import type { TooltipProviderProps } from 'reka-ui'
    import { TooltipProvider } from 'reka-ui'
    
    // Defaults follow Radix conventions: 700ms open delay for ambient tooltips,
    // 300ms skip-delay so once one tooltip opens, neighbors skip the wait.
    const props = withDefaults(defineProps<TooltipProviderProps>(), {
      delayDuration: 700,
      skipDelayDuration: 300,
    })
    </script>
    
    <template>
      <TooltipProvider v-bind="props">
        <slot />
      </TooltipProvider>
    </template>
  • app/components/ui/tooltip/TooltipTrigger.vue 0.3 kB
    <script setup lang="ts">
    import type { TooltipTriggerProps } from 'reka-ui'
    import { TooltipTrigger } from 'reka-ui'
    
    const props = defineProps<TooltipTriggerProps>()
    </script>
    
    <template>
      <TooltipTrigger data-uipkge data-slot="tooltip-trigger" v-bind="props">
        <slot />
      </TooltipTrigger>
    </template>
  • app/components/ui/tooltip/index.ts 0.2 kB
    export { default as Tooltip } from './Tooltip.vue'
    export { default as TooltipContent } from './TooltipContent.vue'
    export { default as TooltipProvider } from './TooltipProvider.vue'
    export { default as TooltipTrigger } from './TooltipTrigger.vue'

Raw manifest: https://uipkge.dev/r/vue/tooltip.json