@radix-ui/react-scroll-area 0.1.5-rc.5 → 0.1.5-rc.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,801 @@
1
- import{composeEventHandlers as e}from"@radix-ui/primitive";import{clamp as r}from"@radix-ui/number";import{useLayoutEffect as t}from"@radix-ui/react-use-layout-effect";import{useDirection as o}from"@radix-ui/react-direction";import{useCallbackRef as n}from"@radix-ui/react-use-callback-ref";import{useComposedRefs as l}from"@radix-ui/react-compose-refs";import{createContextScope as i}from"@radix-ui/react-context";import{Presence as a}from"@radix-ui/react-presence";import{Primitive as c}from"@radix-ui/react-primitive";import*as s from"react";import u from"@babel/runtime/helpers/esm/extends";const[d,p]=i("ScrollArea");export{p as createScrollAreaScope};const[f,h]=d("ScrollArea");export const ScrollArea=/*#__PURE__*/s.forwardRef(((e,r)=>{const{__scopeScrollArea:t,type:n="hover",dir:i,scrollHideDelay:a=600,...d}=e,[p,h]=s.useState(null),[m,w]=s.useState(null),[b,v]=s.useState(null),[S,g]=s.useState(null),[E,T]=s.useState(null),[C,y]=s.useState(0),[A,x]=s.useState(0),[R,P]=s.useState(!1),[L,_]=s.useState(!1),D=l(r,(e=>h(e))),z=o(i);/*#__PURE__*/return s.createElement(f,{scope:t,type:n,dir:z,scrollHideDelay:a,scrollArea:p,viewport:m,onViewportChange:w,content:b,onContentChange:v,scrollbarX:S,onScrollbarXChange:g,scrollbarXEnabled:R,onScrollbarXEnabledChange:P,scrollbarY:E,onScrollbarYChange:T,scrollbarYEnabled:L,onScrollbarYEnabledChange:_,onCornerWidthChange:y,onCornerHeightChange:x},/*#__PURE__*/s.createElement(c.div,u({dir:z},d,{ref:D,style:{position:"relative","--radix-scroll-area-corner-width":C+"px","--radix-scroll-area-corner-height":A+"px",...e.style}})))}));/*#__PURE__*/export const ScrollAreaViewport=/*#__PURE__*/s.forwardRef(((e,r)=>{const{__scopeScrollArea:t,children:o,...n}=e,i=h("ScrollAreaViewport",t),a=s.useRef(null),d=l(r,a,i.onViewportChange);/*#__PURE__*/return s.createElement(s.Fragment,null,/*#__PURE__*/s.createElement("style",{dangerouslySetInnerHTML:{__html:"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}"}}),/*#__PURE__*/s.createElement(c.div,u({"data-radix-scroll-area-viewport":""},n,{ref:d,style:{overflowX:i.scrollbarXEnabled?"scroll":"hidden",overflowY:i.scrollbarYEnabled?"scroll":"hidden",...e.style}}),/*#__PURE__*/s.createElement("div",{ref:i.onContentChange,style:{minWidth:"100%",display:"table"}},o)))}));/*#__PURE__*/export const ScrollAreaScrollbar=/*#__PURE__*/s.forwardRef(((e,r)=>{const{forceMount:t,...o}=e,n=h("ScrollAreaScrollbar",e.__scopeScrollArea),{onScrollbarXEnabledChange:l,onScrollbarYEnabledChange:i}=n,a="horizontal"===e.orientation;return s.useEffect((()=>(a?l(!0):i(!0),()=>{a?l(!1):i(!1)})),[a,l,i]),"hover"===n.type?/*#__PURE__*/s.createElement(m,u({},o,{ref:r,forceMount:t})):"scroll"===n.type?/*#__PURE__*/s.createElement(w,u({},o,{ref:r,forceMount:t})):"auto"===n.type?/*#__PURE__*/s.createElement(b,u({},o,{ref:r,forceMount:t})):"always"===n.type?/*#__PURE__*/s.createElement(v,u({},o,{ref:r})):null}));/*#__PURE__*/const m=/*#__PURE__*/s.forwardRef(((e,r)=>{const{forceMount:t,...o}=e,n=h("ScrollAreaScrollbar",e.__scopeScrollArea),[l,i]=s.useState(!1);return s.useEffect((()=>{const e=n.scrollArea;let r=0;if(e){const t=()=>{window.clearTimeout(r),i(!0)},o=()=>{r=window.setTimeout((()=>i(!1)),n.scrollHideDelay)};return e.addEventListener("pointerenter",t),e.addEventListener("pointerleave",o),()=>{window.clearTimeout(r),e.removeEventListener("pointerenter",t),e.removeEventListener("pointerleave",o)}}}),[n.scrollArea,n.scrollHideDelay]),/*#__PURE__*/s.createElement(a,{present:t||l},/*#__PURE__*/s.createElement(b,u({"data-state":l?"visible":"hidden"},o,{ref:r})))})),w=/*#__PURE__*/s.forwardRef(((r,t)=>{const{forceMount:o,...n}=r,l=h("ScrollAreaScrollbar",r.__scopeScrollArea),i="horizontal"===r.orientation,c=z((()=>p("SCROLL_END")),100),[d,p]=(f="hidden",m={hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}},s.useReducer(((e,r)=>{const t=m[e][r];return null!=t?t:e}),f));var f,m;return s.useEffect((()=>{if("idle"===d){const e=window.setTimeout((()=>p("HIDE")),l.scrollHideDelay);return()=>window.clearTimeout(e)}}),[d,l.scrollHideDelay,p]),s.useEffect((()=>{const e=l.viewport,r=i?"scrollLeft":"scrollTop";if(e){let t=e[r];const o=()=>{const o=e[r];t!==o&&(p("SCROLL"),c()),t=o};return e.addEventListener("scroll",o),()=>e.removeEventListener("scroll",o)}}),[l.viewport,i,p,c]),/*#__PURE__*/s.createElement(a,{present:o||"hidden"!==d},/*#__PURE__*/s.createElement(v,u({"data-state":"hidden"===d?"hidden":"visible"},n,{ref:t,onPointerEnter:e(r.onPointerEnter,(()=>p("POINTER_ENTER"))),onPointerLeave:e(r.onPointerLeave,(()=>p("POINTER_LEAVE")))})))})),b=/*#__PURE__*/s.forwardRef(((e,r)=>{const t=h("ScrollAreaScrollbar",e.__scopeScrollArea),{forceMount:o,...n}=e,[l,i]=s.useState(!1),c="horizontal"===e.orientation,d=z((()=>{if(t.viewport){const e=t.viewport.offsetWidth<t.viewport.scrollWidth,r=t.viewport.offsetHeight<t.viewport.scrollHeight;i(c?e:r)}}),10);return H(t.viewport,d),H(t.content,d),/*#__PURE__*/s.createElement(a,{present:o||l},/*#__PURE__*/s.createElement(v,u({"data-state":l?"visible":"hidden"},n,{ref:r})))})),v=/*#__PURE__*/s.forwardRef(((e,r)=>{const{orientation:t="vertical",...o}=e,n=h("ScrollAreaScrollbar",e.__scopeScrollArea),l=s.useRef(null),i=s.useRef(0),[a,c]=s.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),d=x(a.viewport,a.content),p={...o,sizes:a,onSizesChange:c,hasThumb:Boolean(d>0&&d<1),onThumbChange:e=>l.current=e,onThumbPointerUp:()=>i.current=0,onThumbPointerDown:e=>i.current=e};function f(e,r){return function(e,r,t,o="ltr"){const n=R(t),l=n/2,i=r||l,a=n-i,c=t.scrollbar.paddingStart+i,s=t.scrollbar.size-t.scrollbar.paddingEnd-a,u=t.content-t.viewport;return L([c,s],"ltr"===o?[0,u]:[-1*u,0])(e)}(e,i.current,a,r)}return"horizontal"===t?/*#__PURE__*/s.createElement(S,u({},p,{ref:r,onThumbPositionChange:()=>{if(n.viewport&&l.current){const e=P(n.viewport.scrollLeft,a,n.dir);l.current.style.transform=`translate3d(${e}px, 0, 0)`}},onWheelScroll:e=>{n.viewport&&(n.viewport.scrollLeft=e)},onDragScroll:e=>{n.viewport&&(n.viewport.scrollLeft=f(e,n.dir))}})):"vertical"===t?/*#__PURE__*/s.createElement(g,u({},p,{ref:r,onThumbPositionChange:()=>{if(n.viewport&&l.current){const e=P(n.viewport.scrollTop,a);l.current.style.transform=`translate3d(0, ${e}px, 0)`}},onWheelScroll:e=>{n.viewport&&(n.viewport.scrollTop=e)},onDragScroll:e=>{n.viewport&&(n.viewport.scrollTop=f(e))}})):null})),S=/*#__PURE__*/s.forwardRef(((e,r)=>{const{sizes:t,onSizesChange:o,...n}=e,i=h("ScrollAreaScrollbar",e.__scopeScrollArea),[a,c]=s.useState(),d=s.useRef(null),p=l(r,d,i.onScrollbarXChange);return s.useEffect((()=>{d.current&&c(getComputedStyle(d.current))}),[d]),/*#__PURE__*/s.createElement(C,u({"data-orientation":"horizontal"},n,{ref:p,sizes:t,style:{bottom:0,left:"rtl"===i.dir?"var(--radix-scroll-area-corner-width)":0,right:"ltr"===i.dir?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":R(t)+"px",...e.style},onThumbPointerDown:r=>e.onThumbPointerDown(r.x),onDragScroll:r=>e.onDragScroll(r.x),onWheelScroll:(r,t)=>{if(i.viewport){const o=i.viewport.scrollLeft+r.deltaX;e.onWheelScroll(o),_(o,t)&&r.preventDefault()}},onResize:()=>{d.current&&i.viewport&&a&&o({content:i.viewport.scrollWidth,viewport:i.viewport.offsetWidth,scrollbar:{size:d.current.clientWidth,paddingStart:A(a.paddingLeft),paddingEnd:A(a.paddingRight)}})}}))})),g=/*#__PURE__*/s.forwardRef(((e,r)=>{const{sizes:t,onSizesChange:o,...n}=e,i=h("ScrollAreaScrollbar",e.__scopeScrollArea),[a,c]=s.useState(),d=s.useRef(null),p=l(r,d,i.onScrollbarYChange);return s.useEffect((()=>{d.current&&c(getComputedStyle(d.current))}),[d]),/*#__PURE__*/s.createElement(C,u({"data-orientation":"vertical"},n,{ref:p,sizes:t,style:{top:0,right:"ltr"===i.dir?0:void 0,left:"rtl"===i.dir?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":R(t)+"px",...e.style},onThumbPointerDown:r=>e.onThumbPointerDown(r.y),onDragScroll:r=>e.onDragScroll(r.y),onWheelScroll:(r,t)=>{if(i.viewport){const o=i.viewport.scrollTop+r.deltaY;e.onWheelScroll(o),_(o,t)&&r.preventDefault()}},onResize:()=>{d.current&&i.viewport&&a&&o({content:i.viewport.scrollHeight,viewport:i.viewport.offsetHeight,scrollbar:{size:d.current.clientHeight,paddingStart:A(a.paddingTop),paddingEnd:A(a.paddingBottom)}})}}))})),[E,T]=d("ScrollAreaScrollbar"),C=/*#__PURE__*/s.forwardRef(((r,t)=>{const{__scopeScrollArea:o,sizes:i,hasThumb:a,onThumbChange:d,onThumbPointerUp:p,onThumbPointerDown:f,onThumbPositionChange:m,onDragScroll:w,onWheelScroll:b,onResize:v,...S}=r,g=h("ScrollAreaScrollbar",o),[T,C]=s.useState(null),y=l(t,(e=>C(e))),A=s.useRef(null),x=s.useRef(""),R=g.viewport,P=i.content-i.viewport,L=n(b),_=n(m),D=z(v,10);function W(e){if(A.current){const r=e.clientX-A.current.left,t=e.clientY-A.current.top;w({x:r,y:t})}}return s.useEffect((()=>{const e=e=>{const r=e.target;(null==T?void 0:T.contains(r))&&L(e,P)};return document.addEventListener("wheel",e,{passive:!1}),()=>document.removeEventListener("wheel",e,{passive:!1})}),[R,T,P,L]),s.useEffect(_,[i,_]),H(T,D),H(g.content,D),/*#__PURE__*/s.createElement(E,{scope:o,scrollbar:T,hasThumb:a,onThumbChange:n(d),onThumbPointerUp:n(p),onThumbPositionChange:_,onThumbPointerDown:n(f)},/*#__PURE__*/s.createElement(c.div,u({},S,{ref:y,style:{position:"absolute",...S.style},onPointerDown:e(r.onPointerDown,(e=>{if(0===e.button){e.target.setPointerCapture(e.pointerId),A.current=T.getBoundingClientRect(),x.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",W(e)}})),onPointerMove:e(r.onPointerMove,W),onPointerUp:e(r.onPointerUp,(e=>{e.target.releasePointerCapture(e.pointerId),document.body.style.webkitUserSelect=x.current,A.current=null}))})))}));export const ScrollAreaThumb=/*#__PURE__*/s.forwardRef(((r,t)=>{const{__scopeScrollArea:o,style:n,...i}=r,a=h("ScrollbarThumb",o),d=T("ScrollbarThumb",o),{onThumbPositionChange:p}=d,f=l(t,(e=>d.onThumbChange(e))),m=s.useRef(),w=z((()=>{m.current&&(m.current(),m.current=void 0)}),100);return s.useEffect((()=>{const e=a.viewport;if(e){const r=()=>{if(w(),!m.current){const r=D(e,p);m.current=r,p()}};return p(),e.addEventListener("scroll",r),()=>e.removeEventListener("scroll",r)}}),[a.viewport,w,p]),d.hasThumb?/*#__PURE__*/s.createElement(c.div,u({},i,{ref:f,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...n},onPointerDownCapture:e(r.onPointerDownCapture,(e=>{const r=e.target.getBoundingClientRect(),t=e.clientX-r.left,o=e.clientY-r.top;d.onThumbPointerDown({x:t,y:o})})),onPointerUp:e(r.onPointerUp,d.onThumbPointerUp)})):null}));/*#__PURE__*/export const ScrollAreaCorner=/*#__PURE__*/s.forwardRef(((e,r)=>{const t=h("ScrollAreaCorner",e.__scopeScrollArea),o=Boolean(t.scrollbarX&&t.scrollbarY);return"scroll"!==t.type&&o?/*#__PURE__*/s.createElement(y,u({},e,{ref:r})):null}));/*#__PURE__*/const y=/*#__PURE__*/s.forwardRef(((e,r)=>{const{__scopeScrollArea:t,...o}=e,n=h("ScrollAreaCorner",t),[l,i]=s.useState(0),[a,d]=s.useState(0),p=Boolean(l&&a);return H(n.scrollbarX,(()=>{var e;const r=(null===(e=n.scrollbarX)||void 0===e?void 0:e.offsetHeight)||0;n.onCornerHeightChange(r),d(r)})),H(n.scrollbarY,(()=>{var e;const r=(null===(e=n.scrollbarY)||void 0===e?void 0:e.offsetWidth)||0;n.onCornerWidthChange(r),i(r)})),p?/*#__PURE__*/s.createElement(c.div,u({},o,{ref:r,style:{width:l,height:a,position:"absolute",right:"ltr"===n.dir?0:void 0,left:"rtl"===n.dir?0:void 0,bottom:0,...e.style}})):null}));function A(e){return e?parseInt(e,10):0}function x(e,r){const t=e/r;return isNaN(t)?0:t}function R(e){const r=x(e.viewport,e.content),t=e.scrollbar.paddingStart+e.scrollbar.paddingEnd,o=(e.scrollbar.size-t)*r;return Math.max(o,18)}function P(e,t,o="ltr"){const n=R(t),l=t.scrollbar.paddingStart+t.scrollbar.paddingEnd,i=t.scrollbar.size-l,a=t.content-t.viewport,c=i-n,s=r(e,"ltr"===o?[0,a]:[-1*a,0]);return L([0,a],[0,c])(s)}function L(e,r){return t=>{if(e[0]===e[1]||r[0]===r[1])return r[0];const o=(r[1]-r[0])/(e[1]-e[0]);return r[0]+o*(t-e[0])}}function _(e,r){return e>0&&e<r}const D=(e,r=(()=>{}))=>{let t={left:e.scrollLeft,top:e.scrollTop},o=0;return function n(){const l={left:e.scrollLeft,top:e.scrollTop},i=t.left!==l.left,a=t.top!==l.top;(i||a)&&r(),t=l,o=window.requestAnimationFrame(n)}(),()=>window.cancelAnimationFrame(o)};function z(e,r){const t=n(e),o=s.useRef(0);return s.useEffect((()=>()=>window.clearTimeout(o.current)),[]),s.useCallback((()=>{window.clearTimeout(o.current),o.current=window.setTimeout(t,r)}),[t,r])}function H(e,r){const o=n(r);t((()=>{let r=0;if(e){const t=new ResizeObserver((()=>{cancelAnimationFrame(r),r=window.requestAnimationFrame(o)}));return t.observe(e),()=>{window.cancelAnimationFrame(r),t.unobserve(e)}}}),[e,o])}export const Root=ScrollArea;export const Viewport=ScrollAreaViewport;export const Scrollbar=ScrollAreaScrollbar;export const Thumb=ScrollAreaThumb;export const Corner=ScrollAreaCorner;
1
+ import $fnFM9$babelruntimehelpersesmextends from "@babel/runtime/helpers/esm/extends";
2
+ import {forwardRef as $fnFM9$forwardRef, useState as $fnFM9$useState, createElement as $fnFM9$createElement, useRef as $fnFM9$useRef, Fragment as $fnFM9$Fragment, useEffect as $fnFM9$useEffect, useCallback as $fnFM9$useCallback, useReducer as $fnFM9$useReducer} from "react";
3
+ import {Primitive as $fnFM9$Primitive} from "@radix-ui/react-primitive";
4
+ import {Presence as $fnFM9$Presence} from "@radix-ui/react-presence";
5
+ import {createContextScope as $fnFM9$createContextScope} from "@radix-ui/react-context";
6
+ import {useComposedRefs as $fnFM9$useComposedRefs} from "@radix-ui/react-compose-refs";
7
+ import {useCallbackRef as $fnFM9$useCallbackRef} from "@radix-ui/react-use-callback-ref";
8
+ import {useDirection as $fnFM9$useDirection} from "@radix-ui/react-direction";
9
+ import {useLayoutEffect as $fnFM9$useLayoutEffect} from "@radix-ui/react-use-layout-effect";
10
+ import {clamp as $fnFM9$clamp} from "@radix-ui/number";
11
+ import {composeEventHandlers as $fnFM9$composeEventHandlers} from "@radix-ui/primitive";
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+ function $6c2e24571c90391f$export$3e6543de14f8614f(initialState, machine) {
26
+ return $fnFM9$useReducer((state, event)=>{
27
+ const nextState = machine[state][event];
28
+ return nextState !== null && nextState !== void 0 ? nextState : state;
29
+ }, initialState);
30
+ }
31
+
32
+
33
+ /* -------------------------------------------------------------------------------------------------
34
+ * ScrollArea
35
+ * -----------------------------------------------------------------------------------------------*/ const $57acba87d6e25586$var$SCROLL_AREA_NAME = 'ScrollArea';
36
+ const [$57acba87d6e25586$var$createScrollAreaContext, $57acba87d6e25586$export$488468afe3a6f2b1] = $fnFM9$createContextScope($57acba87d6e25586$var$SCROLL_AREA_NAME);
37
+ const [$57acba87d6e25586$var$ScrollAreaProvider, $57acba87d6e25586$var$useScrollAreaContext] = $57acba87d6e25586$var$createScrollAreaContext($57acba87d6e25586$var$SCROLL_AREA_NAME);
38
+ const $57acba87d6e25586$export$ccf8d8d7bbf3c2cc = /*#__PURE__*/ $fnFM9$forwardRef((props, forwardedRef)=>{
39
+ const { __scopeScrollArea: __scopeScrollArea , type: type = 'hover' , dir: dir , scrollHideDelay: scrollHideDelay = 600 , ...scrollAreaProps } = props;
40
+ const [scrollArea, setScrollArea] = $fnFM9$useState(null);
41
+ const [viewport, setViewport] = $fnFM9$useState(null);
42
+ const [content, setContent] = $fnFM9$useState(null);
43
+ const [scrollbarX, setScrollbarX] = $fnFM9$useState(null);
44
+ const [scrollbarY, setScrollbarY] = $fnFM9$useState(null);
45
+ const [cornerWidth, setCornerWidth] = $fnFM9$useState(0);
46
+ const [cornerHeight, setCornerHeight] = $fnFM9$useState(0);
47
+ const [scrollbarXEnabled, setScrollbarXEnabled] = $fnFM9$useState(false);
48
+ const [scrollbarYEnabled, setScrollbarYEnabled] = $fnFM9$useState(false);
49
+ const composedRefs = $fnFM9$useComposedRefs(forwardedRef, (node)=>setScrollArea(node)
50
+ );
51
+ const direction = $fnFM9$useDirection(dir);
52
+ return /*#__PURE__*/ $fnFM9$createElement($57acba87d6e25586$var$ScrollAreaProvider, {
53
+ scope: __scopeScrollArea,
54
+ type: type,
55
+ dir: direction,
56
+ scrollHideDelay: scrollHideDelay,
57
+ scrollArea: scrollArea,
58
+ viewport: viewport,
59
+ onViewportChange: setViewport,
60
+ content: content,
61
+ onContentChange: setContent,
62
+ scrollbarX: scrollbarX,
63
+ onScrollbarXChange: setScrollbarX,
64
+ scrollbarXEnabled: scrollbarXEnabled,
65
+ onScrollbarXEnabledChange: setScrollbarXEnabled,
66
+ scrollbarY: scrollbarY,
67
+ onScrollbarYChange: setScrollbarY,
68
+ scrollbarYEnabled: scrollbarYEnabled,
69
+ onScrollbarYEnabledChange: setScrollbarYEnabled,
70
+ onCornerWidthChange: setCornerWidth,
71
+ onCornerHeightChange: setCornerHeight
72
+ }, /*#__PURE__*/ $fnFM9$createElement($fnFM9$Primitive.div, $fnFM9$babelruntimehelpersesmextends({
73
+ dir: direction
74
+ }, scrollAreaProps, {
75
+ ref: composedRefs,
76
+ style: {
77
+ position: 'relative',
78
+ // Pass corner sizes as CSS vars to reduce re-renders of context consumers
79
+ ['--radix-scroll-area-corner-width']: cornerWidth + 'px',
80
+ ['--radix-scroll-area-corner-height']: cornerHeight + 'px',
81
+ ...props.style
82
+ }
83
+ })));
84
+ });
85
+ /*#__PURE__*/ Object.assign($57acba87d6e25586$export$ccf8d8d7bbf3c2cc, {
86
+ displayName: $57acba87d6e25586$var$SCROLL_AREA_NAME
87
+ });
88
+ /* -------------------------------------------------------------------------------------------------
89
+ * ScrollAreaViewport
90
+ * -----------------------------------------------------------------------------------------------*/ const $57acba87d6e25586$var$VIEWPORT_NAME = 'ScrollAreaViewport';
91
+ const $57acba87d6e25586$export$a21cbf9f11fca853 = /*#__PURE__*/ $fnFM9$forwardRef((props, forwardedRef)=>{
92
+ const { __scopeScrollArea: __scopeScrollArea , children: children , ...viewportProps } = props;
93
+ const context = $57acba87d6e25586$var$useScrollAreaContext($57acba87d6e25586$var$VIEWPORT_NAME, __scopeScrollArea);
94
+ const ref = $fnFM9$useRef(null);
95
+ const composedRefs = $fnFM9$useComposedRefs(forwardedRef, ref, context.onViewportChange);
96
+ return /*#__PURE__*/ $fnFM9$createElement($fnFM9$Fragment, null, /*#__PURE__*/ $fnFM9$createElement("style", {
97
+ dangerouslySetInnerHTML: {
98
+ __html: `[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}`
99
+ }
100
+ }), /*#__PURE__*/ $fnFM9$createElement($fnFM9$Primitive.div, $fnFM9$babelruntimehelpersesmextends({
101
+ "data-radix-scroll-area-viewport": ""
102
+ }, viewportProps, {
103
+ ref: composedRefs,
104
+ style: {
105
+ /**
106
+ * We don't support `visible` because the intention is to have at least one scrollbar
107
+ * if this component is used and `visible` will behave like `auto` in that case
108
+ * https://developer.mozilla.org/en-US/docs/Web/CSS/overflowed#description
109
+ *
110
+ * We don't handle `auto` because the intention is for the native implementation
111
+ * to be hidden if using this component. We just want to ensure the node is scrollable
112
+ * so could have used either `scroll` or `auto` here. We picked `scroll` to prevent
113
+ * the browser from having to work out whether to render native scrollbars or not,
114
+ * we tell it to with the intention of hiding them in CSS.
115
+ */ overflowX: context.scrollbarXEnabled ? 'scroll' : 'hidden',
116
+ overflowY: context.scrollbarYEnabled ? 'scroll' : 'hidden',
117
+ ...props.style
118
+ }
119
+ }), /*#__PURE__*/ $fnFM9$createElement("div", {
120
+ ref: context.onContentChange,
121
+ style: {
122
+ minWidth: '100%',
123
+ display: 'table'
124
+ }
125
+ }, children)));
126
+ });
127
+ /*#__PURE__*/ Object.assign($57acba87d6e25586$export$a21cbf9f11fca853, {
128
+ displayName: $57acba87d6e25586$var$VIEWPORT_NAME
129
+ });
130
+ /* -------------------------------------------------------------------------------------------------
131
+ * ScrollAreaScrollbar
132
+ * -----------------------------------------------------------------------------------------------*/ const $57acba87d6e25586$var$SCROLLBAR_NAME = 'ScrollAreaScrollbar';
133
+ const $57acba87d6e25586$export$2fabd85d0eba3c57 = /*#__PURE__*/ $fnFM9$forwardRef((props, forwardedRef)=>{
134
+ const { forceMount: forceMount , ...scrollbarProps } = props;
135
+ const context = $57acba87d6e25586$var$useScrollAreaContext($57acba87d6e25586$var$SCROLLBAR_NAME, props.__scopeScrollArea);
136
+ const { onScrollbarXEnabledChange: onScrollbarXEnabledChange , onScrollbarYEnabledChange: onScrollbarYEnabledChange } = context;
137
+ const isHorizontal = props.orientation === 'horizontal';
138
+ $fnFM9$useEffect(()=>{
139
+ isHorizontal ? onScrollbarXEnabledChange(true) : onScrollbarYEnabledChange(true);
140
+ return ()=>{
141
+ isHorizontal ? onScrollbarXEnabledChange(false) : onScrollbarYEnabledChange(false);
142
+ };
143
+ }, [
144
+ isHorizontal,
145
+ onScrollbarXEnabledChange,
146
+ onScrollbarYEnabledChange
147
+ ]);
148
+ return context.type === 'hover' ? /*#__PURE__*/ $fnFM9$createElement($57acba87d6e25586$var$ScrollAreaScrollbarHover, $fnFM9$babelruntimehelpersesmextends({}, scrollbarProps, {
149
+ ref: forwardedRef,
150
+ forceMount: forceMount
151
+ })) : context.type === 'scroll' ? /*#__PURE__*/ $fnFM9$createElement($57acba87d6e25586$var$ScrollAreaScrollbarScroll, $fnFM9$babelruntimehelpersesmextends({}, scrollbarProps, {
152
+ ref: forwardedRef,
153
+ forceMount: forceMount
154
+ })) : context.type === 'auto' ? /*#__PURE__*/ $fnFM9$createElement($57acba87d6e25586$var$ScrollAreaScrollbarAuto, $fnFM9$babelruntimehelpersesmextends({}, scrollbarProps, {
155
+ ref: forwardedRef,
156
+ forceMount: forceMount
157
+ })) : context.type === 'always' ? /*#__PURE__*/ $fnFM9$createElement($57acba87d6e25586$var$ScrollAreaScrollbarVisible, $fnFM9$babelruntimehelpersesmextends({}, scrollbarProps, {
158
+ ref: forwardedRef
159
+ })) : null;
160
+ });
161
+ /*#__PURE__*/ Object.assign($57acba87d6e25586$export$2fabd85d0eba3c57, {
162
+ displayName: $57acba87d6e25586$var$SCROLLBAR_NAME
163
+ });
164
+ /* -----------------------------------------------------------------------------------------------*/ const $57acba87d6e25586$var$ScrollAreaScrollbarHover = /*#__PURE__*/ $fnFM9$forwardRef((props, forwardedRef)=>{
165
+ const { forceMount: forceMount , ...scrollbarProps } = props;
166
+ const context = $57acba87d6e25586$var$useScrollAreaContext($57acba87d6e25586$var$SCROLLBAR_NAME, props.__scopeScrollArea);
167
+ const [visible, setVisible] = $fnFM9$useState(false);
168
+ $fnFM9$useEffect(()=>{
169
+ const scrollArea = context.scrollArea;
170
+ let hideTimer = 0;
171
+ if (scrollArea) {
172
+ const handlePointerEnter = ()=>{
173
+ window.clearTimeout(hideTimer);
174
+ setVisible(true);
175
+ };
176
+ const handlePointerLeave = ()=>{
177
+ hideTimer = window.setTimeout(()=>setVisible(false)
178
+ , context.scrollHideDelay);
179
+ };
180
+ scrollArea.addEventListener('pointerenter', handlePointerEnter);
181
+ scrollArea.addEventListener('pointerleave', handlePointerLeave);
182
+ return ()=>{
183
+ window.clearTimeout(hideTimer);
184
+ scrollArea.removeEventListener('pointerenter', handlePointerEnter);
185
+ scrollArea.removeEventListener('pointerleave', handlePointerLeave);
186
+ };
187
+ }
188
+ }, [
189
+ context.scrollArea,
190
+ context.scrollHideDelay
191
+ ]);
192
+ return /*#__PURE__*/ $fnFM9$createElement($fnFM9$Presence, {
193
+ present: forceMount || visible
194
+ }, /*#__PURE__*/ $fnFM9$createElement($57acba87d6e25586$var$ScrollAreaScrollbarAuto, $fnFM9$babelruntimehelpersesmextends({
195
+ "data-state": visible ? 'visible' : 'hidden'
196
+ }, scrollbarProps, {
197
+ ref: forwardedRef
198
+ })));
199
+ });
200
+ const $57acba87d6e25586$var$ScrollAreaScrollbarScroll = /*#__PURE__*/ $fnFM9$forwardRef((props, forwardedRef)=>{
201
+ const { forceMount: forceMount , ...scrollbarProps } = props;
202
+ const context = $57acba87d6e25586$var$useScrollAreaContext($57acba87d6e25586$var$SCROLLBAR_NAME, props.__scopeScrollArea);
203
+ const isHorizontal = props.orientation === 'horizontal';
204
+ const debounceScrollEnd = $57acba87d6e25586$var$useDebounceCallback(()=>send('SCROLL_END')
205
+ , 100);
206
+ const [state, send] = $6c2e24571c90391f$export$3e6543de14f8614f('hidden', {
207
+ hidden: {
208
+ SCROLL: 'scrolling'
209
+ },
210
+ scrolling: {
211
+ SCROLL_END: 'idle',
212
+ POINTER_ENTER: 'interacting'
213
+ },
214
+ interacting: {
215
+ SCROLL: 'interacting',
216
+ POINTER_LEAVE: 'idle'
217
+ },
218
+ idle: {
219
+ HIDE: 'hidden',
220
+ SCROLL: 'scrolling',
221
+ POINTER_ENTER: 'interacting'
222
+ }
223
+ });
224
+ $fnFM9$useEffect(()=>{
225
+ if (state === 'idle') {
226
+ const hideTimer = window.setTimeout(()=>send('HIDE')
227
+ , context.scrollHideDelay);
228
+ return ()=>window.clearTimeout(hideTimer)
229
+ ;
230
+ }
231
+ }, [
232
+ state,
233
+ context.scrollHideDelay,
234
+ send
235
+ ]);
236
+ $fnFM9$useEffect(()=>{
237
+ const viewport = context.viewport;
238
+ const scrollDirection = isHorizontal ? 'scrollLeft' : 'scrollTop';
239
+ if (viewport) {
240
+ let prevScrollPos = viewport[scrollDirection];
241
+ const handleScroll = ()=>{
242
+ const scrollPos = viewport[scrollDirection];
243
+ const hasScrollInDirectionChanged = prevScrollPos !== scrollPos;
244
+ if (hasScrollInDirectionChanged) {
245
+ send('SCROLL');
246
+ debounceScrollEnd();
247
+ }
248
+ prevScrollPos = scrollPos;
249
+ };
250
+ viewport.addEventListener('scroll', handleScroll);
251
+ return ()=>viewport.removeEventListener('scroll', handleScroll)
252
+ ;
253
+ }
254
+ }, [
255
+ context.viewport,
256
+ isHorizontal,
257
+ send,
258
+ debounceScrollEnd
259
+ ]);
260
+ return /*#__PURE__*/ $fnFM9$createElement($fnFM9$Presence, {
261
+ present: forceMount || state !== 'hidden'
262
+ }, /*#__PURE__*/ $fnFM9$createElement($57acba87d6e25586$var$ScrollAreaScrollbarVisible, $fnFM9$babelruntimehelpersesmextends({
263
+ "data-state": state === 'hidden' ? 'hidden' : 'visible'
264
+ }, scrollbarProps, {
265
+ ref: forwardedRef,
266
+ onPointerEnter: $fnFM9$composeEventHandlers(props.onPointerEnter, ()=>send('POINTER_ENTER')
267
+ ),
268
+ onPointerLeave: $fnFM9$composeEventHandlers(props.onPointerLeave, ()=>send('POINTER_LEAVE')
269
+ )
270
+ })));
271
+ });
272
+ const $57acba87d6e25586$var$ScrollAreaScrollbarAuto = /*#__PURE__*/ $fnFM9$forwardRef((props, forwardedRef)=>{
273
+ const context = $57acba87d6e25586$var$useScrollAreaContext($57acba87d6e25586$var$SCROLLBAR_NAME, props.__scopeScrollArea);
274
+ const { forceMount: forceMount , ...scrollbarProps } = props;
275
+ const [visible, setVisible] = $fnFM9$useState(false);
276
+ const isHorizontal = props.orientation === 'horizontal';
277
+ const handleResize = $57acba87d6e25586$var$useDebounceCallback(()=>{
278
+ if (context.viewport) {
279
+ const isOverflowX = context.viewport.offsetWidth < context.viewport.scrollWidth;
280
+ const isOverflowY = context.viewport.offsetHeight < context.viewport.scrollHeight;
281
+ setVisible(isHorizontal ? isOverflowX : isOverflowY);
282
+ }
283
+ }, 10);
284
+ $57acba87d6e25586$var$useResizeObserver(context.viewport, handleResize);
285
+ $57acba87d6e25586$var$useResizeObserver(context.content, handleResize);
286
+ return /*#__PURE__*/ $fnFM9$createElement($fnFM9$Presence, {
287
+ present: forceMount || visible
288
+ }, /*#__PURE__*/ $fnFM9$createElement($57acba87d6e25586$var$ScrollAreaScrollbarVisible, $fnFM9$babelruntimehelpersesmextends({
289
+ "data-state": visible ? 'visible' : 'hidden'
290
+ }, scrollbarProps, {
291
+ ref: forwardedRef
292
+ })));
293
+ });
294
+ /* -----------------------------------------------------------------------------------------------*/ const $57acba87d6e25586$var$ScrollAreaScrollbarVisible = /*#__PURE__*/ $fnFM9$forwardRef((props, forwardedRef)=>{
295
+ const { orientation: orientation = 'vertical' , ...scrollbarProps } = props;
296
+ const context = $57acba87d6e25586$var$useScrollAreaContext($57acba87d6e25586$var$SCROLLBAR_NAME, props.__scopeScrollArea);
297
+ const thumbRef = $fnFM9$useRef(null);
298
+ const pointerOffsetRef = $fnFM9$useRef(0);
299
+ const [sizes, setSizes] = $fnFM9$useState({
300
+ content: 0,
301
+ viewport: 0,
302
+ scrollbar: {
303
+ size: 0,
304
+ paddingStart: 0,
305
+ paddingEnd: 0
306
+ }
307
+ });
308
+ const thumbRatio = $57acba87d6e25586$var$getThumbRatio(sizes.viewport, sizes.content);
309
+ const commonProps = {
310
+ ...scrollbarProps,
311
+ sizes: sizes,
312
+ onSizesChange: setSizes,
313
+ hasThumb: Boolean(thumbRatio > 0 && thumbRatio < 1),
314
+ onThumbChange: (thumb)=>thumbRef.current = thumb
315
+ ,
316
+ onThumbPointerUp: ()=>pointerOffsetRef.current = 0
317
+ ,
318
+ onThumbPointerDown: (pointerPos)=>pointerOffsetRef.current = pointerPos
319
+ };
320
+ function getScrollPosition(pointerPos, dir) {
321
+ return $57acba87d6e25586$var$getScrollPositionFromPointer(pointerPos, pointerOffsetRef.current, sizes, dir);
322
+ }
323
+ if (orientation === 'horizontal') return /*#__PURE__*/ $fnFM9$createElement($57acba87d6e25586$var$ScrollAreaScrollbarX, $fnFM9$babelruntimehelpersesmextends({}, commonProps, {
324
+ ref: forwardedRef,
325
+ onThumbPositionChange: ()=>{
326
+ if (context.viewport && thumbRef.current) {
327
+ const scrollPos = context.viewport.scrollLeft;
328
+ const offset = $57acba87d6e25586$var$getThumbOffsetFromScroll(scrollPos, sizes, context.dir);
329
+ thumbRef.current.style.transform = `translate3d(${offset}px, 0, 0)`;
330
+ }
331
+ },
332
+ onWheelScroll: (scrollPos)=>{
333
+ if (context.viewport) context.viewport.scrollLeft = scrollPos;
334
+ },
335
+ onDragScroll: (pointerPos)=>{
336
+ if (context.viewport) context.viewport.scrollLeft = getScrollPosition(pointerPos, context.dir);
337
+ }
338
+ }));
339
+ if (orientation === 'vertical') return /*#__PURE__*/ $fnFM9$createElement($57acba87d6e25586$var$ScrollAreaScrollbarY, $fnFM9$babelruntimehelpersesmextends({}, commonProps, {
340
+ ref: forwardedRef,
341
+ onThumbPositionChange: ()=>{
342
+ if (context.viewport && thumbRef.current) {
343
+ const scrollPos = context.viewport.scrollTop;
344
+ const offset = $57acba87d6e25586$var$getThumbOffsetFromScroll(scrollPos, sizes);
345
+ thumbRef.current.style.transform = `translate3d(0, ${offset}px, 0)`;
346
+ }
347
+ },
348
+ onWheelScroll: (scrollPos)=>{
349
+ if (context.viewport) context.viewport.scrollTop = scrollPos;
350
+ },
351
+ onDragScroll: (pointerPos)=>{
352
+ if (context.viewport) context.viewport.scrollTop = getScrollPosition(pointerPos);
353
+ }
354
+ }));
355
+ return null;
356
+ });
357
+ /* -----------------------------------------------------------------------------------------------*/ const $57acba87d6e25586$var$ScrollAreaScrollbarX = /*#__PURE__*/ $fnFM9$forwardRef((props, forwardedRef)=>{
358
+ const { sizes: sizes , onSizesChange: onSizesChange , ...scrollbarProps } = props;
359
+ const context = $57acba87d6e25586$var$useScrollAreaContext($57acba87d6e25586$var$SCROLLBAR_NAME, props.__scopeScrollArea);
360
+ const [computedStyle, setComputedStyle] = $fnFM9$useState();
361
+ const ref = $fnFM9$useRef(null);
362
+ const composeRefs = $fnFM9$useComposedRefs(forwardedRef, ref, context.onScrollbarXChange);
363
+ $fnFM9$useEffect(()=>{
364
+ if (ref.current) setComputedStyle(getComputedStyle(ref.current));
365
+ }, [
366
+ ref
367
+ ]);
368
+ return /*#__PURE__*/ $fnFM9$createElement($57acba87d6e25586$var$ScrollAreaScrollbarImpl, $fnFM9$babelruntimehelpersesmextends({
369
+ "data-orientation": "horizontal"
370
+ }, scrollbarProps, {
371
+ ref: composeRefs,
372
+ sizes: sizes,
373
+ style: {
374
+ bottom: 0,
375
+ left: context.dir === 'rtl' ? 'var(--radix-scroll-area-corner-width)' : 0,
376
+ right: context.dir === 'ltr' ? 'var(--radix-scroll-area-corner-width)' : 0,
377
+ ['--radix-scroll-area-thumb-width']: $57acba87d6e25586$var$getThumbSize(sizes) + 'px',
378
+ ...props.style
379
+ },
380
+ onThumbPointerDown: (pointerPos)=>props.onThumbPointerDown(pointerPos.x)
381
+ ,
382
+ onDragScroll: (pointerPos)=>props.onDragScroll(pointerPos.x)
383
+ ,
384
+ onWheelScroll: (event, maxScrollPos)=>{
385
+ if (context.viewport) {
386
+ const scrollPos = context.viewport.scrollLeft + event.deltaX;
387
+ props.onWheelScroll(scrollPos); // prevent window scroll when wheeling on scrollbar
388
+ if ($57acba87d6e25586$var$isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) event.preventDefault();
389
+ }
390
+ },
391
+ onResize: ()=>{
392
+ if (ref.current && context.viewport && computedStyle) onSizesChange({
393
+ content: context.viewport.scrollWidth,
394
+ viewport: context.viewport.offsetWidth,
395
+ scrollbar: {
396
+ size: ref.current.clientWidth,
397
+ paddingStart: $57acba87d6e25586$var$toInt(computedStyle.paddingLeft),
398
+ paddingEnd: $57acba87d6e25586$var$toInt(computedStyle.paddingRight)
399
+ }
400
+ });
401
+ }
402
+ }));
403
+ });
404
+ const $57acba87d6e25586$var$ScrollAreaScrollbarY = /*#__PURE__*/ $fnFM9$forwardRef((props, forwardedRef)=>{
405
+ const { sizes: sizes , onSizesChange: onSizesChange , ...scrollbarProps } = props;
406
+ const context = $57acba87d6e25586$var$useScrollAreaContext($57acba87d6e25586$var$SCROLLBAR_NAME, props.__scopeScrollArea);
407
+ const [computedStyle, setComputedStyle] = $fnFM9$useState();
408
+ const ref = $fnFM9$useRef(null);
409
+ const composeRefs = $fnFM9$useComposedRefs(forwardedRef, ref, context.onScrollbarYChange);
410
+ $fnFM9$useEffect(()=>{
411
+ if (ref.current) setComputedStyle(getComputedStyle(ref.current));
412
+ }, [
413
+ ref
414
+ ]);
415
+ return /*#__PURE__*/ $fnFM9$createElement($57acba87d6e25586$var$ScrollAreaScrollbarImpl, $fnFM9$babelruntimehelpersesmextends({
416
+ "data-orientation": "vertical"
417
+ }, scrollbarProps, {
418
+ ref: composeRefs,
419
+ sizes: sizes,
420
+ style: {
421
+ top: 0,
422
+ right: context.dir === 'ltr' ? 0 : undefined,
423
+ left: context.dir === 'rtl' ? 0 : undefined,
424
+ bottom: 'var(--radix-scroll-area-corner-height)',
425
+ ['--radix-scroll-area-thumb-height']: $57acba87d6e25586$var$getThumbSize(sizes) + 'px',
426
+ ...props.style
427
+ },
428
+ onThumbPointerDown: (pointerPos)=>props.onThumbPointerDown(pointerPos.y)
429
+ ,
430
+ onDragScroll: (pointerPos)=>props.onDragScroll(pointerPos.y)
431
+ ,
432
+ onWheelScroll: (event, maxScrollPos)=>{
433
+ if (context.viewport) {
434
+ const scrollPos = context.viewport.scrollTop + event.deltaY;
435
+ props.onWheelScroll(scrollPos); // prevent window scroll when wheeling on scrollbar
436
+ if ($57acba87d6e25586$var$isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos)) event.preventDefault();
437
+ }
438
+ },
439
+ onResize: ()=>{
440
+ if (ref.current && context.viewport && computedStyle) onSizesChange({
441
+ content: context.viewport.scrollHeight,
442
+ viewport: context.viewport.offsetHeight,
443
+ scrollbar: {
444
+ size: ref.current.clientHeight,
445
+ paddingStart: $57acba87d6e25586$var$toInt(computedStyle.paddingTop),
446
+ paddingEnd: $57acba87d6e25586$var$toInt(computedStyle.paddingBottom)
447
+ }
448
+ });
449
+ }
450
+ }));
451
+ });
452
+ /* -----------------------------------------------------------------------------------------------*/ const [$57acba87d6e25586$var$ScrollbarProvider, $57acba87d6e25586$var$useScrollbarContext] = $57acba87d6e25586$var$createScrollAreaContext($57acba87d6e25586$var$SCROLLBAR_NAME);
453
+ const $57acba87d6e25586$var$ScrollAreaScrollbarImpl = /*#__PURE__*/ $fnFM9$forwardRef((props, forwardedRef)=>{
454
+ const { __scopeScrollArea: __scopeScrollArea , sizes: sizes , hasThumb: hasThumb , onThumbChange: onThumbChange , onThumbPointerUp: onThumbPointerUp , onThumbPointerDown: onThumbPointerDown , onThumbPositionChange: onThumbPositionChange , onDragScroll: onDragScroll , onWheelScroll: onWheelScroll , onResize: onResize , ...scrollbarProps } = props;
455
+ const context = $57acba87d6e25586$var$useScrollAreaContext($57acba87d6e25586$var$SCROLLBAR_NAME, __scopeScrollArea);
456
+ const [scrollbar, setScrollbar] = $fnFM9$useState(null);
457
+ const composeRefs = $fnFM9$useComposedRefs(forwardedRef, (node)=>setScrollbar(node)
458
+ );
459
+ const rectRef = $fnFM9$useRef(null);
460
+ const prevWebkitUserSelectRef = $fnFM9$useRef('');
461
+ const viewport = context.viewport;
462
+ const maxScrollPos = sizes.content - sizes.viewport;
463
+ const handleWheelScroll = $fnFM9$useCallbackRef(onWheelScroll);
464
+ const handleThumbPositionChange = $fnFM9$useCallbackRef(onThumbPositionChange);
465
+ const handleResize = $57acba87d6e25586$var$useDebounceCallback(onResize, 10);
466
+ function handleDragScroll(event) {
467
+ if (rectRef.current) {
468
+ const x = event.clientX - rectRef.current.left;
469
+ const y = event.clientY - rectRef.current.top;
470
+ onDragScroll({
471
+ x: x,
472
+ y: y
473
+ });
474
+ }
475
+ }
476
+ /**
477
+ * We bind wheel event imperatively so we can switch off passive
478
+ * mode for document wheel event to allow it to be prevented
479
+ */ $fnFM9$useEffect(()=>{
480
+ const handleWheel = (event)=>{
481
+ const element = event.target;
482
+ const isScrollbarWheel = scrollbar === null || scrollbar === void 0 ? void 0 : scrollbar.contains(element);
483
+ if (isScrollbarWheel) handleWheelScroll(event, maxScrollPos);
484
+ };
485
+ document.addEventListener('wheel', handleWheel, {
486
+ passive: false
487
+ });
488
+ return ()=>document.removeEventListener('wheel', handleWheel, {
489
+ passive: false
490
+ })
491
+ ;
492
+ }, [
493
+ viewport,
494
+ scrollbar,
495
+ maxScrollPos,
496
+ handleWheelScroll
497
+ ]);
498
+ /**
499
+ * Update thumb position on sizes change
500
+ */ $fnFM9$useEffect(handleThumbPositionChange, [
501
+ sizes,
502
+ handleThumbPositionChange
503
+ ]);
504
+ $57acba87d6e25586$var$useResizeObserver(scrollbar, handleResize);
505
+ $57acba87d6e25586$var$useResizeObserver(context.content, handleResize);
506
+ return /*#__PURE__*/ $fnFM9$createElement($57acba87d6e25586$var$ScrollbarProvider, {
507
+ scope: __scopeScrollArea,
508
+ scrollbar: scrollbar,
509
+ hasThumb: hasThumb,
510
+ onThumbChange: $fnFM9$useCallbackRef(onThumbChange),
511
+ onThumbPointerUp: $fnFM9$useCallbackRef(onThumbPointerUp),
512
+ onThumbPositionChange: handleThumbPositionChange,
513
+ onThumbPointerDown: $fnFM9$useCallbackRef(onThumbPointerDown)
514
+ }, /*#__PURE__*/ $fnFM9$createElement($fnFM9$Primitive.div, $fnFM9$babelruntimehelpersesmextends({}, scrollbarProps, {
515
+ ref: composeRefs,
516
+ style: {
517
+ position: 'absolute',
518
+ ...scrollbarProps.style
519
+ },
520
+ onPointerDown: $fnFM9$composeEventHandlers(props.onPointerDown, (event)=>{
521
+ const mainPointer = 0;
522
+ if (event.button === mainPointer) {
523
+ const element = event.target;
524
+ element.setPointerCapture(event.pointerId);
525
+ rectRef.current = scrollbar.getBoundingClientRect(); // pointer capture doesn't prevent text selection in Safari
526
+ // so we remove text selection manually when scrolling
527
+ prevWebkitUserSelectRef.current = document.body.style.webkitUserSelect;
528
+ document.body.style.webkitUserSelect = 'none';
529
+ handleDragScroll(event);
530
+ }
531
+ }),
532
+ onPointerMove: $fnFM9$composeEventHandlers(props.onPointerMove, handleDragScroll),
533
+ onPointerUp: $fnFM9$composeEventHandlers(props.onPointerUp, (event)=>{
534
+ const element = event.target;
535
+ element.releasePointerCapture(event.pointerId);
536
+ document.body.style.webkitUserSelect = prevWebkitUserSelectRef.current;
537
+ rectRef.current = null;
538
+ })
539
+ })));
540
+ });
541
+ /* -------------------------------------------------------------------------------------------------
542
+ * ScrollAreaThumb
543
+ * -----------------------------------------------------------------------------------------------*/ const $57acba87d6e25586$var$THUMB_NAME = 'ScrollAreaThumb';
544
+ const $57acba87d6e25586$export$9fba1154677d7cd2 = /*#__PURE__*/ $fnFM9$forwardRef((props, forwardedRef)=>{
545
+ const { forceMount: forceMount , ...thumbProps } = props;
546
+ const scrollbarContext = $57acba87d6e25586$var$useScrollbarContext($57acba87d6e25586$var$THUMB_NAME, props.__scopeScrollArea);
547
+ return /*#__PURE__*/ $fnFM9$createElement($fnFM9$Presence, {
548
+ present: forceMount || scrollbarContext.hasThumb
549
+ }, /*#__PURE__*/ $fnFM9$createElement($57acba87d6e25586$var$ScrollAreaThumbImpl, $fnFM9$babelruntimehelpersesmextends({
550
+ ref: forwardedRef
551
+ }, thumbProps)));
552
+ });
553
+ const $57acba87d6e25586$var$ScrollAreaThumbImpl = /*#__PURE__*/ $fnFM9$forwardRef((props, forwardedRef)=>{
554
+ const { __scopeScrollArea: __scopeScrollArea , style: style , ...thumbProps } = props;
555
+ const scrollAreaContext = $57acba87d6e25586$var$useScrollAreaContext($57acba87d6e25586$var$THUMB_NAME, __scopeScrollArea);
556
+ const scrollbarContext = $57acba87d6e25586$var$useScrollbarContext($57acba87d6e25586$var$THUMB_NAME, __scopeScrollArea);
557
+ const { onThumbPositionChange: onThumbPositionChange } = scrollbarContext;
558
+ const composedRef = $fnFM9$useComposedRefs(forwardedRef, (node)=>scrollbarContext.onThumbChange(node)
559
+ );
560
+ const removeUnlinkedScrollListenerRef = $fnFM9$useRef();
561
+ const debounceScrollEnd = $57acba87d6e25586$var$useDebounceCallback(()=>{
562
+ if (removeUnlinkedScrollListenerRef.current) {
563
+ removeUnlinkedScrollListenerRef.current();
564
+ removeUnlinkedScrollListenerRef.current = undefined;
565
+ }
566
+ }, 100);
567
+ $fnFM9$useEffect(()=>{
568
+ const viewport = scrollAreaContext.viewport;
569
+ if (viewport) {
570
+ /**
571
+ * We only bind to native scroll event so we know when scroll starts and ends.
572
+ * When scroll starts we start a requestAnimationFrame loop that checks for
573
+ * changes to scroll position. That rAF loop triggers our thumb position change
574
+ * when relevant to avoid scroll-linked effects. We cancel the loop when scroll ends.
575
+ * https://developer.mozilla.org/en-US/docs/Mozilla/Performance/Scroll-linked_effects
576
+ */ const handleScroll = ()=>{
577
+ debounceScrollEnd();
578
+ if (!removeUnlinkedScrollListenerRef.current) {
579
+ const listener = $57acba87d6e25586$var$addUnlinkedScrollListener(viewport, onThumbPositionChange);
580
+ removeUnlinkedScrollListenerRef.current = listener;
581
+ onThumbPositionChange();
582
+ }
583
+ };
584
+ onThumbPositionChange();
585
+ viewport.addEventListener('scroll', handleScroll);
586
+ return ()=>viewport.removeEventListener('scroll', handleScroll)
587
+ ;
588
+ }
589
+ }, [
590
+ scrollAreaContext.viewport,
591
+ debounceScrollEnd,
592
+ onThumbPositionChange
593
+ ]);
594
+ return /*#__PURE__*/ $fnFM9$createElement($fnFM9$Primitive.div, $fnFM9$babelruntimehelpersesmextends({
595
+ "data-state": scrollbarContext.hasThumb ? 'visible' : 'hidden'
596
+ }, thumbProps, {
597
+ ref: composedRef,
598
+ style: {
599
+ width: 'var(--radix-scroll-area-thumb-width)',
600
+ height: 'var(--radix-scroll-area-thumb-height)',
601
+ ...style
602
+ },
603
+ onPointerDownCapture: $fnFM9$composeEventHandlers(props.onPointerDownCapture, (event)=>{
604
+ const thumb = event.target;
605
+ const thumbRect = thumb.getBoundingClientRect();
606
+ const x = event.clientX - thumbRect.left;
607
+ const y = event.clientY - thumbRect.top;
608
+ scrollbarContext.onThumbPointerDown({
609
+ x: x,
610
+ y: y
611
+ });
612
+ }),
613
+ onPointerUp: $fnFM9$composeEventHandlers(props.onPointerUp, scrollbarContext.onThumbPointerUp)
614
+ }));
615
+ });
616
+ /*#__PURE__*/ Object.assign($57acba87d6e25586$export$9fba1154677d7cd2, {
617
+ displayName: $57acba87d6e25586$var$THUMB_NAME
618
+ });
619
+ /* -------------------------------------------------------------------------------------------------
620
+ * ScrollAreaCorner
621
+ * -----------------------------------------------------------------------------------------------*/ const $57acba87d6e25586$var$CORNER_NAME = 'ScrollAreaCorner';
622
+ const $57acba87d6e25586$export$56969d565df7cc4b = /*#__PURE__*/ $fnFM9$forwardRef((props, forwardedRef)=>{
623
+ const context = $57acba87d6e25586$var$useScrollAreaContext($57acba87d6e25586$var$CORNER_NAME, props.__scopeScrollArea);
624
+ const hasBothScrollbarsVisible = Boolean(context.scrollbarX && context.scrollbarY);
625
+ const hasCorner = context.type !== 'scroll' && hasBothScrollbarsVisible;
626
+ return hasCorner ? /*#__PURE__*/ $fnFM9$createElement($57acba87d6e25586$var$ScrollAreaCornerImpl, $fnFM9$babelruntimehelpersesmextends({}, props, {
627
+ ref: forwardedRef
628
+ })) : null;
629
+ });
630
+ /*#__PURE__*/ Object.assign($57acba87d6e25586$export$56969d565df7cc4b, {
631
+ displayName: $57acba87d6e25586$var$CORNER_NAME
632
+ });
633
+ /* -----------------------------------------------------------------------------------------------*/ const $57acba87d6e25586$var$ScrollAreaCornerImpl = /*#__PURE__*/ $fnFM9$forwardRef((props, forwardedRef)=>{
634
+ const { __scopeScrollArea: __scopeScrollArea , ...cornerProps } = props;
635
+ const context = $57acba87d6e25586$var$useScrollAreaContext($57acba87d6e25586$var$CORNER_NAME, __scopeScrollArea);
636
+ const [width1, setWidth] = $fnFM9$useState(0);
637
+ const [height1, setHeight] = $fnFM9$useState(0);
638
+ const hasSize = Boolean(width1 && height1);
639
+ $57acba87d6e25586$var$useResizeObserver(context.scrollbarX, ()=>{
640
+ var _context$scrollbarX;
641
+ const height = ((_context$scrollbarX = context.scrollbarX) === null || _context$scrollbarX === void 0 ? void 0 : _context$scrollbarX.offsetHeight) || 0;
642
+ context.onCornerHeightChange(height);
643
+ setHeight(height);
644
+ });
645
+ $57acba87d6e25586$var$useResizeObserver(context.scrollbarY, ()=>{
646
+ var _context$scrollbarY;
647
+ const width = ((_context$scrollbarY = context.scrollbarY) === null || _context$scrollbarY === void 0 ? void 0 : _context$scrollbarY.offsetWidth) || 0;
648
+ context.onCornerWidthChange(width);
649
+ setWidth(width);
650
+ });
651
+ return hasSize ? /*#__PURE__*/ $fnFM9$createElement($fnFM9$Primitive.div, $fnFM9$babelruntimehelpersesmextends({}, cornerProps, {
652
+ ref: forwardedRef,
653
+ style: {
654
+ width: width1,
655
+ height: height1,
656
+ position: 'absolute',
657
+ right: context.dir === 'ltr' ? 0 : undefined,
658
+ left: context.dir === 'rtl' ? 0 : undefined,
659
+ bottom: 0,
660
+ ...props.style
661
+ }
662
+ })) : null;
663
+ });
664
+ /* -----------------------------------------------------------------------------------------------*/ function $57acba87d6e25586$var$toInt(value) {
665
+ return value ? parseInt(value, 10) : 0;
666
+ }
667
+ function $57acba87d6e25586$var$getThumbRatio(viewportSize, contentSize) {
668
+ const ratio = viewportSize / contentSize;
669
+ return isNaN(ratio) ? 0 : ratio;
670
+ }
671
+ function $57acba87d6e25586$var$getThumbSize(sizes) {
672
+ const ratio = $57acba87d6e25586$var$getThumbRatio(sizes.viewport, sizes.content);
673
+ const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;
674
+ const thumbSize = (sizes.scrollbar.size - scrollbarPadding) * ratio; // minimum of 18 matches macOS minimum
675
+ return Math.max(thumbSize, 18);
676
+ }
677
+ function $57acba87d6e25586$var$getScrollPositionFromPointer(pointerPos, pointerOffset, sizes, dir = 'ltr') {
678
+ const thumbSizePx = $57acba87d6e25586$var$getThumbSize(sizes);
679
+ const thumbCenter = thumbSizePx / 2;
680
+ const offset = pointerOffset || thumbCenter;
681
+ const thumbOffsetFromEnd = thumbSizePx - offset;
682
+ const minPointerPos = sizes.scrollbar.paddingStart + offset;
683
+ const maxPointerPos = sizes.scrollbar.size - sizes.scrollbar.paddingEnd - thumbOffsetFromEnd;
684
+ const maxScrollPos = sizes.content - sizes.viewport;
685
+ const scrollRange = dir === 'ltr' ? [
686
+ 0,
687
+ maxScrollPos
688
+ ] : [
689
+ maxScrollPos * -1,
690
+ 0
691
+ ];
692
+ const interpolate = $57acba87d6e25586$var$linearScale([
693
+ minPointerPos,
694
+ maxPointerPos
695
+ ], scrollRange);
696
+ return interpolate(pointerPos);
697
+ }
698
+ function $57acba87d6e25586$var$getThumbOffsetFromScroll(scrollPos, sizes, dir = 'ltr') {
699
+ const thumbSizePx = $57acba87d6e25586$var$getThumbSize(sizes);
700
+ const scrollbarPadding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;
701
+ const scrollbar = sizes.scrollbar.size - scrollbarPadding;
702
+ const maxScrollPos = sizes.content - sizes.viewport;
703
+ const maxThumbPos = scrollbar - thumbSizePx;
704
+ const scrollClampRange = dir === 'ltr' ? [
705
+ 0,
706
+ maxScrollPos
707
+ ] : [
708
+ maxScrollPos * -1,
709
+ 0
710
+ ];
711
+ const scrollWithoutMomentum = $fnFM9$clamp(scrollPos, scrollClampRange);
712
+ const interpolate = $57acba87d6e25586$var$linearScale([
713
+ 0,
714
+ maxScrollPos
715
+ ], [
716
+ 0,
717
+ maxThumbPos
718
+ ]);
719
+ return interpolate(scrollWithoutMomentum);
720
+ } // https://github.com/tmcw-up-for-adoption/simple-linear-scale/blob/master/index.js
721
+ function $57acba87d6e25586$var$linearScale(input, output) {
722
+ return (value)=>{
723
+ if (input[0] === input[1] || output[0] === output[1]) return output[0];
724
+ const ratio = (output[1] - output[0]) / (input[1] - input[0]);
725
+ return output[0] + ratio * (value - input[0]);
726
+ };
727
+ }
728
+ function $57acba87d6e25586$var$isScrollingWithinScrollbarBounds(scrollPos, maxScrollPos) {
729
+ return scrollPos > 0 && scrollPos < maxScrollPos;
730
+ } // Custom scroll handler to avoid scroll-linked effects
731
+ // https://developer.mozilla.org/en-US/docs/Mozilla/Performance/Scroll-linked_effects
732
+ const $57acba87d6e25586$var$addUnlinkedScrollListener = (node, handler = ()=>{})=>{
733
+ let prevPosition = {
734
+ left: node.scrollLeft,
735
+ top: node.scrollTop
736
+ };
737
+ let rAF = 0;
738
+ (function loop() {
739
+ const position = {
740
+ left: node.scrollLeft,
741
+ top: node.scrollTop
742
+ };
743
+ const isHorizontalScroll = prevPosition.left !== position.left;
744
+ const isVerticalScroll = prevPosition.top !== position.top;
745
+ if (isHorizontalScroll || isVerticalScroll) handler();
746
+ prevPosition = position;
747
+ rAF = window.requestAnimationFrame(loop);
748
+ })();
749
+ return ()=>window.cancelAnimationFrame(rAF)
750
+ ;
751
+ };
752
+ function $57acba87d6e25586$var$useDebounceCallback(callback, delay) {
753
+ const handleCallback = $fnFM9$useCallbackRef(callback);
754
+ const debounceTimerRef = $fnFM9$useRef(0);
755
+ $fnFM9$useEffect(()=>()=>window.clearTimeout(debounceTimerRef.current)
756
+ , []);
757
+ return $fnFM9$useCallback(()=>{
758
+ window.clearTimeout(debounceTimerRef.current);
759
+ debounceTimerRef.current = window.setTimeout(handleCallback, delay);
760
+ }, [
761
+ handleCallback,
762
+ delay
763
+ ]);
764
+ }
765
+ function $57acba87d6e25586$var$useResizeObserver(element, onResize) {
766
+ const handleResize = $fnFM9$useCallbackRef(onResize);
767
+ $fnFM9$useLayoutEffect(()=>{
768
+ let rAF = 0;
769
+ if (element) {
770
+ /**
771
+ * Resize Observer will throw an often benign error that says `ResizeObserver loop
772
+ * completed with undelivered notifications`. This means that ResizeObserver was not
773
+ * able to deliver all observations within a single animation frame, so we use
774
+ * `requestAnimationFrame` to ensure we don't deliver unnecessary observations.
775
+ * Further reading: https://github.com/WICG/resize-observer/issues/38
776
+ */ const resizeObserver = new ResizeObserver(()=>{
777
+ cancelAnimationFrame(rAF);
778
+ rAF = window.requestAnimationFrame(handleResize);
779
+ });
780
+ resizeObserver.observe(element);
781
+ return ()=>{
782
+ window.cancelAnimationFrame(rAF);
783
+ resizeObserver.unobserve(element);
784
+ };
785
+ }
786
+ }, [
787
+ element,
788
+ handleResize
789
+ ]);
790
+ }
791
+ /* -----------------------------------------------------------------------------------------------*/ const $57acba87d6e25586$export$be92b6f5f03c0fe9 = $57acba87d6e25586$export$ccf8d8d7bbf3c2cc;
792
+ const $57acba87d6e25586$export$d5c6c08dc2d3ca7 = $57acba87d6e25586$export$a21cbf9f11fca853;
793
+ const $57acba87d6e25586$export$9a4e88b92edfce6b = $57acba87d6e25586$export$2fabd85d0eba3c57;
794
+ const $57acba87d6e25586$export$6521433ed15a34db = $57acba87d6e25586$export$9fba1154677d7cd2;
795
+ const $57acba87d6e25586$export$ac61190d9fc311a9 = $57acba87d6e25586$export$56969d565df7cc4b;
796
+
797
+
798
+
799
+
800
+ export {$57acba87d6e25586$export$488468afe3a6f2b1 as createScrollAreaScope, $57acba87d6e25586$export$ccf8d8d7bbf3c2cc as ScrollArea, $57acba87d6e25586$export$a21cbf9f11fca853 as ScrollAreaViewport, $57acba87d6e25586$export$2fabd85d0eba3c57 as ScrollAreaScrollbar, $57acba87d6e25586$export$9fba1154677d7cd2 as ScrollAreaThumb, $57acba87d6e25586$export$56969d565df7cc4b as ScrollAreaCorner, $57acba87d6e25586$export$be92b6f5f03c0fe9 as Root, $57acba87d6e25586$export$d5c6c08dc2d3ca7 as Viewport, $57acba87d6e25586$export$9a4e88b92edfce6b as Scrollbar, $57acba87d6e25586$export$6521433ed15a34db as Thumb, $57acba87d6e25586$export$ac61190d9fc311a9 as Corner};
2
801
  //# sourceMappingURL=index.module.js.map