Skip to content

Commit b511990

Browse files
mj12albertonehanddev
authored andcommitted
[ScrollArea] Read DirectionProvider and use logical positioning CSS props (mui#1194)
1 parent b6f179b commit b511990

File tree

6 files changed

+23
-48
lines changed

6 files changed

+23
-48
lines changed

packages/react/src/scroll-area/corner/ScrollAreaCorner.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const ScrollAreaCorner = React.forwardRef(function ScrollAreaCorner(
2121
) {
2222
const { render, className, ...otherProps } = props;
2323

24-
const { dir, cornerRef, cornerSize, hiddenState } = useScrollAreaRootContext();
24+
const { cornerRef, cornerSize, hiddenState } = useScrollAreaRootContext();
2525

2626
const mergedRef = useForkRef(cornerRef, forwardedRef);
2727

@@ -34,7 +34,7 @@ const ScrollAreaCorner = React.forwardRef(function ScrollAreaCorner(
3434
style: {
3535
position: 'absolute',
3636
bottom: 0,
37-
[dir === 'rtl' ? 'left' : 'right']: 0,
37+
insetInlineEnd: 0,
3838
width: cornerSize.width,
3939
height: cornerSize.height,
4040
},

packages/react/src/scroll-area/root/ScrollAreaRoot.tsx

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ const ScrollAreaRoot = React.forwardRef(function ScrollAreaRoot(
1818
props: ScrollAreaRoot.Props,
1919
forwardedRef: React.ForwardedRef<HTMLDivElement>,
2020
) {
21-
const { render, className, dir, ...otherProps } = props;
21+
const { render, className, ...otherProps } = props;
2222

23-
const scrollAreaRoot = useScrollAreaRoot({ dir });
23+
const scrollAreaRoot = useScrollAreaRoot();
2424

2525
const { rootId } = scrollAreaRoot;
2626

@@ -33,13 +33,7 @@ const ScrollAreaRoot = React.forwardRef(function ScrollAreaRoot(
3333
extraProps: otherProps,
3434
});
3535

36-
const contextValue = React.useMemo(
37-
() => ({
38-
dir,
39-
...scrollAreaRoot,
40-
}),
41-
[dir, scrollAreaRoot],
42-
);
36+
const contextValue = React.useMemo(() => scrollAreaRoot, [scrollAreaRoot]);
4337

4438
const viewportId = `[data-id="${rootId}-viewport"]`;
4539

@@ -83,10 +77,6 @@ ScrollAreaRoot.propTypes /* remove-proptypes */ = {
8377
* returns a class based on the component’s state.
8478
*/
8579
className: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
86-
/**
87-
* @ignore
88-
*/
89-
dir: PropTypes.string,
9080
/**
9181
* Allows you to replace the component’s HTML element
9282
* with a different tag, or compose it with another component.

packages/react/src/scroll-area/root/ScrollAreaRootContext.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import * as React from 'react';
22

33
export interface ScrollAreaRootContext {
4-
dir: string | undefined;
54
cornerSize: { width: number; height: number };
65
setCornerSize: React.Dispatch<React.SetStateAction<{ width: number; height: number }>>;
76
thumbSize: { width: number; height: number };

packages/react/src/scroll-area/root/useScrollAreaRoot.ts

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import * as React from 'react';
22
import { useEventCallback } from '../../utils/useEventCallback';
3-
import { useEnhancedEffect } from '../../utils/useEnhancedEffect';
43
import { mergeReactProps } from '../../utils/mergeReactProps';
54
import { useBaseUiId } from '../../utils/useBaseUiId';
65
import { SCROLL_TIMEOUT } from '../constants';
@@ -12,9 +11,7 @@ interface Size {
1211
height: number;
1312
}
1413

15-
export function useScrollAreaRoot(params: useScrollAreaRoot.Parameters) {
16-
const { dir: dirParam } = params;
17-
14+
export function useScrollAreaRoot() {
1815
const [hovering, setHovering] = React.useState(false);
1916
const [scrollingX, setScrollingX] = React.useState(false);
2017
const [scrollingY, setScrollingY] = React.useState(false);
@@ -47,15 +44,6 @@ export function useScrollAreaRoot(params: useScrollAreaRoot.Parameters) {
4744
cornerHidden: false,
4845
});
4946

50-
const [autoDir, setAutoDir] = React.useState(dirParam);
51-
const dir = dirParam ?? autoDir;
52-
53-
useEnhancedEffect(() => {
54-
if (dirParam === undefined && viewportRef.current) {
55-
setAutoDir(getComputedStyle(viewportRef.current).direction);
56-
}
57-
}, [dirParam]);
58-
5947
React.useEffect(() => {
6048
return () => {
6149
window.clearTimeout(scrollYTimeoutRef.current);
@@ -193,7 +181,6 @@ export function useScrollAreaRoot(params: useScrollAreaRoot.Parameters) {
193181
const getRootProps = React.useCallback(
194182
(externalProps = {}) =>
195183
mergeReactProps<'div'>(externalProps, {
196-
dir,
197184
onPointerEnter: handlePointerEnterOrMove,
198185
onPointerMove: handlePointerEnterOrMove,
199186
onPointerDown({ pointerType }) {
@@ -208,7 +195,7 @@ export function useScrollAreaRoot(params: useScrollAreaRoot.Parameters) {
208195
[ScrollAreaRootCssVars.scrollAreaCornerWidth as string]: `${cornerSize.width}px`,
209196
},
210197
}),
211-
[cornerSize, dir, handlePointerEnterOrMove],
198+
[cornerSize, handlePointerEnterOrMove],
212199
);
213200

214201
return React.useMemo(
@@ -266,8 +253,4 @@ export function useScrollAreaRoot(params: useScrollAreaRoot.Parameters) {
266253
);
267254
}
268255

269-
export namespace useScrollAreaRoot {
270-
export interface Parameters {
271-
dir: string | undefined;
272-
}
273-
}
256+
export namespace useScrollAreaRoot {}

packages/react/src/scroll-area/scrollbar/useScrollAreaScrollbar.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import * as React from 'react';
2-
import { useScrollAreaRootContext } from '../root/ScrollAreaRootContext';
2+
import { useDirection } from '../../direction-provider/DirectionContext';
33
import { mergeReactProps } from '../../utils/mergeReactProps';
44
import { getOffset } from '../utils/getOffset';
5+
import { useScrollAreaRootContext } from '../root/ScrollAreaRootContext';
56
import { ScrollAreaRootCssVars } from '../root/ScrollAreaRootCssVars';
67
import { ScrollAreaScrollbarCssVars } from './ScrollAreaScrollbarCssVars';
78

89
export function useScrollAreaScrollbar(params: useScrollAreaScrollbar.Parameters) {
910
const { orientation } = params;
1011

1112
const {
12-
dir,
1313
scrollbarYRef,
1414
scrollbarXRef,
1515
viewportRef,
@@ -21,6 +21,8 @@ export function useScrollAreaScrollbar(params: useScrollAreaScrollbar.Parameters
2121
thumbSize,
2222
} = useScrollAreaRootContext();
2323

24+
const direction = useDirection();
25+
2426
React.useEffect(() => {
2527
const viewportEl = viewportRef.current;
2628
const scrollbarEl = orientation === 'vertical' ? scrollbarYRef.current : scrollbarXRef.current;
@@ -130,7 +132,7 @@ export function useScrollAreaScrollbar(params: useScrollAreaScrollbar.Parameters
130132
const scrollRatioX = clickX / maxThumbOffsetX;
131133

132134
let newScrollLeft: number;
133-
if (dir === 'rtl') {
135+
if (direction === 'rtl') {
134136
// In RTL, invert the scroll direction
135137
newScrollLeft = (1 - scrollRatioX) * (scrollableContentWidth - viewportWidth);
136138

@@ -154,13 +156,12 @@ export function useScrollAreaScrollbar(params: useScrollAreaScrollbar.Parameters
154156
...(orientation === 'vertical' && {
155157
top: 0,
156158
bottom: `var(${ScrollAreaRootCssVars.scrollAreaCornerHeight})`,
157-
[dir === 'rtl' ? 'left' : 'right']: 0,
159+
insetInlineEnd: 0,
158160
[ScrollAreaScrollbarCssVars.scrollAreaThumbHeight as string]: `${thumbSize.height}px`,
159161
}),
160162
...(orientation === 'horizontal' && {
161-
[dir === 'rtl' ? 'right' : 'left']: 0,
162-
[dir === 'rtl' ? 'left' : 'right']:
163-
`var(${ScrollAreaRootCssVars.scrollAreaCornerWidth})`,
163+
insetInlineStart: 0,
164+
insetInlineEnd: `var(${ScrollAreaRootCssVars.scrollAreaCornerWidth})`,
164165
bottom: 0,
165166
[ScrollAreaScrollbarCssVars.scrollAreaThumbWidth as string]: `${thumbSize.width}px`,
166167
}),
@@ -170,7 +171,7 @@ export function useScrollAreaScrollbar(params: useScrollAreaScrollbar.Parameters
170171
rootId,
171172
handlePointerUp,
172173
orientation,
173-
dir,
174+
direction,
174175
thumbSize.height,
175176
thumbSize.width,
176177
viewportRef,

packages/react/src/scroll-area/viewport/useScrollAreaViewport.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import * as React from 'react';
2-
import { useScrollAreaRootContext } from '../root/ScrollAreaRootContext';
2+
import { useDirection } from '../../direction-provider/DirectionContext';
33
import { useEventCallback } from '../../utils/useEventCallback';
44
import { useEnhancedEffect } from '../../utils/useEnhancedEffect';
55
import { mergeReactProps } from '../../utils/mergeReactProps';
66
import { clamp } from '../../utils/clamp';
7+
import { useScrollAreaRootContext } from '../root/ScrollAreaRootContext';
78
import { MIN_THUMB_SIZE } from '../constants';
89
import { getOffset } from '../utils/getOffset';
910

@@ -17,7 +18,6 @@ export function useScrollAreaViewport(params: useScrollAreaViewport.Parameters)
1718
thumbYRef,
1819
thumbXRef,
1920
cornerRef,
20-
dir,
2121
setCornerSize,
2222
setThumbSize,
2323
rootId,
@@ -27,6 +27,8 @@ export function useScrollAreaViewport(params: useScrollAreaViewport.Parameters)
2727
setHovering,
2828
} = useScrollAreaRootContext();
2929

30+
const direction = useDirection();
31+
3032
const contentWrapperRef = React.useRef<HTMLDivElement | null>(null);
3133

3234
const computeThumb = useEventCallback(() => {
@@ -102,7 +104,7 @@ export function useScrollAreaViewport(params: useScrollAreaViewport.Parameters)
102104
// In Safari, don't allow it to go negative or too far as `scrollLeft` considers the rubber
103105
// band effect.
104106
const thumbOffsetX =
105-
dir === 'rtl'
107+
direction === 'rtl'
106108
? clamp(scrollRatioX * maxThumbOffsetX, -maxThumbOffsetX, 0)
107109
: clamp(scrollRatioX * maxThumbOffsetX, 0, maxThumbOffsetX);
108110

@@ -146,7 +148,7 @@ export function useScrollAreaViewport(params: useScrollAreaViewport.Parameters)
146148

147149
useEnhancedEffect(() => {
148150
computeThumb();
149-
}, [computeThumb, hiddenState, dir]);
151+
}, [computeThumb, hiddenState, direction]);
150152

151153
useEnhancedEffect(() => {
152154
// `onMouseEnter` doesn't fire upon load, so we need to check if the viewport is already

0 commit comments

Comments
 (0)