/* eslint-disable react/no-unused-prop-types */ import React, { ForwardedRef, forwardRef } from 'react' import { ComponentProps } from '@stitches/react' import * as RadixScrollArea from '@radix-ui/react-scroll-area' import { noop } from '@aviato/utils' import { styled } from '~/theme' const StyledScrollArea = styled(RadixScrollArea.Root, { width: '100%', height: '100%', overflow: 'hidden', display: 'flex', flexDirection: 'column', }) const StyledViewport = styled(RadixScrollArea.Viewport, { boxSizing: 'border-box', height: '100%', width: '100%', display: 'flex', flexDirection: 'column', }) const Scrollbar = styled(RadixScrollArea.Scrollbar, { display: 'flex', userSelect: 'none', touchAction: 'none', boxSizing: 'border-box', '&:hover': {}, '&[data-state="hidden"]': { opacity: 0, }, }) const Thumb = styled(RadixScrollArea.Thumb, { flex: 1, position: 'relative', backgroundColor: '$ActionLightHover', transition: 'background-color 150ms ease', '&::before': { content: '""', position: 'absolute', top: '50%', left: '50%', transform: 'translate(-50%, -50%)', width: '100%', height: '100%', minWidth: 44, minHeight: 44, }, }) const Corner = styled(RadixScrollArea.Corner, {}) export interface ScrollAreaProps extends ComponentProps { /** Scrollbar size in px */ scrollbarSize?: number /** Scrollbars type */ type?: 'auto' | 'always' | 'scroll' | 'hover' /** Scroll hide delay in ms, for scroll and hover types only */ scrollHideDelay?: number /** Should scrollbars be offset with padding */ offsetScrollbars?: boolean /** Get viewport ref */ viewportRef?: ForwardedRef /** Subscribe to scroll position changes */ onScrollPositionChange?(position: { x: number; y: number }): void } export const ScrollArea = forwardRef( (properties, forwardedRef) => { const { children, scrollbarSize = 8, scrollHideDelay = 1000, type = 'hover', css, viewportRef, offsetScrollbars = false, onScrollPositionChange = noop, } = properties return ( { onScrollPositionChange({ x: currentTarget.scrollLeft, y: currentTarget.scrollTop, }) }} > {children} ) } ) ScrollArea.displayName = 'ScrollArea'