shadcn.io is not affiliated with official shadcn/ui
Shadcn Toggle Tooltip for React and Tailwind
Display information on click.
Installation
bunx --bun shadcn@latest add https://kit.dev/r/toggle-tooltip.jsonpnpm dlx shadcn@latest add https://kit.dev/r/toggle-tooltip.jsonnpx shadcn@latest add https://kit.dev/r/toggle-tooltip.jsonyarn shadcn@latest add https://kit.dev/r/toggle-tooltip.jsonThis component depends on Popover. Install it first if you haven't already.
Install the following dependencies:
bun add @ark-ui/reactpnpm add @ark-ui/reactnpm install @ark-ui/reactyarn add @ark-ui/reactCopy and paste the following code into your project.
"use client";
import { Popover as ArkPopover } from "@ark-ui/react/popover";
import { Portal } from "@ark-ui/react/portal";
import type React from "react";
import { cn } from "@/lib/utils";
import { Popover, PopoverTrigger } from "@/components/ui/popover";
export const ToggleTooltip = (
props: React.ComponentProps<typeof ArkPopover.Root>
) => {
const {
positioning = { placement: "top" },
lazyMount = true,
unmountOnExit = true,
modal = false,
open: controlledOpen,
...rest
} = props;
return (
<Popover
data-slot="toggle-tooltip"
lazyMount={lazyMount}
modal={modal}
positioning={positioning}
unmountOnExit={unmountOnExit}
{...rest}
/>
);
};
export const ToggleTooltipTrigger = (
props: React.ComponentProps<typeof ArkPopover.Trigger>
) => <PopoverTrigger data-slot="toggle-tooltip-trigger" {...props} />;
export const ToggleTooltipContent = (
props: React.ComponentProps<typeof ArkPopover.Content>
) => {
const { className, children, ...rest } = props;
return (
<Portal>
<ArkPopover.Positioner data-slot="toggle-tooltip-positioner">
<ArkPopover.Content
className={cn(
"z-50 w-fit",
"px-3 py-1.5",
"bg-foreground",
"text-background text-xs",
"rounded-lg shadow-lg/5",
"origin-(--transform-origin) animate-in",
"fade-in-0 zoom-in-[98%]",
"data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-[98%]",
"data-[state=closed]:animate-out",
"data-[placement=bottom]:slide-in-from-top-2",
"data-[placement=left]:slide-in-from-end-2",
"data-[placement=right]:slide-in-from-start-2",
"data-[placement=top]:slide-in-from-bottom-2",
"motion-reduce:animate-none!",
className
)}
data-slot="toggle-tooltip-content"
{...rest}
>
{children}
<ToggleTooltipArrow />
</ArkPopover.Content>
</ArkPopover.Positioner>
</Portal>
);
};
export const ToggleTooltipArrow = (
props: React.ComponentProps<typeof ArkPopover.Arrow>
) => {
const { style, ...rest } = props;
return (
<ArkPopover.Arrow
data-slot="toggle-tooltip-arrow"
style={
{
"--arrow-background": "var(--foreground)",
"--arrow-size": "calc(1.5 * var(--spacing))",
...style,
} as React.CSSProperties
}
{...rest}
>
<ArkPopover.ArrowTip />
</ArkPopover.Arrow>
);
};Update the import paths to match your project setup.
Anatomy
ToggleTooltipArrow
└── ToggleTooltipArrowTip
ToggleTooltipAnchor
ToggleTooltipTrigger
ToggleTooltipIndicator
ToggleTooltipContent
└── ToggleTooltipPositioner
ToggleTooltipTitle
ToggleTooltipDescription
ToggleTooltipCloseTriggerUsage
import { InfoIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
ToggleTooltip,
ToggleTooltipContent,
ToggleTooltipTrigger,
} from "@/components/ui/toggle-tooltip";<ToggleTooltip>
<ToggleTooltipTrigger asChild>
<Button aria-label="More information" size="icon-md" variant="outline">
<InfoIcon />
</Button>
</ToggleTooltipTrigger>
<ToggleTooltipContent className="max-w-52">
Hover or click to see this content. Works on touch devices too.
</ToggleTooltipContent>
</ToggleTooltip>Accessibility
| Key | Description |
|---|---|
Enter | Activate the focused control. |
Space | Activate the focused control. |
Demos
Info Icon
Side
With Link
API Reference
ToggleTooltip
PropType
AttributeType
ToggleTooltipArrow
div
PropType
AttributeType
CSS variableType
ToggleTooltipArrowTip
div
PropType
AttributeType
CSS variableType
ToggleTooltipTrigger
button
PropType
AttributeType
ToggleTooltipPositioner
div
PropType
AttributeType
CSS variableType
ToggleTooltipContent
div
PropType
AttributeType
CSS variableType