hover-card.tsx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. 'use client';
  2. import { PreviewCard as PreviewCardPrimitive } from '@base-ui/react/preview-card';
  3. import { cn } from '@/lib/utils';
  4. function HoverCard({ ...props }: PreviewCardPrimitive.Root.Props) {
  5. return <PreviewCardPrimitive.Root data-slot="hover-card" {...props} />;
  6. }
  7. function HoverCardTrigger({ ...props }: PreviewCardPrimitive.Trigger.Props) {
  8. return (
  9. <PreviewCardPrimitive.Trigger data-slot="hover-card-trigger" {...props} />
  10. );
  11. }
  12. function HoverCardContent({
  13. className,
  14. side = 'bottom',
  15. sideOffset = 4,
  16. align = 'center',
  17. alignOffset = 4,
  18. ...props
  19. }: PreviewCardPrimitive.Popup.Props &
  20. Pick<
  21. PreviewCardPrimitive.Positioner.Props,
  22. 'align' | 'alignOffset' | 'side' | 'sideOffset'
  23. >) {
  24. return (
  25. <PreviewCardPrimitive.Portal data-slot="hover-card-portal">
  26. <PreviewCardPrimitive.Positioner
  27. align={align}
  28. alignOffset={alignOffset}
  29. side={side}
  30. sideOffset={sideOffset}
  31. className="isolate z-50"
  32. >
  33. <PreviewCardPrimitive.Popup
  34. data-slot="hover-card-content"
  35. className={cn(
  36. 'data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open: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 ring-foreground/10 bg-popover text-popover-foreground w-64 rounded-lg p-2.5 text-sm shadow-md ring-1 duration-100 data-[side=inline-start]:slide-in-from-right-2 data-[side=inline-end]:slide-in-from-left-2 z-50 origin-(--transform-origin) outline-hidden',
  37. className,
  38. )}
  39. {...props}
  40. />
  41. </PreviewCardPrimitive.Positioner>
  42. </PreviewCardPrimitive.Portal>
  43. );
  44. }
  45. export { HoverCard, HoverCardTrigger, HoverCardContent };