返回 oh-my-ppt
ScrollArea.tsx
根目录 / src / renderer / src / components / ui / ScrollArea.tsx
1 import * as React from 'react'
2 import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'
3 import { cn } from '@renderer/lib/utils'
4
5 interface ScrollAreaProps extends React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root> {
6 viewportClassName?: string
7 viewportRef?: React.Ref<HTMLDivElement>
8 onViewportScroll?: React.UIEventHandler<HTMLDivElement>
9 scrollbars?: 'vertical' | 'horizontal' | 'both'
10 }
11
12 export function ScrollArea({
13 className,
14 children,
15 viewportClassName,
16 viewportRef,
17 onViewportScroll,
18 scrollbars = 'vertical',
19 ...props
20 }: ScrollAreaProps) {
21 return (
22 <ScrollAreaPrimitive.Root className={cn('relative overflow-hidden', className)} {...props}>
23 <ScrollAreaPrimitive.Viewport
24 ref={viewportRef}
25 onScroll={onViewportScroll}
26 className={cn('h-full w-full rounded-[inherit]', viewportClassName)}
27 >
28 {children}
29 </ScrollAreaPrimitive.Viewport>
30 {(scrollbars === 'vertical' || scrollbars === 'both') && <ScrollBar orientation="vertical" />}
31 {(scrollbars === 'horizontal' || scrollbars === 'both') && <ScrollBar orientation="horizontal" />}
32 <ScrollAreaPrimitive.Corner className="bg-transparent" />
33 </ScrollAreaPrimitive.Root>
34 )
35 }
36
37 const ScrollBar = React.forwardRef<
38 React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,
39 React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>
40 >(({ className, orientation = 'vertical', ...props }, ref) => (
41 <ScrollAreaPrimitive.ScrollAreaScrollbar
42 ref={ref}
43 orientation={orientation}
44 className={cn(
45 'flex touch-none select-none p-0.5 transition-colors',
46 orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent',
47 orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent',
48 className
49 )}
50 {...props}
51 >
52 <ScrollAreaPrimitive.ScrollAreaThumb className="relative flex-1 rounded-full bg-[#8ca66e]/70 transition-colors before:absolute before:left-1/2 before:top-1/2 before:h-full before:min-h-8 before:w-full before:min-w-8 before:-translate-x-1/2 before:-translate-y-1/2 hover:bg-[#6f8159]/82" />
53 </ScrollAreaPrimitive.ScrollAreaScrollbar>
54 ))
55 ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName
56
56 lines Plain Text