返回 AiToEarn
hover-card.tsx
根目录 / project / aitoearn-web / src / components / ui / hover-card.tsx
1 'use client'
2
3 import * as HoverCardPrimitive from '@radix-ui/react-hover-card'
4 import * as React from 'react'
5
6 import { cn } from '@/utils/className'
7
8 const HoverCard = HoverCardPrimitive.Root
9
10 const HoverCardTrigger = HoverCardPrimitive.Trigger
11
12 interface HoverCardContentProps extends React.ComponentPropsWithoutRef<
13 typeof HoverCardPrimitive.Content
14 > {
15 /**
16 * 是否允许内部滚动(禁用 Radix 的滚动锁定)
17 * 当 HoverCard 内部有可滚动内容时设置为 true
18 */
19 allowInnerScroll?: boolean
20 }
21
22 const HoverCardContent = React.forwardRef<
23 React.ElementRef<typeof HoverCardPrimitive.Content>,
24 HoverCardContentProps
25 >(({ className, align = 'center', sideOffset = 4, allowInnerScroll = false, ...props }, ref) => (
26 <HoverCardPrimitive.Portal>
27 <HoverCardPrimitive.Content
28 ref={ref}
29 align={align}
30 sideOffset={sideOffset}
31 className={cn(
32 'z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=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',
33 className,
34 )}
35 onWheel={allowInnerScroll ? e => e.stopPropagation() : undefined}
36 onTouchMove={allowInnerScroll ? e => e.stopPropagation() : undefined}
37 {...props}
38 />
39 </HoverCardPrimitive.Portal>
40 ))
41 HoverCardContent.displayName = HoverCardPrimitive.Content.displayName
42
43 export { HoverCard, HoverCardContent, HoverCardTrigger }
44
44 lines Plain Text