Tooltip

PreviousNext

React aria components Tooltip with shadcn characteristics.

Docs
ouiui

Preview

Loading preview…
registry/default/ui/oui-tooltip.tsx
"use client";

import * as React from "react";
import * as Rac from "react-aria-components";
import { composeTailwindRenderProps } from "./oui-base";

export function Tooltip({
  offset = 7,
  className,
  children,
  ...props
}: React.ComponentProps<typeof Rac.Tooltip>) {
  return (
    <Rac.Tooltip
      data-slot="tooltip"
      offset={offset}
      className={composeTailwindRenderProps(className, [
        "z-50 w-fit rounded-md bg-foreground px-3 py-1.5 text-xs text-balance text-background",
        "data-entering:animate-in data-entering:fade-in-0 data-entering:zoom-in-95",
        "data-exiting:animate-out data-exiting:fade-out-0 data-exiting:zoom-out-95",
        "data-[placement=bottom]:slide-in-from-top-2",
        "data-[placement=left]:slide-in-from-right-2",
        "data-[placement=right]:slide-in-from-left-2",
        "data-[placement=top]:slide-in-from-bottom-2",
        "transform-origin-[var(--trigger-anchor-point)]",
      ])}
      {...props}
    >
      {(renderProps) => (
        <>
          <OverlayArrow />
          {typeof children === "function" ? children(renderProps) : children}
        </>
      )}
    </Rac.Tooltip>
  );
}

export function OverlayArrow(
  props: React.ComponentProps<typeof Rac.OverlayArrow>,
) {
  return (
    <Rac.OverlayArrow
      data-slot="overlay-arrow"
      className={composeTailwindRenderProps(
        props.className,
        "fill-foreground stroke-foreground",
      )}
      {...props}
    >
      <svg width={8} height={8} viewBox="0 0 8 8" className="size-2">
        <path d="m0 0 4 4 4-4" />
      </svg>
    </Rac.OverlayArrow>
  );
}

Installation

npx shadcn@latest add @oui/oui-tooltip

Usage

import { OuiTooltip } from "@/components/ui/oui-tooltip"
<OuiTooltip />