UNPKG

@mantine/core

Version:

React components library focused on usability, accessibility and developer experience

74 lines (73 loc) 2.84 kB
"use client"; import { useScrollAreaContext } from "../ScrollArea.context.mjs"; import { composeEventHandlers } from "../utils/compose-event-handlers.mjs"; import { addUnlinkedScrollListener } from "../utils/add-unlinked-scroll-listener.mjs"; import { useScrollbarContext } from "../ScrollAreaScrollbar/Scrollbar.context.mjs"; import { useEffect, useRef } from "react"; import { useDebouncedCallback, useMergedRef } from "@mantine/hooks"; import { jsx } from "react/jsx-runtime"; //#region packages/@mantine/core/src/components/ScrollArea/ScrollAreaThumb/ScrollAreaThumb.tsx function Thumb(props) { const { style, ref: forwardedRef, ...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) { removeUnlinkedScrollListenerRef.current = addUnlinkedScrollListener(viewport, onThumbPositionChange); onThumbPositionChange(); } }; onThumbPositionChange(); viewport.addEventListener("scroll", handleScroll); return () => viewport.removeEventListener("scroll", handleScroll); } }, [ 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 thumbRect = event.target.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"; function ScrollAreaThumb(props) { const { forceMount, ...thumbProps } = props; const scrollbarContext = useScrollbarContext(); if (forceMount || scrollbarContext.hasThumb) return /* @__PURE__ */ jsx(Thumb, { ...thumbProps }); return null; } ScrollAreaThumb.displayName = "@mantine/core/ScrollAreaThumb"; //#endregion export { ScrollAreaThumb }; //# sourceMappingURL=ScrollAreaThumb.mjs.map