UNPKG

@mantine/core

Version:

React components library focused on usability, accessibility and developer experience

77 lines (74 loc) 3.06 kB
'use client'; import { jsx } from 'react/jsx-runtime'; import { forwardRef, useRef, useEffect } from 'react'; import { useMergedRef, useDebouncedCallback } from '@mantine/hooks'; import { useScrollAreaContext } from '../ScrollArea.context.mjs'; import { useScrollbarContext } from '../ScrollAreaScrollbar/Scrollbar.context.mjs'; import { composeEventHandlers } from '../utils/compose-event-handlers.mjs'; import { addUnlinkedScrollListener } from '../utils/add-unlinked-scroll-listener.mjs'; const Thumb = forwardRef((props, forwardedRef) => { const { style, ...others } = props; const scrollAreaContext = useScrollAreaContext(); const scrollbarContext = useScrollbarContext(); const { onThumbPositionChange } = scrollbarContext; const composedRef = useMergedRef(forwardedRef, (node) => scrollbarContext.onThumbChange(node)); const removeUnlinkedScrollListenerRef = useRef(void 0); const debounceScrollEnd = useDebouncedCallback(() => { if (removeUnlinkedScrollListenerRef.current) { removeUnlinkedScrollListenerRef.current(); removeUnlinkedScrollListenerRef.current = void 0; } }, 100); useEffect(() => { const { viewport } = scrollAreaContext; if (viewport) { const handleScroll = () => { debounceScrollEnd(); if (!removeUnlinkedScrollListenerRef.current) { const listener = addUnlinkedScrollListener(viewport, onThumbPositionChange); removeUnlinkedScrollListenerRef.current = listener; onThumbPositionChange(); } }; onThumbPositionChange(); viewport.addEventListener("scroll", handleScroll); return () => viewport.removeEventListener("scroll", handleScroll); } return void 0; }, [scrollAreaContext.viewport, debounceScrollEnd, onThumbPositionChange]); return /* @__PURE__ */ jsx( "div", { "data-state": scrollbarContext.hasThumb ? "visible" : "hidden", ...others, ref: composedRef, style: { width: "var(--sa-thumb-width)", height: "var(--sa-thumb-height)", ...style }, onPointerDownCapture: composeEventHandlers(props.onPointerDownCapture, (event) => { const thumb = event.target; const thumbRect = thumb.getBoundingClientRect(); const x = event.clientX - thumbRect.left; const y = event.clientY - thumbRect.top; scrollbarContext.onThumbPointerDown({ x, y }); }), onPointerUp: composeEventHandlers(props.onPointerUp, scrollbarContext.onThumbPointerUp) } ); }); Thumb.displayName = "@mantine/core/ScrollAreaThumb"; const ScrollAreaThumb = forwardRef( (props, forwardedRef) => { const { forceMount, ...thumbProps } = props; const scrollbarContext = useScrollbarContext(); if (forceMount || scrollbarContext.hasThumb) { return /* @__PURE__ */ jsx(Thumb, { ref: forwardedRef, ...thumbProps }); } return null; } ); ScrollAreaThumb.displayName = "@mantine/core/ScrollAreaThumb"; export { ScrollAreaThumb, Thumb }; //# sourceMappingURL=ScrollAreaThumb.mjs.map