UNPKG

@mantine/core

Version:

React components library focused on usability, accessibility and developer experience

53 lines (52 loc) 2.11 kB
"use client"; import { useScrollAreaContext } from "../ScrollArea.context.mjs"; import { composeEventHandlers } from "../utils/compose-event-handlers.mjs"; import { ScrollAreaScrollbarVisible } from "./ScrollAreaScrollbarVisible.mjs"; import { useEffect, useState } from "react"; import { useDebouncedCallback } from "@mantine/hooks"; import { jsx } from "react/jsx-runtime"; //#region packages/@mantine/core/src/components/ScrollArea/ScrollAreaScrollbar/ScrollAreaScrollbarScroll.tsx function ScrollAreaScrollbarScroll(props) { const { forceMount, ...scrollbarProps } = props; const context = useScrollAreaContext(); const isHorizontal = props.orientation === "horizontal"; const [state, setState] = useState("hidden"); const debounceScrollEnd = useDebouncedCallback(() => setState("idle"), 100); useEffect(() => { if (state === "idle") { const hideTimer = window.setTimeout(() => setState("hidden"), context.scrollHideDelay); return () => window.clearTimeout(hideTimer); } }, [state, context.scrollHideDelay]); useEffect(() => { const { viewport } = context; const scrollDirection = isHorizontal ? "scrollLeft" : "scrollTop"; if (viewport) { let prevScrollPos = viewport[scrollDirection]; const handleScroll = () => { const scrollPos = viewport[scrollDirection]; if (prevScrollPos !== scrollPos) { setState("scrolling"); debounceScrollEnd(); } prevScrollPos = scrollPos; }; viewport.addEventListener("scroll", handleScroll); return () => viewport.removeEventListener("scroll", handleScroll); } }, [ context.viewport, isHorizontal, debounceScrollEnd ]); if (forceMount || state !== "hidden") return /* @__PURE__ */ jsx(ScrollAreaScrollbarVisible, { "data-state": state === "hidden" ? "hidden" : "visible", ...scrollbarProps, onPointerEnter: composeEventHandlers(props.onPointerEnter, () => setState("interacting")), onPointerLeave: composeEventHandlers(props.onPointerLeave, () => setState("idle")) }); return null; } //#endregion export { ScrollAreaScrollbarScroll }; //# sourceMappingURL=ScrollAreaScrollbarScroll.mjs.map