@radix-ui/react-scroll-area 1.0.6-rc.9 → 1.1.0-rc.2

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