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

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