Search for a command to run...
A popup that displays information related to an element when the element receives keyboard focus or the mouse hovers over it.
npx shadcn@latest add @zaidan/tooltippnpx shadcn add @zaidan/tooltipyarn dlx shadcn@latest add @zaidan/tooltipbunx shadcn@latest add @zaidan/tooltipInstall the following dependencies:
npm i @kobalte/corepnpm add @kobalte/coreyarn add @kobalte/corebun add @kobalte/coreCopy and paste the following code into your project.
1import type { PolymorphicProps } from "@kobalte/core/polymorphic";2import * as TooltipPrimitive from "@kobalte/core/tooltip";3import type { ComponentProps, ValidComponent } from "solid-js";4import { mergeProps, splitProps } from "solid-js";5import { cn } from "~/lib/utils";6
7const Tooltip = (props: TooltipPrimitive.TooltipRootProps) => {8 const mergedProps = mergeProps(9 {10 openDelay: 0,11 placement: "top",12 } as TooltipPrimitive.TooltipRootProps,13 props,14 );15 return <TooltipPrimitive.Root data-slot="tooltip" {...mergedProps} />;16};17
18type TooltipTriggerProps<T extends ValidComponent = "button"> = PolymorphicProps<19 T,20 TooltipPrimitive.TooltipTriggerProps<T>21>;22
23const TooltipTrigger = <T extends ValidComponent = "button">(props: TooltipTriggerProps<T>) => (24 <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />25);26
27type TooltipContentProps<T extends ValidComponent = "div"> = PolymorphicProps<28 T,29 TooltipPrimitive.TooltipContentProps<T>30> &31 Pick<ComponentProps<T>, "class" | "children">;32
33const TooltipContent = <T extends ValidComponent = "div">(props: TooltipContentProps<T>) => {34 const [local, others] = splitProps(props as TooltipContentProps, ["class", "children"]);35 return (36 <TooltipPrimitive.Portal>37 <TooltipPrimitive.Content38 data-slot="tooltip-content"39 class={cn(40 "z-50 z-tooltip-content w-fit max-w-xs origin-(--kb-tooltip-content-transform-origin) bg-foreground text-background",41 local.class,42 )}43 {...others}44 >45 {local.children}46 <TooltipPrimitive.Arrow size={19} />47 </TooltipPrimitive.Content>48 </TooltipPrimitive.Portal>49 );50};51
52export { Tooltip, TooltipTrigger, TooltipContent };Here are the source code of all the examples from the preview page:
import { Button } from "~/components/ui/button";import { Tooltip, TooltipContent, TooltipTrigger } from "~/components/ui/tooltip";function TooltipBasic() { return ( <Example title="Basic"> <Tooltip> <TooltipTrigger as={Button} variant="outline" class="w-fit"> Show Tooltip </TooltipTrigger> <TooltipContent> <p>Add to library</p> </TooltipContent> </Tooltip> </Example> );}import { For } from "solid-js";import { Button } from "~/components/ui/button";import { Tooltip, TooltipContent, TooltipTrigger } from "~/components/ui/tooltip";function TooltipSides() { return ( <Example title="Sides"> <div class="flex flex-wrap gap-2"> <For each={["top", "right", "bottom", "left"] as const}> {(side) => ( <Tooltip placement={side}> <TooltipTrigger as={Button} variant="outline" class="w-fit capitalize"> {side} </TooltipTrigger> <TooltipContent> <p>Add to library</p> </TooltipContent> </Tooltip> )} </For> </div> </Example> );}import { Info } from "lucide-solid";import { Button } from "~/components/ui/button";import { Tooltip, TooltipContent, TooltipTrigger } from "~/components/ui/tooltip";function TooltipWithIcon() { return ( <Example title="With Icon"> <Tooltip> <TooltipTrigger as={Button} variant="ghost" size="icon"> <Info /> <span class="sr-only">Info</span> </TooltipTrigger> <TooltipContent> <p>Additional information</p> </TooltipContent> </Tooltip> </Example> );}import { Button } from "~/components/ui/button";import { Tooltip, TooltipContent, TooltipTrigger } from "~/components/ui/tooltip";function TooltipLongContent() { return ( <Example title="Long Content"> <Tooltip> <TooltipTrigger as={Button} variant="outline" class="w-fit"> Show Tooltip </TooltipTrigger> <TooltipContent> To learn more about how this works, check out the docs. If you have any questions, please reach out to us. </TooltipContent> </Tooltip> </Example> );}import { Button } from "~/components/ui/button";import { Tooltip, TooltipContent, TooltipTrigger } from "~/components/ui/tooltip";function TooltipDisabled() { return ( <Example title="Disabled"> <Tooltip> <TooltipTrigger as="span" class="inline-block w-fit"> <Button variant="outline" disabled> Disabled </Button> </TooltipTrigger> <TooltipContent> <p>This feature is currently unavailable</p> </TooltipContent> </Tooltip> </Example> );}import { Save } from "lucide-solid";import { Button } from "~/components/ui/button";import { Kbd } from "~/components/ui/kbd";import { Tooltip, TooltipContent, TooltipTrigger } from "~/components/ui/tooltip";function TooltipWithKeyboard() { return ( <Example title="With Keyboard Shortcut"> <Tooltip> <TooltipTrigger as={Button} variant="outline" size="icon-sm"> <Save /> </TooltipTrigger> <TooltipContent class="pr-1.5"> <div class="flex items-center gap-2"> Save Changes <Kbd>S</Kbd> </div> </TooltipContent> </Tooltip> </Example> );}import { Tooltip, TooltipContent, TooltipTrigger } from "~/components/ui/tooltip";function TooltipOnLink() { return ( <Example title="On Link"> <Tooltip> <TooltipTrigger as="a" href="#" class="w-fit text-primary text-sm underline-offset-4 hover:underline" onClick={(e: MouseEvent) => e.preventDefault()} > Learn more </TooltipTrigger> <TooltipContent> <p>Click to read the documentation</p> </TooltipContent> </Tooltip> </Example> );}import { Button } from "~/components/ui/button";import { Tooltip, TooltipContent, TooltipTrigger } from "~/components/ui/tooltip";function TooltipFormatted() { return ( <Example title="Formatted Content"> <Tooltip> <TooltipTrigger as={Button} variant="outline" class="w-fit"> Status </TooltipTrigger> <TooltipContent> <div class="flex flex-col gap-1"> <p class="font-semibold">Active</p> <p class="text-xs opacity-80">Last updated 2 hours ago</p> </div> </TooltipContent> </Tooltip> </Example> );}