返回 AiToEarn
popover.tsx
根目录 / project / aitoearn-web / src / components / ui / popover.tsx
1 'use client'
2
3 import * as PopoverPrimitive from '@radix-ui/react-popover'
4 import * as React from 'react'
5
6 import { cn } from '@/utils/className'
7
8 const Popover = PopoverPrimitive.Root
9
10 const PopoverTrigger = PopoverPrimitive.Trigger
11
12 const PopoverAnchor = PopoverPrimitive.Anchor
13
14 interface PopoverContentProps extends React.ComponentPropsWithoutRef<
15 typeof PopoverPrimitive.Content
16 > {
17 /**
18 * 是否允许内部滚动(禁用 Radix 的滚动锁定)
19 * 当 Popover 内部有可滚动内容时设置为 true
20 */
21 allowInnerScroll?: boolean
22 }
23
24 const PopoverContent = React.forwardRef<
25 React.ElementRef<typeof PopoverPrimitive.Content>,
26 PopoverContentProps
27 >(({ className, align = 'center', sideOffset = 4, allowInnerScroll = false, ...props }, ref) => (
28 <PopoverPrimitive.Portal>
29 <PopoverPrimitive.Content
30 ref={ref}
31 align={align}
32 sideOffset={sideOffset}
33 className={cn(
34 'z-50 w-72 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',
35 className,
36 )}
37 // 允许内部滚动:阻止滚轮和触摸事件冒泡到 Radix 的滚动锁定层
38 onWheel={allowInnerScroll ? e => e.stopPropagation() : undefined}
39 onTouchMove={allowInnerScroll ? e => e.stopPropagation() : undefined}
40 {...props}
41 />
42 </PopoverPrimitive.Portal>
43 ))
44 PopoverContent.displayName = PopoverPrimitive.Content.displayName
45
46 export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger }
47
47 lines Plain Text