deepsea-components 2.8.2 → 2.8.5

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,21 +1,38 @@
1
1
  import { CSSProperties } from "react";
2
2
  import { ScrollProps } from "./Scroll";
3
3
  export interface AutoScrollProps extends ScrollProps {
4
- /** 轮播的数据 */
4
+ /** 轮播元素的个数 */
5
5
  count: number;
6
6
  /** 轮播元素的高度 */
7
7
  itemHeight: number;
8
- /** 轮播动画的时间 */
9
- animation: number;
10
- /** 每个元素的停留时间 */
11
- duration: number;
12
- /** 元素之间的间距 */
8
+ /**
9
+ * 轮播动画的时间,单位毫秒
10
+ * @default 1000
11
+ */
12
+ animation?: number;
13
+ /**
14
+ * 每个元素的停留时间,单位毫秒
15
+ * @default 3000
16
+ */
17
+ duration?: number;
18
+ /**
19
+ * 元素之间的间距
20
+ * @default 0
21
+ */
13
22
  gap?: number;
14
23
  /** 容器类名 */
15
24
  containerClassName?: string;
16
25
  /** 容器样式 */
17
26
  containerStyle?: CSSProperties;
18
- /** 在鼠标移入时是否继续播放 */
27
+ /**
28
+ * 在鼠标移入时是否继续播放
29
+ * @default false
30
+ */
19
31
  playOnMouseEnter?: boolean;
32
+ /**
33
+ * 是否暂停
34
+ * @default false
35
+ */
36
+ paused?: boolean;
20
37
  }
21
38
  export declare const AutoScroll: import("react").ForwardRefExoticComponent<AutoScrollProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -29,17 +29,19 @@ var import_deepsea_tools = require("deepsea-tools");
29
29
  var import_react = require("react");
30
30
  var import_Scroll = require("./Scroll");
