@mantine/core
Version:
React components library focused on usability, accessibility and developer experience
1 lines • 4.33 kB
Source Map (JSON)
{"version":3,"file":"ScrollAreaThumb.mjs","names":[],"sources":["../../../../src/components/ScrollArea/ScrollAreaThumb/ScrollAreaThumb.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { useDebouncedCallback, useMergedRef } from '@mantine/hooks';\nimport { useScrollAreaContext } from '../ScrollArea.context';\nimport { useScrollbarContext } from '../ScrollAreaScrollbar/Scrollbar.context';\nimport { addUnlinkedScrollListener, composeEventHandlers } from '../utils';\n\ninterface ThumbProps extends React.ComponentProps<'div'> {}\n\nexport function Thumb(props: ThumbProps) {\n const { style, ref: forwardedRef, ...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) | undefined>(undefined);\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 = '@mantine/core/ScrollAreaThumb';\n\ninterface ScrollAreaThumbProps extends ThumbProps {\n forceMount?: true;\n}\n\nexport function ScrollAreaThumb(props: ScrollAreaThumbProps) {\n const { forceMount, ...thumbProps } = props;\n const scrollbarContext = useScrollbarContext();\n\n if (forceMount || scrollbarContext.hasThumb) {\n return <Thumb {...thumbProps} />;\n }\n\n return null;\n}\n\nScrollAreaThumb.displayName = '@mantine/core/ScrollAreaThumb';\n"],"mappings":";;;;;;;;;AAQA,SAAgB,MAAM,OAAmB;CACvC,MAAM,EAAE,OAAO,KAAK,cAAc,GAAG,WAAW;CAChD,MAAM,oBAAoB,sBAAsB;CAChD,MAAM,mBAAmB,qBAAqB;CAC9C,MAAM,EAAE,0BAA0B;CAClC,MAAM,cAAc,aAAa,eAAe,SAAS,iBAAiB,cAAc,KAAK,CAAC;CAC9F,MAAM,kCAAkC,OAAiC,KAAA,EAAU;CACnF,MAAM,oBAAoB,2BAA2B;AACnD,MAAI,gCAAgC,SAAS;AAC3C,mCAAgC,SAAS;AACzC,mCAAgC,UAAU,KAAA;;IAE3C,IAAI;AAEP,iBAAgB;EACd,MAAM,EAAE,aAAa;AACrB,MAAI,UAAU;GACZ,MAAM,qBAAqB;AACzB,uBAAmB;AACnB,QAAI,CAAC,gCAAgC,SAAS;AAE5C,qCAAgC,UADf,0BAA0B,UAAU,sBAAsB;AAE3E,4BAAuB;;;AAG3B,0BAAuB;AACvB,YAAS,iBAAiB,UAAU,aAAa;AACjD,gBAAa,SAAS,oBAAoB,UAAU,aAAa;;IAIlE;EAAC,kBAAkB;EAAU;EAAmB;EAAsB,CAAC;AAE1E,QACE,oBAAC,OAAD;EACE,cAAY,iBAAiB,WAAW,YAAY;EACpD,GAAI;EACJ,KAAK;EACL,OAAO;GACL,OAAO;GACP,QAAQ;GACR,GAAG;GACJ;EACD,sBAAsB,qBAAqB,MAAM,uBAAuB,UAAU;GAEhF,MAAM,YADQ,MAAM,OACI,uBAAuB;GAC/C,MAAM,IAAI,MAAM,UAAU,UAAU;GACpC,MAAM,IAAI,MAAM,UAAU,UAAU;AACpC,oBAAiB,mBAAmB;IAAE;IAAG;IAAG,CAAC;IAC7C;EACF,aAAa,qBAAqB,MAAM,aAAa,iBAAiB,iBAAiB;EACvF,CAAA;;AAIN,MAAM,cAAc;AAMpB,SAAgB,gBAAgB,OAA6B;CAC3D,MAAM,EAAE,YAAY,GAAG,eAAe;CACtC,MAAM,mBAAmB,qBAAqB;AAE9C,KAAI,cAAc,iBAAiB,SACjC,QAAO,oBAAC,OAAD,EAAO,GAAI,YAAc,CAAA;AAGlC,QAAO;;AAGT,gBAAgB,cAAc"}