Tooltip
8starlabs-ui/tooltipFreeComponent
A Base UI tooltip component
Live preview
live · rendered by the registry
Rendered by 8starlabs-ui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://ui.8starlabs.com/r/tooltip.jsonSource
1"use client";23import * as React from "react";4import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";5import { Popover as PopoverPrimitive } from "@base-ui/react/popover";67import { cn } from "@/lib/utils";89type TooltipMode = "tooltip" | "popover";1011const DESKTOP_TOOLTIP_QUERY =12 "(hover: hover) and (pointer: fine) and (min-width: 1024px)";1314const TOOLTIP_CONTENT_CLASSNAME =15 "bg-foreground text-background z-50 w-fit origin-(--transform-origin) rounded-md px-3 py-1.5 text-xs text-balance transition-[transform,scale,opacity] data-[starting-style]:scale-95 data-[starting-style]:opacity-0 data-[ending-style]:scale-95 data-[ending-style]:opacity-0";1617const TOOLTIP_ARROW_CLASSNAME =18 "bg-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]";1920const TooltipModeContext = React.createContext<TooltipMode>("tooltip");2122function getTooltipMode(query: MediaQueryList): TooltipMode {23 return query.matches ? "tooltip" : "popover";24}2526function useTooltipMode(): TooltipMode {27 const [mode, setMode] = React.useState<TooltipMode>("tooltip");2829 React.useEffect(() => {30 const query = window.matchMedia(DESKTOP_TOOLTIP_QUERY);31 const updateMode = () => setMode(getTooltipMode(query));3233 updateMode();34 query.addEventListener("change", updateMode);3536 return () => query.removeEventListener("change", updateMode);37 }, []);3839 return mode;40}4142function TooltipProvider({43 delayDuration = 0,44 ...props45}: Omit<TooltipPrimitive.Provider.Props, "delay"> & {46 delayDuration?: number;47}) {48 return <TooltipPrimitive.Provider delay={delayDuration} {...props} />;49}5051function Tooltip({52 children,53 open,54 defaultOpen,55 onOpenChange,56 delayDuration,57 disableHoverableContent,58 ...props59}: Omit<TooltipPrimitive.Root.Props, "onOpenChange"> & {60 onOpenChange?: (open: boolean) => void;61 delayDuration?: number;62 disableHoverableContent?: boolean;63}) {64 const mode = useTooltipMode();6566 return (67 <TooltipModeContext.Provider value={mode}>68 {mode === "tooltip" ? (69 <TooltipProvider delayDuration={delayDuration}>70 <TooltipPrimitive.Root71 open={open}72 defaultOpen={defaultOpen}73 onOpenChange={onOpenChange}74 disableHoverablePopup={disableHoverableContent}75 {...props}76 >77 {children}78 </TooltipPrimitive.Root>79 </TooltipProvider>80 ) : (81 <PopoverPrimitive.Root82 open={open}83// … truncated
What it pulls in
npm packages
Files it writes
More from 8starlabs-ui
All 74 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Buttonbutton | 8starlabs-ui | Components | Free | 2 deps | |
| Collapsiblecollapsible | 8starlabs-ui | Components | Free | 1 dep | |
| Dropdown Menudropdown-menu | 8starlabs-ui | Components | Free | 2 deps | |
| Flip clockflip-clock | 8starlabs-ui | Components | Free | no deps | |
| Heatmapheatmap | 8starlabs-ui | Components | Free | no deps | |
| Inputinput | 8starlabs-ui | Components | Free | no deps | |
| JSON Viewerjson-viewer | 8starlabs-ui | Components | Free | 1 dep · 3 files | |
| Labellabel | 8starlabs-ui | Components | Free | no deps |
