Component

Tooltip

A hint on hover that brings its own provider.

stablev0.2.0 Chromium 103 ui-scale safe

Install

Copies the file into components/ds/, with its registry dependencies and npm packages. See Installation for the one-time setup.
bunx shadcn@3 add @fastrp/tooltip

Examples

Default

Open alone

API

<Tooltip />Takes the props of what it wraps

Brings its own provider, so a tooltip works anywhere without an app-level `TooltipProvider` — the missing provider is the error every copy of the shadcn tooltip eventually throws. The inner provider wins over any outer one, so set a different delay per tooltip with `delayDuration`.

Dependencies

npm

  • @radix-ui/react-tooltip@^1.1.6

Registry

  • @fastrp/utils

Source

components/ds/tooltip.tsxShow
'use client';

import * as TooltipPrimitive from '@radix-ui/react-tooltip';
import type * as React from 'react';
import { cn } from '@/lib/utils';

// @fast-ds [email protected]

function TooltipProvider({
  delayDuration = 200,
  ...props
}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
  return <TooltipPrimitive.Provider delayDuration={delayDuration} {...props} />;
}

/**
 * Brings its own provider, so a tooltip works anywhere without an app-level `TooltipProvider` —
 * the missing provider is the error every copy of the shadcn tooltip eventually throws. The inner
 * provider wins over any outer one, so set a different delay per tooltip with `delayDuration`.
 */
function Tooltip(props: React.ComponentProps<typeof TooltipPrimitive.Root>) {
  return (
    <TooltipProvider>
      <TooltipPrimitive.Root data-slot="tooltip" {...props} />
    </TooltipProvider>
  );
}

const TooltipTrigger = TooltipPrimitive.Trigger;

function TooltipContent({
  className,
  sideOffset = 6,
  children,
  ...props
}: React.ComponentProps<typeof TooltipPrimitive.Content>) {
  return (
    <TooltipPrimitive.Portal>
      <TooltipPrimitive.Content
        data-slot="tooltip-content"
        sideOffset={sideOffset}
        className={cn(
          'z-tooltip max-w-xs origin-[var(--radix-tooltip-content-transform-origin)] rounded-md bg-foreground px-2.5 py-1.5 text-xs font-medium leading-snug text-background shadow-xl 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-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1',
          className,
        )}
        {...props}
      >
        {children}
      </TooltipPrimitive.Content>
    </TooltipPrimitive.Portal>
  );
}

export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };