Skip to content

Commit f247e6c

Browse files
committed
feat(ScrollBar): ✨ support dark mode by js
1 parent bf79bff commit f247e6c

1 file changed

Lines changed: 28 additions & 2 deletions

File tree

src/ScrollBar.tsx

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import raf from 'rc-util/lib/raf';
33
import * as React from 'react';
44
import { getPageXY } from './hooks/useScrollDrag';
55

6+
const isDark = () => window.matchMedia?.('(prefers-color-scheme: dark)').matches;
7+
68
export type ScrollBarDirectionType = 'ltr' | 'rtl';
79

810
export interface ScrollBarProps {
@@ -45,6 +47,7 @@ const ScrollBar = React.forwardRef<ScrollBarRef, ScrollBarProps>((props, ref) =>
4547
const [dragging, setDragging] = React.useState(false);
4648
const [pageXY, setPageXY] = React.useState<number | null>(null);
4749
const [startTop, setStartTop] = React.useState<number | null>(null);
50+
const [dark, setDark] = React.useState(isDark());
4851

4952
const isLTR = !rtl;
5053

@@ -187,6 +190,28 @@ const ScrollBar = React.forwardRef<ScrollBarRef, ScrollBarProps>((props, ref) =>
187190
}
188191
}, [dragging]);
189192

193+
React.useEffect(() => {
194+
const media = window.matchMedia?.('(prefers-color-scheme: dark)');
195+
196+
const listener = (e: MediaQueryListEvent) => {
197+
setDark(e.matches);
198+
};
199+
200+
if (media?.addEventListener) {
201+
media.addEventListener('change', listener);
202+
} else if (media?.addListener) {
203+
media.addListener(listener);
204+
}
205+
206+
return () => {
207+
if (media?.removeEventListener) {
208+
media.removeEventListener('change', listener);
209+
} else if (media?.removeListener) {
210+
media.removeListener(listener);
211+
}
212+
};
213+
}, []);
214+
190215
React.useEffect(() => {
191216
delayHidden();
192217
return () => {
@@ -209,10 +234,11 @@ const ScrollBar = React.forwardRef<ScrollBarRef, ScrollBarProps>((props, ref) =>
209234

210235
const thumbStyle: React.CSSProperties = {
211236
position: 'absolute',
212-
background: 'rgba(0, 0, 0, 0.5)',
237+
background: dark ? 'rgba(255, 255, 255, 0.5)' : 'rgba(0, 0, 0, 0.5)',
213238
borderRadius: 99,
214239
cursor: 'pointer',
215240
userSelect: 'none',
241+
...propsThumbStyle,
216242
};
217243

218244
if (horizontal) {
@@ -266,7 +292,7 @@ const ScrollBar = React.forwardRef<ScrollBarRef, ScrollBarProps>((props, ref) =>
266292
className={classNames(`${scrollbarPrefixCls}-thumb`, {
267293
[`${scrollbarPrefixCls}-thumb-moving`]: dragging,
268294
})}
269-
style={{ ...thumbStyle, ...propsThumbStyle }}
295+
style={{ ...thumbStyle }}
270296
onMouseDown={onThumbMouseDown}
271297
/>
272298
</div>

0 commit comments

Comments
 (0)