Tooltip
trovecn/tooltipFreeComponent
Fast, fading label with minimal collision-aware travel from its trigger.
Install it
npx shadcn@latest add https://trovecn.dev/r/tooltip.jsonSource
1"use client";23import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";4import { motion, useReducedMotion } from "motion/react";56import { cn } from "@/lib/utils";7import { spring } from "@/lib/springs";8import { fontWeights } from "@/lib/font-weight";910/** Fast, deliberate — a tooltip that opened as slowly as a dialog would feel11 * laggy for something this small; 200ms strikes the balance between12 * "confirms intent" and "instant." */13const defaultDelay = 200;1415function TooltipProvider({ delay = defaultDelay, ...props }: TooltipPrimitive.Provider.Props) {16 return <TooltipPrimitive.Provider data-slot="tooltip-provider" delay={delay} {...props} />;17}1819function Tooltip({ ...props }: TooltipPrimitive.Root.Props) {20 return <TooltipPrimitive.Root data-slot="tooltip" {...props} />;21}2223function TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) {24 return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />;25}2627/** A few pixels of slide toward the trigger, on top of the fade. Base UI's28 * resolved side keeps that cue correct when collision handling flips the29 * placement. */30function slideOffset(side: NonNullable<TooltipPrimitive.Positioner.Props["side"]>) {31 switch (side) {32 case "top":33 return { y: 4 };34 case "bottom":35 return { y: -4 };36 case "left":37 return { x: 4 };38 case "right":39 return { x: -4 };40 default:41 return {};42 }43}4445function TooltipContent({46 className,47 side = "top",48 sideOffset = 8,49 align = "center",50 alignOffset = 0,51 children,52 ...props53}: TooltipPrimitive.Popup.Props &54 Pick<TooltipPrimitive.Positioner.Props, "align" | "alignOffset" | "side" | "sideOffset">) {55 const reduceMotion = useReducedMotion();5657 return (58 <TooltipPrimitive.Portal>59 <TooltipPrimitive.Positioner60 data-slot="tooltip-positioner"61 align={align}62 alignOffset={alignOffset}63 side={side}64 sideOffset={sideOffset}65 className="z-50"66 >67 <TooltipPrimitive.Popup68 data-slot="tooltip-content"69 render={(popupProps, state) => {70 const exiting = state.transitionStatus === "ending";71 const offset = reduceMotion ? {} : slideOffset(state.side);72 return (73 <motion.div74 {...(popupProps as Record<string, unknown>)}75 {...(props as Record<string, unknown>)}76 className={cn(77// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from trovecn
All 26 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | trovecn | Components | Free | 3 deps | |
| Agent Activityagent-activity | trovecn | Components | Free | 2 deps | |
| Approval Requestapproval-request | trovecn | Components | Free | 2 deps | |
| Buttonbutton | trovecn | Components | Free | 2 deps | |
| Checkboxcheckbox | trovecn | Components | Free | 2 deps | |
| Checkbox Groupcheckbox-group | trovecn | Components | Free | 2 deps | |
| Comboboxcombobox | trovecn | Components | Free | 3 deps | |
| Comparison Slidercomparison-slider | trovecn | Components | Free | 1 dep |
