tooltip.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import * as TooltipPrimitive from '@radix-ui/react-tooltip';
  2. import * as React from 'react';
  3. import { cn } from '@/common/helpers/cn';
  4. function TooltipProvider({ delayDuration = 0, ...props }: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
  5. return <TooltipPrimitive.Provider data-slot="tooltip-provider" delayDuration={delayDuration} {...props} />;
  6. }
  7. function Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {
  8. return (
  9. <TooltipProvider>
  10. <TooltipPrimitive.Root data-slot="tooltip" {...props} />
  11. </TooltipProvider>
  12. );
  13. }
  14. function TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
  15. return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />;
  16. }
  17. function TooltipContent({ className, sideOffset = 4, children, ...props }: React.ComponentProps<typeof TooltipPrimitive.Content>) {
  18. return (
  19. <TooltipPrimitive.Portal>
  20. <TooltipPrimitive.Content
  21. data-slot="tooltip-content"
  22. sideOffset={sideOffset}
  23. className={cn(
  24. 'z-50 max-w-sm rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',
  25. className,
  26. )}
  27. {...props}
  28. >
  29. {children}
  30. <TooltipPrimitive.Arrow className="z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-primary fill-primary" />
  31. </TooltipPrimitive.Content>
  32. </TooltipPrimitive.Portal>
  33. );
  34. }
  35. export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };