{"version":3,"file":"ScrollAreaThumb.cjs","sources":["../../../../src/components/ScrollArea/ScrollAreaThumb/ScrollAreaThumb.tsx"],"sourcesContent":["import { forwardRef, useEffect, useRef } from 'react';\nimport { useDebouncedCallback, useMergedRef } from '@raikou/hooks';\nimport { useScrollAreaContext } from '../ScrollArea.context';\nimport { useScrollbarContext } from '../ScrollAreaScrollbar/Scrollbar.context';\nimport { addUnlinkedScrollListener, composeEventHandlers } from '../utils';\n\ninterface ThumbProps extends React.ComponentPropsWithoutRef<'div'> {}\n\nexport const Thumb = forwardRef<HTMLDivElement, ThumbProps>((props, forwardedRef) => {\n  const { style, ...others } = props;\n  const scrollAreaContext = useScrollAreaContext();\n  const scrollbarContext = useScrollbarContext();\n  const { onThumbPositionChange } = scrollbarContext;\n  const composedRef = useMergedRef(forwardedRef, (node) => scrollbarContext.onThumbChange(node));\n  const removeUnlinkedScrollListenerRef = useRef<() => void>();\n  const debounceScrollEnd = useDebouncedCallback(() => {\n    if (removeUnlinkedScrollListenerRef.current) {\n      removeUnlinkedScrollListenerRef.current();\n      removeUnlinkedScrollListenerRef.current = undefined;\n    }\n  }, 100);\n\n  useEffect(() => {\n    const { viewport } = scrollAreaContext;\n    if (viewport) {\n      const handleScroll = () => {\n        debounceScrollEnd();\n        if (!removeUnlinkedScrollListenerRef.current) {\n          const listener = addUnlinkedScrollListener(viewport, onThumbPositionChange);\n          removeUnlinkedScrollListenerRef.current = listener;\n          onThumbPositionChange();\n        }\n      };\n      onThumbPositionChange();\n      viewport.addEventListener('scroll', handleScroll);\n      return () => viewport.removeEventListener('scroll', handleScroll);\n    }\n\n    return undefined;\n  }, [scrollAreaContext.viewport, debounceScrollEnd, onThumbPositionChange]);\n\n  return (\n    <div\n      data-state={scrollbarContext.hasThumb ? 'visible' : 'hidden'}\n      {...others}\n      ref={composedRef}\n      style={{\n        width: 'var(--sa-thumb-width)',\n        height: 'var(--sa-thumb-height)',\n        ...style,\n      }}\n      onPointerDownCapture={composeEventHandlers(props.onPointerDownCapture, (event) => {\n        const thumb = event.target as HTMLElement;\n        const thumbRect = thumb.getBoundingClientRect();\n        const x = event.clientX - thumbRect.left;\n        const y = event.clientY - thumbRect.top;\n        scrollbarContext.onThumbPointerDown({ x, y });\n      })}\n      onPointerUp={composeEventHandlers(props.onPointerUp, scrollbarContext.onThumbPointerUp)}\n    />\n  );\n});\n\nThumb.displayName = '@raikou/core/ScrollAreaThumb';\n\ninterface ScrollAreaThumbProps extends ThumbProps {\n  forceMount?: true;\n}\n\nexport const ScrollAreaThumb = forwardRef<HTMLDivElement, ScrollAreaThumbProps>(\n  (props, forwardedRef) => {\n    const { forceMount, ...thumbProps } = props;\n    const scrollbarContext = useScrollbarContext();\n\n    if (forceMount || scrollbarContext.hasThumb) {\n      return <Thumb ref={forwardedRef} {...thumbProps} />;\n    }\n\n    return null;\n  }\n);\n\nScrollAreaThumb.displayName = '@raikou/core/ScrollAreaThumb';\n"],"names":["forwardRef","useScrollAreaContext","useScrollbarContext","useMergedRef","useRef","useDebouncedCallback","useEffect","addUnlinkedScrollListener","jsx","composeEventHandlers"],"mappings":"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"}