Glrk UI

Tooltip

A simplified wrapper for Shadcn Tooltip with flexible option handling and automatic type conversion

Installation

npx shadcn@latest add @glrk-ui/tooltip

If you haven't set up the prerequisites yet, check out Prerequest section.

Copy and paste the following code into shadcn tooltip component.

ui/tooltip.tsx
type TooltipWrapperProps = {
  trigger: React.ReactNode
  content: React.ReactNode
  triggerCls?: string
  contentCls?: string
  contentProps?: Omit<React.ComponentProps<typeof TooltipPrimitive.Content>, "className">
} & Omit<React.ComponentProps<typeof TooltipPrimitive.Provider>, "children">

function TooltipWrapper({
  trigger,
  content,
  triggerCls,
  contentCls,
  contentProps,
  ...props
}: TooltipWrapperProps) {
  return (
    <Tooltip {...props}>
      <TooltipTrigger
        className={triggerCls}
        asChild={typeof trigger !== "string"}
      >
        {trigger}
      </TooltipTrigger>

      <TooltipContent {...contentProps} className={contentCls}>
        {content}
      </TooltipContent>
    </Tooltip>
  )
}

Updated TooltipWrapper in the export block.

export {
  Tooltip,
  TooltipTrigger,
  TooltipContent,
  TooltipProvider,
  TooltipWrapper,
}

Installation

npm install @radix-ui/react-tooltip

tooltip.tsx

Copy and paste the following code into your project.

ui/tooltip.tsx
"use client"

import * as React from "react"
import * as TooltipPrimitive from "@radix-ui/react-tooltip"

import { cn } from "@/lib/utils"

function TooltipProvider({
  delayDuration = 0,
  ...props
}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
  return (
    <TooltipPrimitive.Provider
      data-slot="tooltip-provider"
      delayDuration={delayDuration}
      {...props}
    />
  )
}

function Tooltip({
  ...props
}: React.ComponentProps<typeof TooltipPrimitive.Root>) {
  return (
    <TooltipProvider>
      <TooltipPrimitive.Root data-slot="tooltip" {...props} />
    </TooltipProvider>
  )
}

function TooltipTrigger({
  ...props
}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
  return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />
}

function TooltipContent({
  className,
  sideOffset = 0,
  children,
  ...props
}: React.ComponentProps<typeof TooltipPrimitive.Content>) {
  return (
    <TooltipPrimitive.Portal>
      <TooltipPrimitive.Content
        data-slot="tooltip-content"
        sideOffset={sideOffset}
        className={cn(
          "bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",
          className
        )}
        {...props}
      >
        {children}
        <TooltipPrimitive.Arrow className="bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" />
      </TooltipPrimitive.Content>
    </TooltipPrimitive.Portal>
  )
}

type TooltipWrapperProps = {
  trigger: React.ReactNode
  content: React.ReactNode
  triggerCls?: string
  contentCls?: string
  contentProps?: Omit<React.ComponentProps<typeof TooltipPrimitive.Content>, "className">
} & Omit<React.ComponentProps<typeof TooltipPrimitive.Provider>, "children">

function TooltipWrapper({
  trigger,
  content,
  triggerCls,
  contentCls,
  contentProps,
  ...props
}: TooltipWrapperProps) {
  return (
    <Tooltip {...props}>
      <TooltipTrigger
        className={triggerCls}
        asChild={typeof trigger !== "string"}
      >
        {trigger}
      </TooltipTrigger>

      <TooltipContent {...contentProps} className={contentCls}>
        {content}
      </TooltipContent>
    </Tooltip>
  )
}

export {
  Tooltip,
  TooltipTrigger,
  TooltipContent,
  TooltipProvider,
  TooltipWrapper,
}

Done

You can now use TooltipWrapper

Usage

Basic

import { TooltipWrapper } from "@/components/ui/tooltip";

export function Basic() {
  return (
     <TooltipWrapper
      trigger="Hover"
      content="Some tooltip content"
    />
  )
}

Reference

TooltipWrapper

Prop

Type