31
31
  var AutoScroll = (0, import_react.forwardRef)((props, ref) => {
32
- const { count, itemHeight, animation, duration, onMouseEnter, onMouseLeave, gap = 0, containerClassName, containerStyle, children, playOnMouseEnter, scrollbar, ...rest } = props;
32
+ const { count, itemHeight, animation = 1e3, duration = 3e3, onMouseEnter, onMouseLeave, gap = 0, containerClassName, containerStyle, children, playOnMouseEnter, scrollbar, paused, ...rest } = props;
33
33
  const bar = (0, import_react.useRef)(null);
34
34
  const timeout = (0, import_react.useRef)(void 0);
35
35
  const ele = (0, import_react.useRef)(null);
36
36
  const size = (0, import_ahooks.useSize)(ele);
37
- const pause = (0, import_react.useRef)(false);
37
+ const pausedRef = (0, import_react.useRef)(false);
38
+ const pausedProps = (0, import_react.useRef)(paused);
39
+ pausedProps.current = paused;
38
40
  (0, import_react.useImperativeHandle)(ref, () => ele.current, []);
39
41
  (0, import_react.useImperativeHandle)(scrollbar, () => bar.current, []);
40
42
  (0, import_react.useEffect)(() => {
41
43
  if (playOnMouseEnter)
42
- pause.current = false;
44
+ pausedRef.current = false;
43
45
  }, [playOnMouseEnter]);
44
46
  (0, import_react.useEffect)(() => {
45
47
  if (!size || count === 0)
@@ -52,7 +54,7 @@ var AutoScroll = (0, import_react.forwardRef)((props, ref) => {
52
54
  function scroll(target) {
53
55
  clearTimeout(timeout.current);
54
56
  timeout.current = setTimeout(() => {
55
- if (pause.current)
57
+ if (pausedRef.current || pausedProps.current)
56
58
  return scroll(target);
57
59
  bar.current?.scrollTo(0, target, animation);
58
60
  }, duration);
@@ -74,13 +76,13 @@ var AutoScroll = (0, import_react.forwardRef)((props, ref) => {
74
76
  function onContainerMouseEnter(e) {
75
77
  if (playOnMouseEnter)
76
78
  return;
77
- pause.current = true;
79
+ pausedRef.current = true;
78
80
  onMouseEnter?.(e);
79
81
  }
80
82
  function onContainerMouseLeave(e) {
81
83
  if (playOnMouseEnter)
82
84
  return;
83
- pause.current = false;
85
+ pausedRef.current = false;
84
86
  onMouseLeave?.(e);
85
87
  }
86
88
  return /* @__PURE__ */ React.createElement(import_Scroll.Scroll, { ref: ele, scrollbar: bar, onMouseEnter: onContainerMouseEnter, onMouseLeave: onContainerMouseLeave, ...rest }, /* @__PURE__ */ React.createElement(
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/AutoScroll.tsx"],
4
- "sourcesContent": ["\"use client\"\r\nimport { css } from \"@emotion/css\"\r\nimport { useSize } from \"ahooks\"\r\nimport { clsx, getArray } from \"deepsea-tools\"\r\nimport { CSSProperties, forwardRef, MouseEvent as ReactMouseEvent, useEffect, useImperativeHandle, useRef } from \"react\"\r\nimport Scrollbar from \"smooth-scrollbar\"\r\nimport { ScrollStatus } from \"smooth-scrollbar/interfaces/scrollbar\"\r\nimport { Scroll, ScrollProps } from \"./Scroll\"\r\n\r\nexport interface AutoScrollProps extends ScrollProps {\r\n /** 轮播的数据 */\r\n count: number\r\n\r\n /** 轮播元素的高度 */\r\n itemHeight: number\r\n\r\n /** 轮播动画的时间 */\r\n animation: number\r\n\r\n /** 每个元素的停留时间 */\r\n duration: number\r\n\r\n /** 元素之间的间距 */\r\n gap?: number\r\n\r\n /** 容器类名 */\r\n containerClassName?: string\r\n\r\n /** 容器样式 */\r\n containerStyle?: CSSProperties\r\n\r\n /** 在鼠标移入时是否继续播放 */\r\n playOnMouseEnter?: boolean\r\n}\r\n\r\nexport const AutoScroll = forwardRef<HTMLDivElement, AutoScrollProps>((props, ref) => {\r\n const { count, itemHeight, animation, duration, onMouseEnter, onMouseLeave, gap = 0, containerClassName, containerStyle, children, playOnMouseEnter, scrollbar, ...rest } = props\r\n const bar = useRef<Scrollbar | null>(null)\r\n const timeout = useRef<NodeJS.Timeout | undefined>(undefined)\r\n const ele = useRef<HTMLDivElement>(null)\r\n const size = useSize(ele)\r\n const pause = useRef(false)\r\n\r\n useImperativeHandle(ref, () => ele.current!, [])\r\n useImperativeHandle(scrollbar, () => bar.current!, [])\r\n\r\n useEffect(() => {\r\n if (playOnMouseEnter) pause.current = false\r\n }, [playOnMouseEnter])\r\n\r\n useEffect(() => {\r\n if (!size || count === 0) return\r\n const { height } = size\r\n const range = getArray(count, index => (itemHeight + gap) * (index + 1) - (index === count - 1 ? gap : 0))\r\n const scrollHeight = range[range.length - 1]\r\n if (height >= scrollHeight) return\r\n function scroll(target: number) {\r\n clearTimeout(timeout.current)\r\n timeout.current = setTimeout(() => {\r\n if (pause.current) return scroll(target)\r\n bar.current?.scrollTo(0, target, animation)\r\n }, duration)\r\n }\r\n scroll(range[0])\r\n function listener(status: ScrollStatus) {\r\n const { y } = status.offset\r\n const scrollToBottom = Math.abs(y + height - scrollHeight) / itemHeight <= 0.05\r\n const target = scrollToBottom ? 0 : range.find(item => item > y)!\r\n scroll(target)\r\n }\r\n bar.current?.addListener(listener)\r\n return () => {\r\n clearTimeout(timeout.current)\r\n bar.current?.removeListener(listener)\r\n bar.current?.scrollTo(0, 0)\r\n }\r\n }, [size, count, itemHeight, gap, duration, animation])\r\n\r\n function onContainerMouseEnter(e: ReactMouseEvent<HTMLDivElement, MouseEvent>) {\r\n if (playOnMouseEnter) return\r\n pause.current = true\r\n onMouseEnter?.(e)\r\n }\r\n\r\n function onContainerMouseLeave(e: ReactMouseEvent<HTMLDivElement, MouseEvent>) {\r\n if (playOnMouseEnter) return\r\n pause.current = false\r\n onMouseLeave?.(e)\r\n }\r\n\r\n return (\r\n <Scroll ref={ele} scrollbar={bar} onMouseEnter={onContainerMouseEnter} onMouseLeave={onContainerMouseLeave} {...rest}>\r\n <div\r\n className={clsx(\r\n css`\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--gap, 0);\r\n & > * {\r\n flex: none;\r\n }\r\n `,\r\n containerClassName\r\n )}\r\n style={{ \"--gap\": `${gap}px`, ...containerStyle } as CSSProperties}>\r\n {children}\r\n </div>\r\n </Scroll>\r\n )\r\n})\r\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAAoB;AACpB,oBAAwB;AACxB,2BAA+B;AAC/B,mBAAiH;AAGjH,oBAAoC;AA4B7B,IAAM,iBAAa,yBAA4C,CAAC,OAAO,QAAQ;AAClF,QAAM,EAAE,OAAO,YAAY,WAAW,UAAU,cAAc,cAAc,MAAM,GAAG,oBAAoB,gBAAgB,UAAU,kBAAkB,WAAW,GAAG,KAAK,IAAI;AAC5K,QAAM,UAAM,qBAAyB,IAAI;AACzC,QAAM,cAAU,qBAAmC,MAAS;AAC5D,QAAM,UAAM,qBAAuB,IAAI;AACvC,QAAM,WAAO,uBAAQ,GAAG;AACxB,QAAM,YAAQ,qBAAO,KAAK;AAE1B,wCAAoB,KAAK,MAAM,IAAI,SAAU,CAAC,CAAC;AAC/C,wCAAoB,WAAW,MAAM,IAAI,SAAU,CAAC,CAAC;AAErD,8BAAU,MAAM;AACZ,QAAI;AAAkB,YAAM,UAAU;AAAA,EAC1C,GAAG,CAAC,gBAAgB,CAAC;AAErB,8BAAU,MAAM;AACZ,QAAI,CAAC,QAAQ,UAAU;AAAG;AAC1B,UAAM,EAAE,OAAO,IAAI;AACnB,UAAM,YAAQ,+BAAS,OAAO,YAAU,aAAa,QAAQ,QAAQ,MAAM,UAAU,QAAQ,IAAI,MAAM,EAAE;AACzG,UAAM,eAAe,MAAM,MAAM,SAAS,CAAC;AAC3C,QAAI,UAAU;AAAc;AAC5B,aAAS,OAAO,QAAgB;AAC5B,mBAAa,QAAQ,OAAO;AAC5B,cAAQ,UAAU,WAAW,MAAM;AAC/B,YAAI,MAAM;AAAS,iBAAO,OAAO,MAAM;AACvC,YAAI,SAAS,SAAS,GAAG,QAAQ,SAAS;AAAA,MAC9C,GAAG,QAAQ;AAAA,IACf;AACA,WAAO,MAAM,CAAC,CAAC;AACf,aAAS,SAAS,QAAsB;AACpC,YAAM,EAAE,EAAE,IAAI,OAAO;AACrB,YAAM,iBAAiB,KAAK,IAAI,IAAI,SAAS,YAAY,IAAI,cAAc;AAC3E,YAAM,SAAS,iBAAiB,IAAI,MAAM,KAAK,UAAQ,OAAO,CAAC;AAC/D,aAAO,MAAM;AAAA,IACjB;AACA,QAAI,SAAS,YAAY,QAAQ;AACjC,WAAO,MAAM;AACT,mBAAa,QAAQ,OAAO;AAC5B,UAAI,SAAS,eAAe,QAAQ;AACpC,UAAI,SAAS,SAAS,GAAG,CAAC;AAAA,IAC9B;AAAA,EACJ,GAAG,CAAC,MAAM,OAAO,YAAY,KAAK,UAAU,SAAS,CAAC;AAEtD,WAAS,sBAAsB,GAAgD;AAC3E,QAAI;AAAkB;AACtB,UAAM,UAAU;AAChB,mBAAe,CAAC;AAAA,EACpB;AAEA,WAAS,sBAAsB,GAAgD;AAC3E,QAAI;AAAkB;AACtB,UAAM,UAAU;AAChB,mBAAe,CAAC;AAAA,EACpB;AAEA,SACI,oCAAC,wBAAO,KAAK,KAAK,WAAW,KAAK,cAAc,uBAAuB,cAAc,uBAAwB,GAAG,QAC5G;AAAA,IAAC;AAAA;AAAA,MACG,eAAW;AAAA,QACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQA;AAAA,MACJ;AAAA,MACA,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,eAAe;AAAA;AAAA,IAC/C;AAAA,EACL,CACJ;AAER,CAAC;",
4
+ "sourcesContent": ["\"use client\"\r\nimport { css } from \"@emotion/css\"\r\nimport { useSize } from \"ahooks\"\r\nimport { clsx, getArray } from \"deepsea-tools\"\r\nimport { CSSProperties, forwardRef, MouseEvent as ReactMouseEvent, useEffect, useImperativeHandle, useRef } from \"react\"\r\nimport Scrollbar from \"smooth-scrollbar\"\r\nimport { ScrollStatus } from \"smooth-scrollbar/interfaces/scrollbar\"\r\nimport { Scroll, ScrollProps } from \"./Scroll\"\r\n\r\nexport interface AutoScrollProps extends ScrollProps {\r\n /** 轮播元素的个数 */\r\n count: number\r\n\r\n /** 轮播元素的高度 */\r\n itemHeight: number\r\n\r\n /**\r\n * 轮播动画的时间,单位毫秒\r\n * @default 1000\r\n */\r\n animation?: number\r\n\r\n /**\r\n * 每个元素的停留时间,单位毫秒\r\n * @default 3000\r\n */\r\n duration?: number\r\n\r\n /**\r\n * 元素之间的间距\r\n * @default 0\r\n */\r\n gap?: number\r\n\r\n /** 容器类名 */\r\n containerClassName?: string\r\n\r\n /** 容器样式 */\r\n containerStyle?: CSSProperties\r\n\r\n /**\r\n * 在鼠标移入时是否继续播放\r\n * @default false\r\n */\r\n playOnMouseEnter?: boolean\r\n\r\n /**\r\n * 是否暂停\r\n * @default false\r\n */\r\n paused?: boolean\r\n}\r\n\r\nexport const AutoScroll = forwardRef<HTMLDivElement, AutoScrollProps>((props, ref) => {\r\n const { count, itemHeight, animation = 1000, duration = 3000, onMouseEnter, onMouseLeave, gap = 0, containerClassName, containerStyle, children, playOnMouseEnter, scrollbar, paused, ...rest } = props\r\n const bar = useRef<Scrollbar | null>(null)\r\n const timeout = useRef<NodeJS.Timeout | undefined>(undefined)\r\n const ele = useRef<HTMLDivElement>(null)\r\n const size = useSize(ele)\r\n const pausedRef = useRef(false)\r\n const pausedProps = useRef(paused)\r\n pausedProps.current = paused\r\n\r\n useImperativeHandle(ref, () => ele.current!, [])\r\n useImperativeHandle(scrollbar, () => bar.current!, [])\r\n\r\n useEffect(() => {\r\n if (playOnMouseEnter) pausedRef.current = false\r\n }, [playOnMouseEnter])\r\n\r\n useEffect(() => {\r\n if (!size || count === 0) return\r\n const { height } = size\r\n const range = getArray(count, index => (itemHeight + gap) * (index + 1) - (index === count - 1 ? gap : 0))\r\n const scrollHeight = range[range.length - 1]\r\n if (height >= scrollHeight) return\r\n function scroll(target: number) {\r\n clearTimeout(timeout.current)\r\n timeout.current = setTimeout(() => {\r\n if (pausedRef.current || pausedProps.current) return scroll(target)\r\n bar.current?.scrollTo(0, target, animation)\r\n }, duration)\r\n }\r\n scroll(range[0])\r\n function listener(status: ScrollStatus) {\r\n const { y } = status.offset\r\n const scrollToBottom = Math.abs(y + height - scrollHeight) / itemHeight <= 0.05\r\n const target = scrollToBottom ? 0 : range.find(item => item > y)!\r\n scroll(target)\r\n }\r\n bar.current?.addListener(listener)\r\n return () => {\r\n clearTimeout(timeout.current)\r\n bar.current?.removeListener(listener)\r\n bar.current?.scrollTo(0, 0)\r\n }\r\n }, [size, count, itemHeight, gap, duration, animation])\r\n\r\n function onContainerMouseEnter(e: ReactMouseEvent<HTMLDivElement, MouseEvent>) {\r\n if (playOnMouseEnter) return\r\n pausedRef.current = true\r\n onMouseEnter?.(e)\r\n }\r\n\r\n function onContainerMouseLeave(e: ReactMouseEvent<HTMLDivElement, MouseEvent>) {\r\n if (playOnMouseEnter) return\r\n pausedRef.current = false\r\n onMouseLeave?.(e)\r\n }\r\n\r\n return (\r\n <Scroll ref={ele} scrollbar={bar} onMouseEnter={onContainerMouseEnter} onMouseLeave={onContainerMouseLeave} {...rest}>\r\n <div\r\n className={clsx(\r\n css`\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--gap, 0);\r\n & > * {\r\n flex: none;\r\n }\r\n `,\r\n containerClassName\r\n )}\r\n style={{ \"--gap\": `${gap}px`, ...containerStyle } as CSSProperties}>\r\n {children}\r\n </div>\r\n </Scroll>\r\n )\r\n})\r\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAAoB;AACpB,oBAAwB;AACxB,2BAA+B;AAC/B,mBAAiH;AAGjH,oBAAoC;AA8C7B,IAAM,iBAAa,yBAA4C,CAAC,OAAO,QAAQ;AAClF,QAAM,EAAE,OAAO,YAAY,YAAY,KAAM,WAAW,KAAM,cAAc,cAAc,MAAM,GAAG,oBAAoB,gBAAgB,UAAU,kBAAkB,WAAW,QAAQ,GAAG,KAAK,IAAI;AAClM,QAAM,UAAM,qBAAyB,IAAI;AACzC,QAAM,cAAU,qBAAmC,MAAS;AAC5D,QAAM,UAAM,qBAAuB,IAAI;AACvC,QAAM,WAAO,uBAAQ,GAAG;AACxB,QAAM,gBAAY,qBAAO,KAAK;AAC9B,QAAM,kBAAc,qBAAO,MAAM;AACjC,cAAY,UAAU;AAEtB,wCAAoB,KAAK,MAAM,IAAI,SAAU,CAAC,CAAC;AAC/C,wCAAoB,WAAW,MAAM,IAAI,SAAU,CAAC,CAAC;AAErD,8BAAU,MAAM;AACZ,QAAI;AAAkB,gBAAU,UAAU;AAAA,EAC9C,GAAG,CAAC,gBAAgB,CAAC;AAErB,8BAAU,MAAM;AACZ,QAAI,CAAC,QAAQ,UAAU;AAAG;AAC1B,UAAM,EAAE,OAAO,IAAI;AACnB,UAAM,YAAQ,+BAAS,OAAO,YAAU,aAAa,QAAQ,QAAQ,MAAM,UAAU,QAAQ,IAAI,MAAM,EAAE;AACzG,UAAM,eAAe,MAAM,MAAM,SAAS,CAAC;AAC3C,QAAI,UAAU;AAAc;AAC5B,aAAS,OAAO,QAAgB;AAC5B,mBAAa,QAAQ,OAAO;AAC5B,cAAQ,UAAU,WAAW,MAAM;AAC/B,YAAI,UAAU,WAAW,YAAY;AAAS,iBAAO,OAAO,MAAM;AAClE,YAAI,SAAS,SAAS,GAAG,QAAQ,SAAS;AAAA,MAC9C,GAAG,QAAQ;AAAA,IACf;AACA,WAAO,MAAM,CAAC,CAAC;AACf,aAAS,SAAS,QAAsB;AACpC,YAAM,EAAE,EAAE,IAAI,OAAO;AACrB,YAAM,iBAAiB,KAAK,IAAI,IAAI,SAAS,YAAY,IAAI,cAAc;AAC3E,YAAM,SAAS,iBAAiB,IAAI,MAAM,KAAK,UAAQ,OAAO,CAAC;AAC/D,aAAO,MAAM;AAAA,IACjB;AACA,QAAI,SAAS,YAAY,QAAQ;AACjC,WAAO,MAAM;AACT,mBAAa,QAAQ,OAAO;AAC5B,UAAI,SAAS,eAAe,QAAQ;AACpC,UAAI,SAAS,SAAS,GAAG,CAAC;AAAA,IAC9B;AAAA,EACJ,GAAG,CAAC,MAAM,OAAO,YAAY,KAAK,UAAU,SAAS,CAAC;AAEtD,WAAS,sBAAsB,GAAgD;AAC3E,QAAI;AAAkB;AACtB,cAAU,UAAU;AACpB,mBAAe,CAAC;AAAA,EACpB;AAEA,WAAS,sBAAsB,GAAgD;AAC3E,QAAI;AAAkB;AACtB,cAAU,UAAU;AACpB,mBAAe,CAAC;AAAA,EACpB;AAEA,SACI,oCAAC,wBAAO,KAAK,KAAK,WAAW,KAAK,cAAc,uBAAuB,cAAc,uBAAwB,GAAG,QAC5G;AAAA,IAAC;AAAA;AAAA,MACG,eAAW;AAAA,QACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQA;AAAA,MACJ;AAAA,MACA,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,eAAe;AAAA;AAAA,IAC/C;AAAA,EACL,CACJ;AAER,CAAC;",
6
6
  "names": []
7
7
  }
@@ -5,7 +5,13 @@ export { default as Scrollbar } from "smooth-scrollbar";
5
5
  export * from "smooth-scrollbar/interfaces";
6
6
  export interface ScrollOptions extends Partial<ScrollbarOptions> {
7
7
  /** 滑块宽度 */
8
- thumbWidth?: number;
8
+ thumbWidth?: number | string;
9
+ /** 滑块圆角大小 */
10
+ thumbRadius?: number | string;
11
+ /** 滑块背景颜色 */
12
+ thumbColor?: string;
13
+ /** 滚动条背景颜色 */
14
+ trackColor?: string;
9
15
  }
10
16
  export interface ScrollProps extends HTMLAttributes<HTMLDivElement> {
11
17
  /** 滚动的配置 */
@@ -43,7 +43,7 @@ var import_smooth_scrollbar2 = __toESM(require("smooth-scrollbar"));
43
43
  __reExport(Scroll_exports, require("smooth-scrollbar/interfaces"), module.exports);
44
44
  var Scroll = (0, import_react.forwardRef)((props, ref) => {
45
45
  const { children, options, className, style, scrollbar, onScrollbar, ...rest } = props;
46
- const { thumbWidth, ...scrollbarOptions } = options || {};
46
+ const { thumbWidth, thumbRadius, thumbColor, trackColor, ...scrollbarOptions } = options || {};
47
47
  const ele = (0, import_react.useRef)(null);
48
48
  const bar = (0, import_react.useRef)(null);
49
49
  (0, import_react.useLayoutEffect)(() => {
@@ -63,27 +63,36 @@ var Scroll = (0, import_react.forwardRef)((props, ref) => {
63
63
  {
64
64
  ref: ele,
65
65
  className: (0, import_deepsea_tools.clsx)(
66
- typeof thumbWidth === "number" && import_css.css`
67
- .scrollbar-track.scrollbar-track-x {
68
- height: var(--thumb-width);
69
- }
66
+ import_css.css`
67
+ .scrollbar-track.scrollbar-track-x {
68
+ ${thumbWidth !== void 0 ? "height: var(--thumb-width);" : ""}
69
+ ${trackColor !== void 0 ? "background-color: var(--track-color);" : ""}
70
+ }
70
71
 
71
- .scrollbar-thumb.scrollbar-thumb-x {
72
- height: var(--thumb-width);
73
- }
72
+ .scrollbar-thumb.scrollbar-thumb-x {
73
+ ${thumbWidth !== void 0 ? "height: var(--thumb-width);" : ""}
74
+ ${thumbRadius !== void 0 ? "border-radius: var(--thumb-radius);" : ""}
75
+ ${thumbColor !== void 0 ? "background-color: var(--thumb-color);" : ""}
76
+ }
74
77
 
75
- .scrollbar-track.scrollbar-track-y {
76
- width: var(--thumb-width);
77
- }
78
+ .scrollbar-track.scrollbar-track-y {
79
+ ${thumbWidth !== void 0 ? "width: var(--thumb-width);" : ""}
80
+ ${trackColor !== void 0 ? "background-color: var(--track-color);" : ""}
81
+ }
78
82
 
79
- .scrollbar-thumb.scrollbar-thumb-y {
80
- width: var(--thumb-width);
81
- }
82
- `,
83
+ .scrollbar-thumb.scrollbar-thumb-y {
84
+ ${thumbWidth !== void 0 ? "width: var(--thumb-width);" : ""}
85
+ ${thumbRadius !== void 0 ? "border-radius: var(--thumb-radius);" : ""}
86
+ ${thumbColor !== void 0 ? "background-color: var(--thumb-color);" : ""}
87
+ }
88
+ `,
83
89
  className
84
90
  ),
85
91
  style: {
86
- "--thumb-width": typeof thumbWidth === "number" ? `${thumbWidth}px` : void 0,
92
+ "--thumb-width": typeof thumbWidth === "number" ? `${thumbWidth}px` : thumbWidth,
93
+ "--thumb-radius": typeof thumbRadius === "number" ? `${thumbRadius}px` : thumbRadius,
94
+ "--thumb-color": thumbColor,
95
+ "--track-color": trackColor,
87
96
  ...style
88
97
  },
89
98
  ...rest
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/Scroll.tsx"],
4
- "sourcesContent": ["\"use client\"\r\nimport { css } from \"@emotion/css\"\r\nimport { clsx } from \"deepsea-tools\"\r\nimport { CSSProperties, ForwardedRef, forwardRef, HTMLAttributes, useEffect, useImperativeHandle, useLayoutEffect, useRef } from \"react\"\r\nimport Scrollbar from \"smooth-scrollbar\"\r\nimport type { ScrollbarOptions, ScrollListener } from \"smooth-scrollbar/interfaces\"\r\nexport { default as Scrollbar } from \"smooth-scrollbar\"\r\nexport * from \"smooth-scrollbar/interfaces\"\r\n\r\nexport interface ScrollOptions extends Partial<ScrollbarOptions> {\r\n /** 滑块宽度 */\r\n thumbWidth?: number\r\n}\r\n\r\nexport interface ScrollProps extends HTMLAttributes<HTMLDivElement> {\r\n /** 滚动的配置 */\r\n options?: ScrollOptions\r\n /** 滚动条实例 */\r\n scrollbar?: ForwardedRef<Scrollbar>\r\n /** 滚动条滚动事件 */\r\n onScrollbar?: ScrollListener\r\n}\r\n\r\nexport const Scroll = forwardRef<HTMLDivElement, ScrollProps>((props, ref) => {\r\n const { children, options, className, style, scrollbar, onScrollbar, ...rest } = props\r\n const { thumbWidth, ...scrollbarOptions } = options || {}\r\n const ele = useRef<HTMLDivElement>(null)\r\n const bar = useRef<Scrollbar | null>(null)\r\n\r\n useLayoutEffect(() => {\r\n bar.current = Scrollbar.init(ele.current!, scrollbarOptions)\r\n return () => bar.current?.destroy()\r\n }, [])\r\n\r\n useImperativeHandle(ref, () => ele.current!, [])\r\n\r\n useImperativeHandle(scrollbar, () => bar.current!, [])\r\n\r\n useEffect(() => {\r\n if (!onScrollbar) return\r\n bar.current?.addListener(onScrollbar)\r\n return () => bar.current?.removeListener(onScrollbar)\r\n }, [onScrollbar])\r\n\r\n return (\r\n <div\r\n ref={ele}\r\n className={clsx(\r\n typeof thumbWidth === \"number\" &&\r\n css`\r\n .scrollbar-track.scrollbar-track-x {\r\n height: var(--thumb-width);\r\n }\r\n\r\n .scrollbar-thumb.scrollbar-thumb-x {\r\n height: var(--thumb-width);\r\n }\r\n\r\n .scrollbar-track.scrollbar-track-y {\r\n width: var(--thumb-width);\r\n }\r\n\r\n .scrollbar-thumb.scrollbar-thumb-y {\r\n width: var(--thumb-width);\r\n }\r\n `,\r\n className\r\n )}\r\n style={\r\n {\r\n \"--thumb-width\": typeof thumbWidth === \"number\" ? `${thumbWidth}px` : undefined,\r\n ...style\r\n } as CSSProperties\r\n }\r\n {...rest}>\r\n {children}\r\n </div>\r\n )\r\n})\r\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAAoB;AACpB,2BAAqB;AACrB,mBAAiI;AACjI,8BAAsB;AAEtB,IAAAA,2BAAqC;AACrC,2BAAc,wCAPd;AAuBO,IAAM,aAAS,yBAAwC,CAAC,OAAO,QAAQ;AAC1E,QAAM,EAAE,UAAU,SAAS,WAAW,OAAO,WAAW,aAAa,GAAG,KAAK,IAAI;AACjF,QAAM,EAAE,YAAY,GAAG,iBAAiB,IAAI,WAAW,CAAC;AACxD,QAAM,UAAM,qBAAuB,IAAI;AACvC,QAAM,UAAM,qBAAyB,IAAI;AAEzC,oCAAgB,MAAM;AAClB,QAAI,UAAU,wBAAAC,QAAU,KAAK,IAAI,SAAU,gBAAgB;AAC3D,WAAO,MAAM,IAAI,SAAS,QAAQ;AAAA,EACtC,GAAG,CAAC,CAAC;AAEL,wCAAoB,KAAK,MAAM,IAAI,SAAU,CAAC,CAAC;AAE/C,wCAAoB,WAAW,MAAM,IAAI,SAAU,CAAC,CAAC;AAErD,8BAAU,MAAM;AACZ,QAAI,CAAC;AAAa;AAClB,QAAI,SAAS,YAAY,WAAW;AACpC,WAAO,MAAM,IAAI,SAAS,eAAe,WAAW;AAAA,EACxD,GAAG,CAAC,WAAW,CAAC;AAEhB,SACI;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,eAAW;AAAA,QACP,OAAO,eAAe,YAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAiBJ;AAAA,MACJ;AAAA,MACA,OACI;AAAA,QACI,iBAAiB,OAAO,eAAe,WAAW,GAAG,iBAAiB;AAAA,QACtE,GAAG;AAAA,MACP;AAAA,MAEH,GAAG;AAAA;AAAA,IACH;AAAA,EACL;AAER,CAAC;",
4
+ "sourcesContent": ["\"use client\"\r\nimport { css } from \"@emotion/css\"\r\nimport { clsx } from \"deepsea-tools\"\r\nimport { CSSProperties, ForwardedRef, forwardRef, HTMLAttributes, useEffect, useImperativeHandle, useLayoutEffect, useRef } from \"react\"\r\nimport Scrollbar from \"smooth-scrollbar\"\r\nimport type { ScrollbarOptions, ScrollListener } from \"smooth-scrollbar/interfaces\"\r\nexport { default as Scrollbar } from \"smooth-scrollbar\"\r\nexport * from \"smooth-scrollbar/interfaces\"\r\n\r\nexport interface ScrollOptions extends Partial<ScrollbarOptions> {\r\n /** 滑块宽度 */\r\n thumbWidth?: number | string\r\n /** 滑块圆角大小 */\r\n thumbRadius?: number | string\r\n /** 滑块背景颜色 */\r\n thumbColor?: string\r\n /** 滚动条背景颜色 */\r\n trackColor?: string\r\n}\r\n\r\nexport interface ScrollProps extends HTMLAttributes<HTMLDivElement> {\r\n /** 滚动的配置 */\r\n options?: ScrollOptions\r\n /** 滚动条实例 */\r\n scrollbar?: ForwardedRef<Scrollbar>\r\n /** 滚动条滚动事件 */\r\n onScrollbar?: ScrollListener\r\n}\r\n\r\nexport const Scroll = forwardRef<HTMLDivElement, ScrollProps>((props, ref) => {\r\n const { children, options, className, style, scrollbar, onScrollbar, ...rest } = props\r\n const { thumbWidth, thumbRadius, thumbColor, trackColor, ...scrollbarOptions } = options || {}\r\n const ele = useRef<HTMLDivElement>(null)\r\n const bar = useRef<Scrollbar | null>(null)\r\n\r\n useLayoutEffect(() => {\r\n bar.current = Scrollbar.init(ele.current!, scrollbarOptions)\r\n return () => bar.current?.destroy()\r\n }, [])\r\n\r\n useImperativeHandle(ref, () => ele.current!, [])\r\n\r\n useImperativeHandle(scrollbar, () => bar.current!, [])\r\n\r\n useEffect(() => {\r\n if (!onScrollbar) return\r\n bar.current?.addListener(onScrollbar)\r\n return () => bar.current?.removeListener(onScrollbar)\r\n }, [onScrollbar])\r\n\r\n return (\r\n <div\r\n ref={ele}\r\n className={clsx(\r\n css`\r\n .scrollbar-track.scrollbar-track-x {\r\n ${thumbWidth !== undefined ? \"height: var(--thumb-width);\" : \"\"}\r\n ${trackColor !== undefined ? \"background-color: var(--track-color);\" : \"\"}\r\n }\r\n\r\n .scrollbar-thumb.scrollbar-thumb-x {\r\n ${thumbWidth !== undefined ? \"height: var(--thumb-width);\" : \"\"}\r\n ${thumbRadius !== undefined ? \"border-radius: var(--thumb-radius);\" : \"\"}\r\n ${thumbColor !== undefined ? \"background-color: var(--thumb-color);\" : \"\"}\r\n }\r\n\r\n .scrollbar-track.scrollbar-track-y {\r\n ${thumbWidth !== undefined ? \"width: var(--thumb-width);\" : \"\"}\r\n ${trackColor !== undefined ? \"background-color: var(--track-color);\" : \"\"}\r\n }\r\n\r\n .scrollbar-thumb.scrollbar-thumb-y {\r\n ${thumbWidth !== undefined ? \"width: var(--thumb-width);\" : \"\"}\r\n ${thumbRadius !== undefined ? \"border-radius: var(--thumb-radius);\" : \"\"}\r\n ${thumbColor !== undefined ? \"background-color: var(--thumb-color);\" : \"\"}\r\n }\r\n `,\r\n className\r\n )}\r\n style={\r\n {\r\n \"--thumb-width\": typeof thumbWidth === \"number\" ? `${thumbWidth}px` : thumbWidth,\r\n \"--thumb-radius\": typeof thumbRadius === \"number\" ? `${thumbRadius}px` : thumbRadius,\r\n \"--thumb-color\": thumbColor,\r\n \"--track-color\": trackColor,\r\n ...style\r\n } as CSSProperties\r\n }\r\n {...rest}>\r\n {children}\r\n </div>\r\n )\r\n})\r\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAAoB;AACpB,2BAAqB;AACrB,mBAAiI;AACjI,8BAAsB;AAEtB,IAAAA,2BAAqC;AACrC,2BAAc,wCAPd;AA6BO,IAAM,aAAS,yBAAwC,CAAC,OAAO,QAAQ;AAC1E,QAAM,EAAE,UAAU,SAAS,WAAW,OAAO,WAAW,aAAa,GAAG,KAAK,IAAI;AACjF,QAAM,EAAE,YAAY,aAAa,YAAY,YAAY,GAAG,iBAAiB,IAAI,WAAW,CAAC;AAC7F,QAAM,UAAM,qBAAuB,IAAI;AACvC,QAAM,UAAM,qBAAyB,IAAI;AAEzC,oCAAgB,MAAM;AAClB,QAAI,UAAU,wBAAAC,QAAU,KAAK,IAAI,SAAU,gBAAgB;AAC3D,WAAO,MAAM,IAAI,SAAS,QAAQ;AAAA,EACtC,GAAG,CAAC,CAAC;AAEL,wCAAoB,KAAK,MAAM,IAAI,SAAU,CAAC,CAAC;AAE/C,wCAAoB,WAAW,MAAM,IAAI,SAAU,CAAC,CAAC;AAErD,8BAAU,MAAM;AACZ,QAAI,CAAC;AAAa;AAClB,QAAI,SAAS,YAAY,WAAW;AACpC,WAAO,MAAM,IAAI,SAAS,eAAe,WAAW;AAAA,EACxD,GAAG,CAAC,WAAW,CAAC;AAEhB,SACI;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,eAAW;AAAA,QACP;AAAA;AAAA,0BAEU,eAAe,SAAY,gCAAgC;AAAA,0BAC3D,eAAe,SAAY,0CAA0C;AAAA;AAAA;AAAA;AAAA,0BAIrE,eAAe,SAAY,gCAAgC;AAAA,0BAC3D,gBAAgB,SAAY,wCAAwC;AAAA,0BACpE,eAAe,SAAY,0CAA0C;AAAA;AAAA;AAAA;AAAA,0BAIrE,eAAe,SAAY,+BAA+B;AAAA,0BAC1D,eAAe,SAAY,0CAA0C;AAAA;AAAA;AAAA;AAAA,0BAIrE,eAAe,SAAY,+BAA+B;AAAA,0BAC1D,gBAAgB,SAAY,wCAAwC;AAAA,0BACpE,eAAe,SAAY,0CAA0C;AAAA;AAAA;AAAA,QAG/E;AAAA,MACJ;AAAA,MACA,OACI;AAAA,QACI,iBAAiB,OAAO,eAAe,WAAW,GAAG,iBAAiB;AAAA,QACtE,kBAAkB,OAAO,gBAAgB,WAAW,GAAG,kBAAkB;AAAA,QACzE,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,QACjB,GAAG;AAAA,MACP;AAAA,MAEH,GAAG;AAAA;AAAA,IACH;AAAA,EACL;AAER,CAAC;",
6
6
  "names": ["import_smooth_scrollbar", "Scrollbar"]
7
7
  }
@@ -1,21 +1,38 @@
1
1
  import { CSSProperties } from "react";
2
2
  import { ScrollProps } from "./Scroll";
3
3
  export interface AutoScrollProps extends ScrollProps {
4
- /** 轮播的数据 */
4
+ /** 轮播元素的个数 */
5
5
  count: number;
6
6
  /** 轮播元素的高度 */
7
7
  itemHeight: number;
8
- /** 轮播动画的时间 */
9
- animation: number;
10
- /** 每个元素的停留时间 */
11
- duration: number;
12
- /** 元素之间的间距 */
8
+ /**
9
+ * 轮播动画的时间,单位毫秒
10
+ * @default 1000
11
+ */
12
+ animation?: number;
13
+ /**
14
+ * 每个元素的停留时间,单位毫秒
15
+ * @default 3000
16
+ */
17
+ duration?: number;
18
+ /**
19
+ * 元素之间的间距
20
+ * @default 0
21
+ */
13
22
  gap?: number;
14
23
  /** 容器类名 */
15
24
  containerClassName?: string;
16
25
  /** 容器样式 */
17
26
  containerStyle?: CSSProperties;
18
- /** 在鼠标移入时是否继续播放 */
27
+ /**
28
+ * 在鼠标移入时是否继续播放
29
+ * @default false
30
+ */
19
31
  playOnMouseEnter?: boolean;
32
+ /**
33
+ * 是否暂停
34
+ * @default false
35
+ */
36
+ paused?: boolean;
20
37
  }
21
38
  export declare const AutoScroll: import("react").ForwardRefExoticComponent<AutoScrollProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -10,8 +10,8 @@ export const AutoScroll = /*#__PURE__*/forwardRef((props, ref) => {
10
10
  const {
11
11
  count,
12
12
  itemHeight,
13
- animation,
14
- duration,
13
+ animation = 1000,
14
+ duration = 3000,
15
15
  onMouseEnter,
16
16
  onMouseLeave,
17
17
  gap = 0,
@@ -20,17 +20,20 @@ export const AutoScroll = /*#__PURE__*/forwardRef((props, ref) => {
20
20
  children,
21
21
  playOnMouseEnter,
22
22
  scrollbar,
23
+ paused,
23
24
  ...rest
24
25
  } = props;
25
26
  const bar = useRef(null);
26
27
  const timeout = useRef(undefined);
27
28
  const ele = useRef(null);
28
29
  const size = useSize(ele);
29
- const pause = useRef(false);
30
+ const pausedRef = useRef(false);
31
+ const pausedProps = useRef(paused);
32
+ pausedProps.current = paused;
30
33
  useImperativeHandle(ref, () => ele.current, []);
31
34
  useImperativeHandle(scrollbar, () => bar.current, []);
32
35
  useEffect(() => {
33
- if (playOnMouseEnter) pause.current = false;
36
+ if (playOnMouseEnter) pausedRef.current = false;
34
37
  }, [playOnMouseEnter]);
35
38
  useEffect(() => {
36
39
  if (!size || count === 0) return;
@@ -43,7 +46,7 @@ export const AutoScroll = /*#__PURE__*/forwardRef((props, ref) => {
43
46
  function scroll(target) {
44
47
  clearTimeout(timeout.current);
45
48
  timeout.current = setTimeout(() => {
46
- if (pause.current) return scroll(target);
49
+ if (pausedRef.current || pausedProps.current) return scroll(target);
47
50
  bar.current?.scrollTo(0, target, animation);
48
51
  }, duration);
49
52
  }
@@ -65,12 +68,12 @@ export const AutoScroll = /*#__PURE__*/forwardRef((props, ref) => {
65
68
  }, [size, count, itemHeight, gap, duration, animation]);
66
69
  function onContainerMouseEnter(e) {
67
70
  if (playOnMouseEnter) return;
68
- pause.current = true;
71
+ pausedRef.current = true;
69
72
  onMouseEnter?.(e);
70
73
  }
71
74
  function onContainerMouseLeave(e) {
72
75
  if (playOnMouseEnter) return;
73
- pause.current = false;
76
+ pausedRef.current = false;
74
77
  onMouseLeave?.(e);
75
78
  }
76
79
  return /*#__PURE__*/_jsx(Scroll, {
@@ -1 +1 @@
1
- {"version":3,"names":["css","useSize","clsx","getArray","forwardRef","useEffect","useImperativeHandle","useRef","Scroll","jsx","_jsx","AutoScroll","props","ref","count","itemHeight","animation","duration","onMouseEnter","onMouseLeave","gap","containerClassName","containerStyle","children","playOnMouseEnter","scrollbar","rest","bar","timeout","undefined","ele","size","pause","current","height","range","index","scrollHeight","length","scroll","target","clearTimeout","setTimeout","scrollTo","listener","status","y","offset","scrollToBottom","Math","abs","find","item","addListener","removeListener","onContainerMouseEnter","e","onContainerMouseLeave","className","style"],"sources":["../../../src/components/AutoScroll.tsx"],"sourcesContent":["\"use client\"\r\nimport { css } from \"@emotion/css\"\r\nimport { useSize } from \"ahooks\"\r\nimport { clsx, getArray } from \"deepsea-tools\"\r\nimport { CSSProperties, forwardRef, MouseEvent as ReactMouseEvent, useEffect, useImperativeHandle, useRef } from \"react\"\r\nimport Scrollbar from \"smooth-scrollbar\"\r\nimport { ScrollStatus } from \"smooth-scrollbar/interfaces/scrollbar\"\r\nimport { Scroll, ScrollProps } from \"./Scroll\"\r\n\r\nexport interface AutoScrollProps extends ScrollProps {\r\n /** 轮播的数据 */\r\n count: number\r\n\r\n /** 轮播元素的高度 */\r\n itemHeight: number\r\n\r\n /** 轮播动画的时间 */\r\n animation: number\r\n\r\n /** 每个元素的停留时间 */\r\n duration: number\r\n\r\n /** 元素之间的间距 */\r\n gap?: number\r\n\r\n /** 容器类名 */\r\n containerClassName?: string\r\n\r\n /** 容器样式 */\r\n containerStyle?: CSSProperties\r\n\r\n /** 在鼠标移入时是否继续播放 */\r\n playOnMouseEnter?: boolean\r\n}\r\n\r\nexport const AutoScroll = forwardRef<HTMLDivElement, AutoScrollProps>((props, ref) => {\r\n const { count, itemHeight, animation, duration, onMouseEnter, onMouseLeave, gap = 0, containerClassName, containerStyle, children, playOnMouseEnter, scrollbar, ...rest } = props\r\n const bar = useRef<Scrollbar | null>(null)\r\n const timeout = useRef<NodeJS.Timeout | undefined>(undefined)\r\n const ele = useRef<HTMLDivElement>(null)\r\n const size = useSize(ele)\r\n const pause = useRef(false)\r\n\r\n useImperativeHandle(ref, () => ele.current!, [])\r\n useImperativeHandle(scrollbar, () => bar.current!, [])\r\n\r\n useEffect(() => {\r\n if (playOnMouseEnter) pause.current = false\r\n }, [playOnMouseEnter])\r\n\r\n useEffect(() => {\r\n if (!size || count === 0) return\r\n const { height } = size\r\n const range = getArray(count, index => (itemHeight + gap) * (index + 1) - (index === count - 1 ? gap : 0))\r\n const scrollHeight = range[range.length - 1]\r\n if (height >= scrollHeight) return\r\n function scroll(target: number) {\r\n clearTimeout(timeout.current)\r\n timeout.current = setTimeout(() => {\r\n if (pause.current) return scroll(target)\r\n bar.current?.scrollTo(0, target, animation)\r\n }, duration)\r\n }\r\n scroll(range[0])\r\n function listener(status: ScrollStatus) {\r\n const { y } = status.offset\r\n const scrollToBottom = Math.abs(y + height - scrollHeight) / itemHeight <= 0.05\r\n const target = scrollToBottom ? 0 : range.find(item => item > y)!\r\n scroll(target)\r\n }\r\n bar.current?.addListener(listener)\r\n return () => {\r\n clearTimeout(timeout.current)\r\n bar.current?.removeListener(listener)\r\n bar.current?.scrollTo(0, 0)\r\n }\r\n }, [size, count, itemHeight, gap, duration, animation])\r\n\r\n function onContainerMouseEnter(e: ReactMouseEvent<HTMLDivElement, MouseEvent>) {\r\n if (playOnMouseEnter) return\r\n pause.current = true\r\n onMouseEnter?.(e)\r\n }\r\n\r\n function onContainerMouseLeave(e: ReactMouseEvent<HTMLDivElement, MouseEvent>) {\r\n if (playOnMouseEnter) return\r\n pause.current = false\r\n onMouseLeave?.(e)\r\n }\r\n\r\n return (\r\n <Scroll ref={ele} scrollbar={bar} onMouseEnter={onContainerMouseEnter} onMouseLeave={onContainerMouseLeave} {...rest}>\r\n <div\r\n className={clsx(\r\n css`\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--gap, 0);\r\n & > * {\r\n flex: none;\r\n }\r\n `,\r\n containerClassName\r\n )}\r\n style={{ \"--gap\": `${gap}px`, ...containerStyle } as CSSProperties}>\r\n {children}\r\n </div>\r\n </Scroll>\r\n )\r\n})\r\n"],"mappings":"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"}
1
+ {"version":3,"names":["css","useSize","clsx","getArray","forwardRef","useEffect","useImperativeHandle","useRef","Scroll","jsx","_jsx","AutoScroll","props","ref","count","itemHeight","animation","duration","onMouseEnter","onMouseLeave","gap","containerClassName","containerStyle","children","playOnMouseEnter","scrollbar","paused","rest","bar","timeout","undefined","ele","size","pausedRef","pausedProps","current","height","range","index","scrollHeight","length","scroll","target","clearTimeout","setTimeout","scrollTo","listener","status","y","offset","scrollToBottom","Math","abs","find","item","addListener","removeListener","onContainerMouseEnter","e","onContainerMouseLeave","className","style"],"sources":["../../../src/components/AutoScroll.tsx"],"sourcesContent":["\"use client\"\r\nimport { css } from \"@emotion/css\"\r\nimport { useSize } from \"ahooks\"\r\nimport { clsx, getArray } from \"deepsea-tools\"\r\nimport { CSSProperties, forwardRef, MouseEvent as ReactMouseEvent, useEffect, useImperativeHandle, useRef } from \"react\"\r\nimport Scrollbar from \"smooth-scrollbar\"\r\nimport { ScrollStatus } from \"smooth-scrollbar/interfaces/scrollbar\"\r\nimport { Scroll, ScrollProps } from \"./Scroll\"\r\n\r\nexport interface AutoScrollProps extends ScrollProps {\r\n /** 轮播元素的个数 */\r\n count: number\r\n\r\n /** 轮播元素的高度 */\r\n itemHeight: number\r\n\r\n /**\r\n * 轮播动画的时间,单位毫秒\r\n * @default 1000\r\n */\r\n animation?: number\r\n\r\n /**\r\n * 每个元素的停留时间,单位毫秒\r\n * @default 3000\r\n */\r\n duration?: number\r\n\r\n /**\r\n * 元素之间的间距\r\n * @default 0\r\n */\r\n gap?: number\r\n\r\n /** 容器类名 */\r\n containerClassName?: string\r\n\r\n /** 容器样式 */\r\n containerStyle?: CSSProperties\r\n\r\n /**\r\n * 在鼠标移入时是否继续播放\r\n * @default false\r\n */\r\n playOnMouseEnter?: boolean\r\n\r\n /**\r\n * 是否暂停\r\n * @default false\r\n */\r\n paused?: boolean\r\n}\r\n\r\nexport const AutoScroll = forwardRef<HTMLDivElement, AutoScrollProps>((props, ref) => {\r\n const { count, itemHeight, animation = 1000, duration = 3000, onMouseEnter, onMouseLeave, gap = 0, containerClassName, containerStyle, children, playOnMouseEnter, scrollbar, paused, ...rest } = props\r\n const bar = useRef<Scrollbar | null>(null)\r\n const timeout = useRef<NodeJS.Timeout | undefined>(undefined)\r\n const ele = useRef<HTMLDivElement>(null)\r\n const size = useSize(ele)\r\n const pausedRef = useRef(false)\r\n const pausedProps = useRef(paused)\r\n pausedProps.current = paused\r\n\r\n useImperativeHandle(ref, () => ele.current!, [])\r\n useImperativeHandle(scrollbar, () => bar.current!, [])\r\n\r\n useEffect(() => {\r\n if (playOnMouseEnter) pausedRef.current = false\r\n }, [playOnMouseEnter])\r\n\r\n useEffect(() => {\r\n if (!size || count === 0) return\r\n const { height } = size\r\n const range = getArray(count, index => (itemHeight + gap) * (index + 1) - (index === count - 1 ? gap : 0))\r\n const scrollHeight = range[range.length - 1]\r\n if (height >= scrollHeight) return\r\n function scroll(target: number) {\r\n clearTimeout(timeout.current)\r\n timeout.current = setTimeout(() => {\r\n if (pausedRef.current || pausedProps.current) return scroll(target)\r\n bar.current?.scrollTo(0, target, animation)\r\n }, duration)\r\n }\r\n scroll(range[0])\r\n function listener(status: ScrollStatus) {\r\n const { y } = status.offset\r\n const scrollToBottom = Math.abs(y + height - scrollHeight) / itemHeight <= 0.05\r\n const target = scrollToBottom ? 0 : range.find(item => item > y)!\r\n scroll(target)\r\n }\r\n bar.current?.addListener(listener)\r\n return () => {\r\n clearTimeout(timeout.current)\r\n bar.current?.removeListener(listener)\r\n bar.current?.scrollTo(0, 0)\r\n }\r\n }, [size, count, itemHeight, gap, duration, animation])\r\n\r\n function onContainerMouseEnter(e: ReactMouseEvent<HTMLDivElement, MouseEvent>) {\r\n if (playOnMouseEnter) return\r\n pausedRef.current = true\r\n onMouseEnter?.(e)\r\n }\r\n\r\n function onContainerMouseLeave(e: ReactMouseEvent<HTMLDivElement, MouseEvent>) {\r\n if (playOnMouseEnter) return\r\n pausedRef.current = false\r\n onMouseLeave?.(e)\r\n }\r\n\r\n return (\r\n <Scroll ref={ele} scrollbar={bar} onMouseEnter={onContainerMouseEnter} onMouseLeave={onContainerMouseLeave} {...rest}>\r\n <div\r\n className={clsx(\r\n css`\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--gap, 0);\r\n & > * {\r\n flex: none;\r\n }\r\n `,\r\n containerClassName\r\n )}\r\n style={{ \"--gap\": `${gap}px`, ...containerStyle } as CSSProperties}>\r\n {children}\r\n </div>\r\n </Scroll>\r\n )\r\n})\r\n"],"mappings":"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"}
@@ -5,7 +5,13 @@ export { default as Scrollbar } from "smooth-scrollbar";
5
5
  export * from "smooth-scrollbar/interfaces";
6
6
  export interface ScrollOptions extends Partial<ScrollbarOptions> {
7
7
  /** 滑块宽度 */
8
- thumbWidth?: number;
8
+ thumbWidth?: number | string;
9
+ /** 滑块圆角大小 */
10
+ thumbRadius?: number | string;
11
+ /** 滑块背景颜色 */
12
+ thumbColor?: string;
13
+ /** 滚动条背景颜色 */
14
+ trackColor?: string;
9
15
  }
10
16
  export interface ScrollProps extends HTMLAttributes<HTMLDivElement> {
11
17
  /** 滚动的配置 */
@@ -19,6 +19,9 @@ export const Scroll = /*#__PURE__*/forwardRef((props, ref) => {
19
19
  } = props;
20
20
  const {
21
21
  thumbWidth,
22
+ thumbRadius,
23
+ thumbColor,
24
+ trackColor,
22
25
  ...scrollbarOptions
23
26
  } = options || {};
24
27
  const ele = useRef(null);
@@ -36,25 +39,34 @@ export const Scroll = /*#__PURE__*/forwardRef((props, ref) => {
36
39
  }, [onScrollbar]);
37
40
  return /*#__PURE__*/_jsx("div", {
38
41
  ref: ele,
39
- className: clsx(typeof thumbWidth === "number" && css`
40
- .scrollbar-track.scrollbar-track-x {
41
- height: var(--thumb-width);
42
- }
42
+ className: clsx(css`
43
+ .scrollbar-track.scrollbar-track-x {
44
+ ${thumbWidth !== undefined ? "height: var(--thumb-width);" : ""}
45
+ ${trackColor !== undefined ? "background-color: var(--track-color);" : ""}
46
+ }
43
47
 
44
- .scrollbar-thumb.scrollbar-thumb-x {
45
- height: var(--thumb-width);
46
- }
48
+ .scrollbar-thumb.scrollbar-thumb-x {
49
+ ${thumbWidth !== undefined ? "height: var(--thumb-width);" : ""}
50
+ ${thumbRadius !== undefined ? "border-radius: var(--thumb-radius);" : ""}
51
+ ${thumbColor !== undefined ? "background-color: var(--thumb-color);" : ""}
52
+ }
47
53
 
48
- .scrollbar-track.scrollbar-track-y {
49
- width: var(--thumb-width);
50
- }
54
+ .scrollbar-track.scrollbar-track-y {
55
+ ${thumbWidth !== undefined ? "width: var(--thumb-width);" : ""}
56
+ ${trackColor !== undefined ? "background-color: var(--track-color);" : ""}
57
+ }
51
58
 
52
- .scrollbar-thumb.scrollbar-thumb-y {
53
- width: var(--thumb-width);
54
- }
55
- `, className),
59
+ .scrollbar-thumb.scrollbar-thumb-y {
60
+ ${thumbWidth !== undefined ? "width: var(--thumb-width);" : ""}
61
+ ${thumbRadius !== undefined ? "border-radius: var(--thumb-radius);" : ""}
62
+ ${thumbColor !== undefined ? "background-color: var(--thumb-color);" : ""}
63
+ }
64
+ `, className),
56
65
  style: {
57
- "--thumb-width": typeof thumbWidth === "number" ? `${thumbWidth}px` : undefined,
66
+ "--thumb-width": typeof thumbWidth === "number" ? `${thumbWidth}px` : thumbWidth,
67
+ "--thumb-radius": typeof thumbRadius === "number" ? `${thumbRadius}px` : thumbRadius,
68
+ "--thumb-color": thumbColor,
69
+ "--track-color": trackColor,
58
70
  ...style
59
71
  },
60
72
  ...rest,
@@ -1 +1 @@
1
- {"version":3,"names":["css","clsx","forwardRef","useEffect","useImperativeHandle","useLayoutEffect","useRef","Scrollbar","jsx","_jsx","default","Scroll","props","ref","children","options","className","style","scrollbar","onScrollbar","rest","thumbWidth","scrollbarOptions","ele","bar","current","init","destroy","addListener","removeListener","undefined"],"sources":["../../../src/components/Scroll.tsx"],"sourcesContent":["\"use client\"\r\nimport { css } from \"@emotion/css\"\r\nimport { clsx } from \"deepsea-tools\"\r\nimport { CSSProperties, ForwardedRef, forwardRef, HTMLAttributes, useEffect, useImperativeHandle, useLayoutEffect, useRef } from \"react\"\r\nimport Scrollbar from \"smooth-scrollbar\"\r\nimport type { ScrollbarOptions, ScrollListener } from \"smooth-scrollbar/interfaces\"\r\nexport { default as Scrollbar } from \"smooth-scrollbar\"\r\nexport * from \"smooth-scrollbar/interfaces\"\r\n\r\nexport interface ScrollOptions extends Partial<ScrollbarOptions> {\r\n /** 滑块宽度 */\r\n thumbWidth?: number\r\n}\r\n\r\nexport interface ScrollProps extends HTMLAttributes<HTMLDivElement> {\r\n /** 滚动的配置 */\r\n options?: ScrollOptions\r\n /** 滚动条实例 */\r\n scrollbar?: ForwardedRef<Scrollbar>\r\n /** 滚动条滚动事件 */\r\n onScrollbar?: ScrollListener\r\n}\r\n\r\nexport const Scroll = forwardRef<HTMLDivElement, ScrollProps>((props, ref) => {\r\n const { children, options, className, style, scrollbar, onScrollbar, ...rest } = props\r\n const { thumbWidth, ...scrollbarOptions } = options || {}\r\n const ele = useRef<HTMLDivElement>(null)\r\n const bar = useRef<Scrollbar | null>(null)\r\n\r\n useLayoutEffect(() => {\r\n bar.current = Scrollbar.init(ele.current!, scrollbarOptions)\r\n return () => bar.current?.destroy()\r\n }, [])\r\n\r\n useImperativeHandle(ref, () => ele.current!, [])\r\n\r\n useImperativeHandle(scrollbar, () => bar.current!, [])\r\n\r\n useEffect(() => {\r\n if (!onScrollbar) return\r\n bar.current?.addListener(onScrollbar)\r\n return () => bar.current?.removeListener(onScrollbar)\r\n }, [onScrollbar])\r\n\r\n return (\r\n <div\r\n ref={ele}\r\n className={clsx(\r\n typeof thumbWidth === \"number\" &&\r\n css`\r\n .scrollbar-track.scrollbar-track-x {\r\n height: var(--thumb-width);\r\n }\r\n\r\n .scrollbar-thumb.scrollbar-thumb-x {\r\n height: var(--thumb-width);\r\n }\r\n\r\n .scrollbar-track.scrollbar-track-y {\r\n width: var(--thumb-width);\r\n }\r\n\r\n .scrollbar-thumb.scrollbar-thumb-y {\r\n width: var(--thumb-width);\r\n }\r\n `,\r\n className\r\n )}\r\n style={\r\n {\r\n \"--thumb-width\": typeof thumbWidth === \"number\" ? `${thumbWidth}px` : undefined,\r\n ...style\r\n } as CSSProperties\r\n }\r\n {...rest}>\r\n {children}\r\n </div>\r\n )\r\n})\r\n"],"mappings":"AAAA,YAAY;;AACZ,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,IAAI,QAAQ,eAAe;AACpC,SAAsCC,UAAU,EAAkBC,SAAS,EAAEC,mBAAmB,EAAEC,eAAe,EAAEC,MAAM,QAAQ,OAAO;AACxI,OAAOC,SAAS,MAAM,kBAAkB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAExC,SAASC,OAAO,IAAIH,SAAS,QAAQ,kBAAkB;AACvD,cAAc,6BAA6B;AAgB3C,OAAO,MAAMI,MAAM,gBAAGT,UAAU,CAA8B,CAACU,KAAK,EAAEC,GAAG,KAAK;EAC1E,MAAM;IAAEC,QAAQ;IAAEC,OAAO;IAAEC,SAAS;IAAEC,KAAK;IAAEC,SAAS;IAAEC,WAAW;IAAE,GAAGC;EAAK,CAAC,GAAGR,KAAK;EACtF,MAAM;IAAES,UAAU;IAAE,GAAGC;EAAiB,CAAC,GAAGP,OAAO,IAAI,CAAC,CAAC;EACzD,MAAMQ,GAAG,GAAGjB,MAAM,CAAiB,IAAI,CAAC;EACxC,MAAMkB,GAAG,GAAGlB,MAAM,CAAmB,IAAI,CAAC;EAE1CD,eAAe,CAAC,MAAM;IAClBmB,GAAG,CAACC,OAAO,GAAGlB,SAAS,CAACmB,IAAI,CAACH,GAAG,CAACE,OAAO,EAAGH,gBAAgB,CAAC;IAC5D,OAAO,MAAME,GAAG,CAACC,OAAO,EAAEE,OAAO,CAAC,CAAC;EACvC,CAAC,EAAE,EAAE,CAAC;EAENvB,mBAAmB,CAACS,GAAG,EAAE,MAAMU,GAAG,CAACE,OAAQ,EAAE,EAAE,CAAC;EAEhDrB,mBAAmB,CAACc,SAAS,EAAE,MAAMM,GAAG,CAACC,OAAQ,EAAE,EAAE,CAAC;EAEtDtB,SAAS,CAAC,MAAM;IACZ,IAAI,CAACgB,WAAW,EAAE;IAClBK,GAAG,CAACC,OAAO,EAAEG,WAAW,CAACT,WAAW,CAAC;IACrC,OAAO,MAAMK,GAAG,CAACC,OAAO,EAAEI,cAAc,CAACV,WAAW,CAAC;EACzD,CAAC,EAAE,CAACA,WAAW,CAAC,CAAC;EAEjB,oBACIV,IAAA;IACII,GAAG,EAAEU,GAAI;IACTP,SAAS,EAAEf,IAAI,CACX,OAAOoB,UAAU,KAAK,QAAQ,IAC1BrB,GAAI;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,EACLgB,SACJ,CAAE;IACFC,KAAK,EACD;MACI,eAAe,EAAE,OAAOI,UAAU,KAAK,QAAQ,GAAI,GAAEA,UAAW,IAAG,GAAGS,SAAS;MAC/E,GAAGb;IACP,CACH;IAAA,GACGG,IAAI;IAAAN,QAAA,EACPA;EAAQ,CACR,CAAC;AAEd,CAAC,CAAC"}
1
+ {"version":3,"names":["css","clsx","forwardRef","useEffect","useImperativeHandle","useLayoutEffect","useRef","Scrollbar","jsx","_jsx","default","Scroll","props","ref","children","options","className","style","scrollbar","onScrollbar","rest","thumbWidth","thumbRadius","thumbColor","trackColor","scrollbarOptions","ele","bar","current","init","destroy","addListener","removeListener","undefined"],"sources":["../../../src/components/Scroll.tsx"],"sourcesContent":["\"use client\"\r\nimport { css } from \"@emotion/css\"\r\nimport { clsx } from \"deepsea-tools\"\r\nimport { CSSProperties, ForwardedRef, forwardRef, HTMLAttributes, useEffect, useImperativeHandle, useLayoutEffect, useRef } from \"react\"\r\nimport Scrollbar from \"smooth-scrollbar\"\r\nimport type { ScrollbarOptions, ScrollListener } from \"smooth-scrollbar/interfaces\"\r\nexport { default as Scrollbar } from \"smooth-scrollbar\"\r\nexport * from \"smooth-scrollbar/interfaces\"\r\n\r\nexport interface ScrollOptions extends Partial<ScrollbarOptions> {\r\n /** 滑块宽度 */\r\n thumbWidth?: number | string\r\n /** 滑块圆角大小 */\r\n thumbRadius?: number | string\r\n /** 滑块背景颜色 */\r\n thumbColor?: string\r\n /** 滚动条背景颜色 */\r\n trackColor?: string\r\n}\r\n\r\nexport interface ScrollProps extends HTMLAttributes<HTMLDivElement> {\r\n /** 滚动的配置 */\r\n options?: ScrollOptions\r\n /** 滚动条实例 */\r\n scrollbar?: ForwardedRef<Scrollbar>\r\n /** 滚动条滚动事件 */\r\n onScrollbar?: ScrollListener\r\n}\r\n\r\nexport const Scroll = forwardRef<HTMLDivElement, ScrollProps>((props, ref) => {\r\n const { children, options, className, style, scrollbar, onScrollbar, ...rest } = props\r\n const { thumbWidth, thumbRadius, thumbColor, trackColor, ...scrollbarOptions } = options || {}\r\n const ele = useRef<HTMLDivElement>(null)\r\n const bar = useRef<Scrollbar | null>(null)\r\n\r\n useLayoutEffect(() => {\r\n bar.current = Scrollbar.init(ele.current!, scrollbarOptions)\r\n return () => bar.current?.destroy()\r\n }, [])\r\n\r\n useImperativeHandle(ref, () => ele.current!, [])\r\n\r\n useImperativeHandle(scrollbar, () => bar.current!, [])\r\n\r\n useEffect(() => {\r\n if (!onScrollbar) return\r\n bar.current?.addListener(onScrollbar)\r\n return () => bar.current?.removeListener(onScrollbar)\r\n }, [onScrollbar])\r\n\r\n return (\r\n <div\r\n ref={ele}\r\n className={clsx(\r\n css`\r\n .scrollbar-track.scrollbar-track-x {\r\n ${thumbWidth !== undefined ? \"height: var(--thumb-width);\" : \"\"}\r\n ${trackColor !== undefined ? \"background-color: var(--track-color);\" : \"\"}\r\n }\r\n\r\n .scrollbar-thumb.scrollbar-thumb-x {\r\n ${thumbWidth !== undefined ? \"height: var(--thumb-width);\" : \"\"}\r\n ${thumbRadius !== undefined ? \"border-radius: var(--thumb-radius);\" : \"\"}\r\n ${thumbColor !== undefined ? \"background-color: var(--thumb-color);\" : \"\"}\r\n }\r\n\r\n .scrollbar-track.scrollbar-track-y {\r\n ${thumbWidth !== undefined ? \"width: var(--thumb-width);\" : \"\"}\r\n ${trackColor !== undefined ? \"background-color: var(--track-color);\" : \"\"}\r\n }\r\n\r\n .scrollbar-thumb.scrollbar-thumb-y {\r\n ${thumbWidth !== undefined ? \"width: var(--thumb-width);\" : \"\"}\r\n ${thumbRadius !== undefined ? \"border-radius: var(--thumb-radius);\" : \"\"}\r\n ${thumbColor !== undefined ? \"background-color: var(--thumb-color);\" : \"\"}\r\n }\r\n `,\r\n className\r\n )}\r\n style={\r\n {\r\n \"--thumb-width\": typeof thumbWidth === \"number\" ? `${thumbWidth}px` : thumbWidth,\r\n \"--thumb-radius\": typeof thumbRadius === \"number\" ? `${thumbRadius}px` : thumbRadius,\r\n \"--thumb-color\": thumbColor,\r\n \"--track-color\": trackColor,\r\n ...style\r\n } as CSSProperties\r\n }\r\n {...rest}>\r\n {children}\r\n </div>\r\n )\r\n})\r\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepsea-components",
3
- "version": "2.8.2",
3
+ "version": "2.8.5",
4
4
  "description": "格数科技自用组件库",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -8,19 +8,28 @@ import { ScrollStatus } from "smooth-scrollbar/interfaces/scrollbar"
8
8
  import { Scroll, ScrollProps } from "./Scroll"
9
9
 
10
10
  export interface AutoScrollProps extends ScrollProps {
11
- /** 轮播的数据 */
11
+ /** 轮播元素的个数 */
12
12
  count: number
13
13
 
14
14
  /** 轮播元素的高度 */
15
15
  itemHeight: number
16
16
 
17
- /** 轮播动画的时间 */
18
- animation: number
17
+ /**
18
+ * 轮播动画的时间,单位毫秒
19
+ * @default 1000
20
+ */
21
+ animation?: number
19
22
 
20
- /** 每个元素的停留时间 */
21
- duration: number
23
+ /**
24
+ * 每个元素的停留时间,单位毫秒
25
+ * @default 3000
26
+ */
27
+ duration?: number
22
28
 
23
- /** 元素之间的间距 */
29
+ /**
30
+ * 元素之间的间距
31
+ * @default 0
32
+ */
24
33
  gap?: number
25
34
 
26
35
  /** 容器类名 */
@@ -29,23 +38,34 @@ export interface AutoScrollProps extends ScrollProps {
29
38
  /** 容器样式 */
30
39
  containerStyle?: CSSProperties
31
40
 
32
- /** 在鼠标移入时是否继续播放 */
41
+ /**
42
+ * 在鼠标移入时是否继续播放
43
+ * @default false
44
+ */
33
45
  playOnMouseEnter?: boolean
46
+
47
+ /**
48
+ * 是否暂停
49
+ * @default false
50
+ */
51
+ paused?: boolean
34
52
  }
35
53
 
36
54
  export const AutoScroll = forwardRef<HTMLDivElement, AutoScrollProps>((props, ref) => {
37
- const { count, itemHeight, animation, duration, onMouseEnter, onMouseLeave, gap = 0, containerClassName, containerStyle, children, playOnMouseEnter, scrollbar, ...rest } = props
55
+ const { count, itemHeight, animation = 1000, duration = 3000, onMouseEnter, onMouseLeave, gap = 0, containerClassName, containerStyle, children, playOnMouseEnter, scrollbar, paused, ...rest } = props
38
56
  const bar = useRef<Scrollbar | null>(null)
39
57
  const timeout = useRef<NodeJS.Timeout | undefined>(undefined)
40
58
  const ele = useRef<HTMLDivElement>(null)
41
59
  const size = useSize(ele)
42
- const pause = useRef(false)
60
+ const pausedRef = useRef(false)
61
+ const pausedProps = useRef(paused)
62
+ pausedProps.current = paused
43
63
 
44
64
  useImperativeHandle(ref, () => ele.current!, [])
45
65
  useImperativeHandle(scrollbar, () => bar.current!, [])
46
66
 
47
67
  useEffect(() => {
48
- if (playOnMouseEnter) pause.current = false
68
+ if (playOnMouseEnter) pausedRef.current = false
49
69
  }, [playOnMouseEnter])
50
70
 
51
71
  useEffect(() => {
@@ -57,7 +77,7 @@ export const AutoScroll = forwardRef<HTMLDivElement, AutoScrollProps>((props, re
57
77
  function scroll(target: number) {
58
78
  clearTimeout(timeout.current)
59
79
  timeout.current = setTimeout(() => {
60
- if (pause.current) return scroll(target)
80
+ if (pausedRef.current || pausedProps.current) return scroll(target)
61
81
  bar.current?.scrollTo(0, target, animation)
62
82
  }, duration)
63
83
  }
@@ -78,13 +98,13 @@ export const AutoScroll = forwardRef<HTMLDivElement, AutoScrollProps>((props, re
78
98
 
79
99
  function onContainerMouseEnter(e: ReactMouseEvent<HTMLDivElement, MouseEvent>) {
80
100
  if (playOnMouseEnter) return
81
- pause.current = true
101
+ pausedRef.current = true
82
102
  onMouseEnter?.(e)
83
103
  }
84
104
 
85
105
  function onContainerMouseLeave(e: ReactMouseEvent<HTMLDivElement, MouseEvent>) {
86
106
  if (playOnMouseEnter) return
87
- pause.current = false
107
+ pausedRef.current = false
88
108
  onMouseLeave?.(e)
89
109
  }
90
110
 
@@ -9,7 +9,13 @@ export * from "smooth-scrollbar/interfaces"
9
9
 
10
10
  export interface ScrollOptions extends Partial<ScrollbarOptions> {
11
11
  /** 滑块宽度 */
12
- thumbWidth?: number
12
+ thumbWidth?: number | string
13
+ /** 滑块圆角大小 */
14
+ thumbRadius?: number | string
15
+ /** 滑块背景颜色 */
16
+ thumbColor?: string
17
+ /** 滚动条背景颜色 */
18
+ trackColor?: string
13
19
  }
14
20
 
15
21
  export interface ScrollProps extends HTMLAttributes<HTMLDivElement> {
@@ -23,7 +29,7 @@ export interface ScrollProps extends HTMLAttributes<HTMLDivElement> {
23
29
 
24
30
  export const Scroll = forwardRef<HTMLDivElement, ScrollProps>((props, ref) => {
25
31
  const { children, options, className, style, scrollbar, onScrollbar, ...rest } = props
26
- const { thumbWidth, ...scrollbarOptions } = options || {}
32
+ const { thumbWidth, thumbRadius, thumbColor, trackColor, ...scrollbarOptions } = options || {}
27
33
  const ele = useRef<HTMLDivElement>(null)
28
34
  const bar = useRef<Scrollbar | null>(null)
29
35
 
@@ -46,29 +52,37 @@ export const Scroll = forwardRef<HTMLDivElement, ScrollProps>((props, ref) => {
46
52
  <div
47
53
  ref={ele}
48
54
  className={clsx(
49
- typeof thumbWidth === "number" &&
50
- css`
51
- .scrollbar-track.scrollbar-track-x {
52
- height: var(--thumb-width);
53
- }
55
+ css`
56
+ .scrollbar-track.scrollbar-track-x {
57
+ ${thumbWidth !== undefined ? "height: var(--thumb-width);" : ""}
58
+ ${trackColor !== undefined ? "background-color: var(--track-color);" : ""}
59
+ }
54
60
 
55
- .scrollbar-thumb.scrollbar-thumb-x {
56
- height: var(--thumb-width);
57
- }
61
+ .scrollbar-thumb.scrollbar-thumb-x {
62
+ ${thumbWidth !== undefined ? "height: var(--thumb-width);" : ""}
63
+ ${thumbRadius !== undefined ? "border-radius: var(--thumb-radius);" : ""}
64
+ ${thumbColor !== undefined ? "background-color: var(--thumb-color);" : ""}
65
+ }
58
66
 
59
- .scrollbar-track.scrollbar-track-y {
60
- width: var(--thumb-width);
61
- }
67
+ .scrollbar-track.scrollbar-track-y {
68
+ ${thumbWidth !== undefined ? "width: var(--thumb-width);" : ""}
69
+ ${trackColor !== undefined ? "background-color: var(--track-color);" : ""}
70
+ }
62
71
 
63
- .scrollbar-thumb.scrollbar-thumb-y {
64
- width: var(--thumb-width);
65
- }
66
- `,
72
+ .scrollbar-thumb.scrollbar-thumb-y {
73
+ ${thumbWidth !== undefined ? "width: var(--thumb-width);" : ""}
74
+ ${thumbRadius !== undefined ? "border-radius: var(--thumb-radius);" : ""}
75
+ ${thumbColor !== undefined ? "background-color: var(--thumb-color);" : ""}
76
+ }
77
+ `,
67
78
  className
68
79
  )}
69
80
  style={
70
81
  {
71
- "--thumb-width": typeof thumbWidth === "number" ? `${thumbWidth}px` : undefined,
82
+ "--thumb-width": typeof thumbWidth === "number" ? `${thumbWidth}px` : thumbWidth,
83
+ "--thumb-radius": typeof thumbRadius === "number" ? `${thumbRadius}px` : thumbRadius,
84
+ "--thumb-color": thumbColor,
85
+ "--track-color": trackColor,
72
86
  ...style
73
87
  } as CSSProperties
74
88
  }