import * as React from 'react' import { ScrollArea as BaseScrollArea } from '@base-ui/react/scroll-area' import { cn } from '../../internal/utils' type ScrollAreaOrientation = 'vertical' | 'horizontal' | 'both' type ScrollbarVisibility = 'always' | 'auto' | 'never' const SCROLL_SHADOW_CLASSES = cn( 'mask-no-repeat mask-intersect', 'ltr:[mask-image:linear-gradient(to_bottom,transparent_0,black_min(40px,var(--scroll-area-overflow-y-start)),black_calc(100%_-_min(40px,var(--scroll-area-overflow-y-end,40px))),transparent_100%),linear-gradient(to_right,transparent_0,black_min(40px,var(--scroll-area-overflow-x-start)),black_calc(100%_-_min(40px,var(--scroll-area-overflow-x-end,40px))),transparent_100%)]', 'rtl:[mask-image:linear-gradient(to_bottom,transparent_0,black_min(40px,var(--scroll-area-overflow-y-start)),black_calc(100%_-_min(40px,var(--scroll-area-overflow-y-end,40px))),transparent_100%),linear-gradient(to_left,transparent_0,black_min(40px,var(--scroll-area-overflow-x-start)),black_calc(100%_-_min(40px,var(--scroll-area-overflow-x-end,40px))),transparent_100%)]', ) const SCROLLBAR_AUTO_CLASSES = cn( 'pointer-events-none opacity-0', 'data-[hovering]:pointer-events-auto data-[hovering]:opacity-100', 'data-[scrolling]:pointer-events-auto data-[scrolling]:opacity-100 data-[scrolling]:duration-0', ) interface ScrollAreaProps extends React.ComponentProps { /** * Which axis (or axes) gets a scrollbar. `both` also renders the corner. * @default 'vertical' */ orientation?: ScrollAreaOrientation /** * Fade the content at scrollable edges via a CSS mask. * @default false */ scrollShadow?: boolean /** * `auto` reveals the bar on hover/scroll; `never` hides it while keeping content scrollable. * @default 'always' */ scrollbarVisibility?: ScrollbarVisibility /** Props forwarded to the inner scroll viewport - `ref`, `onScroll`, `className`, etc. */ viewportProps?: Omit, 'children'> } function ScrollArea({ orientation = 'vertical', scrollShadow = false, scrollbarVisibility = 'always', className, children, viewportProps, ...props }: ScrollAreaProps) { const showVertical = scrollbarVisibility !== 'never' && (orientation === 'vertical' || orientation === 'both') const showHorizontal = scrollbarVisibility !== 'never' && (orientation === 'horizontal' || orientation === 'both') return ( {children} {showVertical && } {showHorizontal && } {orientation === 'both' && scrollbarVisibility !== 'never' && ( )} ) } function Scrollbar({ orientation, visibility, }: { orientation: 'vertical' | 'horizontal' visibility: ScrollbarVisibility }) { return ( ) } export { ScrollArea } export type { ScrollAreaProps }