@vnejs/uis.react.scrollbar 0.2.0 → 0.2.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/Scrollbar.d.ts.map +1 -1
- package/dist/Scrollbar.js +5 -3
- package/dist/Scrollbar.js.map +1 -1
- package/dist/Scrollbar.styles.js +2 -0
- package/dist/Scrollbar.styles.js.map +1 -1
- package/dist/hooks/ref.hook.d.ts.map +1 -1
- package/dist/hooks/ref.hook.js +10 -1
- package/dist/hooks/ref.hook.js.map +1 -1
- package/dist/hooks/ref.hook.types.d.ts +2 -0
- package/dist/hooks/ref.hook.types.d.ts.map +1 -1
- package/dist/hooks/scroll-to.hook.d.ts.map +1 -1
- package/dist/hooks/scroll-to.hook.js.map +1 -1
- package/dist/hooks/scroll-to.hook.types.d.ts.map +1 -1
- package/dist/hooks/track-click.hook.d.ts +3 -0
- package/dist/hooks/track-click.hook.d.ts.map +1 -0
- package/dist/hooks/track-click.hook.js +47 -0
- package/dist/hooks/track-click.hook.js.map +1 -0
- package/dist/hooks/track-click.hook.types.d.ts +13 -0
- package/dist/hooks/track-click.hook.types.d.ts.map +1 -0
- package/dist/hooks/track-click.hook.types.js +2 -0
- package/dist/hooks/track-click.hook.types.js.map +1 -0
- package/package.json +1 -1
- package/src/Scrollbar.styles.ts +2 -0
- package/src/Scrollbar.tsx +11 -4
- package/src/hooks/ref.hook.ts +10 -1
- package/src/hooks/ref.hook.types.ts +2 -0
- package/src/hooks/scroll-to.hook.ts +0 -1
- package/src/hooks/scroll-to.hook.types.ts +6 -1
- package/src/hooks/track-click.hook.ts +59 -0
- package/src/hooks/track-click.hook.types.ts +15 -0
- package/tsconfig.json +2 -10
package/dist/Scrollbar.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Scrollbar.d.ts","sourceRoot":"","sources":["../src/Scrollbar.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"Scrollbar.d.ts","sourceRoot":"","sources":["../src/Scrollbar.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA6B3D,eAAO,MAAM,SAAS,oHAWnB,cAAc,gCA4DhB,CAAC"}
|
package/dist/Scrollbar.js
CHANGED
|
@@ -2,15 +2,17 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useEffect, useMemo } from "react";
|
|
3
3
|
import { getVneLength } from "@vnejs/uis.utils";
|
|
4
4
|
import { useThumbHook } from "./hooks/thumb.hook";
|
|
5
|
+
import { useTrackClickHook } from "./hooks/track-click.hook";
|
|
5
6
|
import { useScrollHook } from "./hooks/scroll.hook";
|
|
6
7
|
import { useScrollToHook } from "./hooks/scroll-to.hook";
|
|
7
8
|
import { useRefForScrollHook } from "./hooks/ref.hook";
|
|
8
9
|
import { b } from "./Scrollbar.styles.js";
|
|
9
|
-
const renderScroll = (thumbRef, isVisible, isHorizontal, isVertical) => (_jsx("div", { className: b("scroll", { isVisible, isHorizontal, isVertical }), children: _jsx("div", { className: b("thumb", { isHorizontal, isVertical }), ref: thumbRef }) }));
|
|
10
|
+
const renderScroll = (trackRef, thumbRef, isVisible, isHorizontal, isVertical) => (_jsx("div", { className: b("scroll", { isVisible, isHorizontal, isVertical }), ref: trackRef, "vne-cursor-type": isVisible ? "pointer" : "", children: _jsx("div", { className: b("thumb", { isHorizontal, isVertical }), ref: thumbRef }) }));
|
|
10
11
|
export const Scrollbar = ({ className = "", children, width = 0, height = 0, scrollTo = 0, scrollToEnd = false, hideScrolbars = false, disableScroll = false, wrapRef = null, textSize = null, }) => {
|
|
11
|
-
const { scrollbarWrapRef, scrollbarChildrenRef, thumbHorizontalRef, thumbVerticalRef } = useRefForScrollHook();
|
|
12
|
+
const { scrollbarWrapRef, scrollbarChildrenRef, thumbHorizontalRef, thumbVerticalRef, trackHorizontalRef, trackVerticalRef } = useRefForScrollHook();
|
|
12
13
|
const { shouldRenderHorizontal, shouldRenderVertical } = useScrollHook(scrollbarWrapRef, scrollbarChildrenRef, width, height, textSize);
|
|
13
14
|
useThumbHook(scrollbarWrapRef, thumbVerticalRef, thumbHorizontalRef);
|
|
15
|
+
useTrackClickHook(scrollbarWrapRef, trackVerticalRef, trackHorizontalRef, thumbVerticalRef, thumbHorizontalRef);
|
|
14
16
|
useScrollToHook(scrollTo, scrollToEnd, scrollbarWrapRef, scrollbarChildrenRef);
|
|
15
17
|
const style = useMemo(() => {
|
|
16
18
|
const result = {};
|
|
@@ -42,6 +44,6 @@ export const Scrollbar = ({ className = "", children, width = 0, height = 0, scr
|
|
|
42
44
|
if (wrapRef)
|
|
43
45
|
wrapRef.current = scrollbarWrapRef.current;
|
|
44
46
|
}, [wrapRef, scrollbarWrapRef.current]);
|
|
45
|
-
return (_jsxs("div", { className: b({}, [className]), style: style, children: [!hideScrolbars && renderScroll(thumbHorizontalRef, shouldRenderHorizontal, true, false), !hideScrolbars && renderScroll(thumbVerticalRef, shouldRenderVertical, false, true), _jsx("div", { className: b("wrap"), ref: scrollbarWrapRef, style: styleWrap, children: _jsx("div", { className: b("children"), ref: scrollbarChildrenRef, children: children }) })] }));
|
|
47
|
+
return (_jsxs("div", { className: b({}, [className]), style: style, children: [!hideScrolbars && renderScroll(trackHorizontalRef, thumbHorizontalRef, shouldRenderHorizontal, true, false), !hideScrolbars && renderScroll(trackVerticalRef, thumbVerticalRef, shouldRenderVertical, false, true), _jsx("div", { className: b("wrap"), ref: scrollbarWrapRef, style: styleWrap, children: _jsx("div", { className: b("children"), ref: scrollbarChildrenRef, children: children }) })] }));
|
|
46
48
|
};
|
|
47
49
|
//# sourceMappingURL=Scrollbar.js.map
|
package/dist/Scrollbar.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Scrollbar.js","sourceRoot":"","sources":["../src/Scrollbar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAG3C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIhD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,CAAC,EAAE,MAAM,uBAAuB,CAAC;AAE1C,MAAM,YAAY,GAAG,CACnB,QAA0C,EAC1C,SAAkB,EAClB,YAAqB,EACrB,UAAmB,EACnB,EAAE,CAAC,CACH,
|
|
1
|
+
{"version":3,"file":"Scrollbar.js","sourceRoot":"","sources":["../src/Scrollbar.tsx"],"names":[],"mappings":"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"}
|
package/dist/Scrollbar.styles.js
CHANGED
|
@@ -18,6 +18,7 @@ ${sel(b("scroll"))} {
|
|
|
18
18
|
transition: 1000ms;
|
|
19
19
|
border-radius: ${getVneLength(8)};
|
|
20
20
|
opacity: 0;
|
|
21
|
+
pointer-events: none;
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
${sel(b("thumb"))} {
|
|
@@ -56,6 +57,7 @@ ${sel(b("thumb", { isHorizontal: true }))} {
|
|
|
56
57
|
|
|
57
58
|
${sel(b("scroll", { isVisible: true }))} {
|
|
58
59
|
opacity: 1;
|
|
60
|
+
pointer-events: auto;
|
|
59
61
|
}
|
|
60
62
|
`;
|
|
61
63
|
injectStyles(CSS);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Scrollbar.styles.js","sourceRoot":"","sources":["../src/Scrollbar.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC;AAEjC,MAAM,GAAG,GAAG;EACV,GAAG,CAAC,CAAC,EAAE,CAAC;;;;;;;;EAQR,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;;;;EAId,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;;;mBAGC,YAAY,CAAC,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"Scrollbar.styles.js","sourceRoot":"","sources":["../src/Scrollbar.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC;AAEjC,MAAM,GAAG,GAAG;EACV,GAAG,CAAC,CAAC,EAAE,CAAC;;;;;;;;EAQR,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;;;;EAId,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;;;mBAGC,YAAY,CAAC,CAAC,CAAC;;;;;EAKhC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;;;mBAGE,YAAY,CAAC,EAAE,CAAC;;;EAGjC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;WAC7B,YAAY,CAAC,CAAC,EAAE,CAAC;;YAEhB,YAAY,CAAC,EAAE,CAAC;WACjB,YAAY,CAAC,EAAE,CAAC;;;;EAIzB,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;WAC5B,YAAY,CAAC,CAAC,CAAC,CAAC;WAChB,YAAY,CAAC,EAAE,CAAC;YACf,YAAY,CAAC,EAAE,CAAC;;;EAG1B,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9B,YAAY,CAAC,CAAC,EAAE,CAAC;;WAElB,YAAY,CAAC,EAAE,CAAC;YACf,YAAY,CAAC,EAAE,CAAC;;;;EAI1B,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;SAChC,YAAY,CAAC,CAAC,CAAC,CAAC;WACd,YAAY,CAAC,EAAE,CAAC;YACf,YAAY,CAAC,EAAE,CAAC;;;EAG1B,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;;;;CAItC,CAAC;AAEF,YAAY,CAAC,GAAG,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ref.hook.d.ts","sourceRoot":"","sources":["../../src/hooks/ref.hook.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAErE,eAAO,MAAM,mBAAmB,QAAO,
|
|
1
|
+
{"version":3,"file":"ref.hook.d.ts","sourceRoot":"","sources":["../../src/hooks/ref.hook.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAErE,eAAO,MAAM,mBAAmB,QAAO,yBAiBtC,CAAC"}
|
package/dist/hooks/ref.hook.js
CHANGED
|
@@ -4,6 +4,15 @@ export const useRefForScrollHook = () => {
|
|
|
4
4
|
const scrollbarChildrenRef = useRef(null);
|
|
5
5
|
const thumbVerticalRef = useRef(null);
|
|
6
6
|
const thumbHorizontalRef = useRef(null);
|
|
7
|
-
|
|
7
|
+
const trackVerticalRef = useRef(null);
|
|
8
|
+
const trackHorizontalRef = useRef(null);
|
|
9
|
+
return {
|
|
10
|
+
scrollbarWrapRef,
|
|
11
|
+
scrollbarChildrenRef,
|
|
12
|
+
thumbVerticalRef,
|
|
13
|
+
thumbHorizontalRef,
|
|
14
|
+
trackVerticalRef,
|
|
15
|
+
trackHorizontalRef,
|
|
16
|
+
};
|
|
8
17
|
};
|
|
9
18
|
//# sourceMappingURL=ref.hook.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ref.hook.js","sourceRoot":"","sources":["../../src/hooks/ref.hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAI/B,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAA8B,EAAE;IACjE,MAAM,gBAAgB,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACtD,MAAM,oBAAoB,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAE1D,MAAM,gBAAgB,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACtD,MAAM,kBAAkB,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAExD,OAAO,
|
|
1
|
+
{"version":3,"file":"ref.hook.js","sourceRoot":"","sources":["../../src/hooks/ref.hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAI/B,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAA8B,EAAE;IACjE,MAAM,gBAAgB,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACtD,MAAM,oBAAoB,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAE1D,MAAM,gBAAgB,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACtD,MAAM,kBAAkB,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACxD,MAAM,gBAAgB,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACtD,MAAM,kBAAkB,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAExD,OAAO;QACL,gBAAgB;QAChB,oBAAoB;QACpB,gBAAgB;QAChB,kBAAkB;QAClB,gBAAgB;QAChB,kBAAkB;KACnB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -4,6 +4,8 @@ export type ScrollbarRefs = {
|
|
|
4
4
|
scrollbarChildrenRef: RefObject<HTMLDivElement | null>;
|
|
5
5
|
thumbVerticalRef: RefObject<HTMLDivElement | null>;
|
|
6
6
|
thumbHorizontalRef: RefObject<HTMLDivElement | null>;
|
|
7
|
+
trackVerticalRef: RefObject<HTMLDivElement | null>;
|
|
8
|
+
trackHorizontalRef: RefObject<HTMLDivElement | null>;
|
|
7
9
|
};
|
|
8
10
|
export type UseRefForScrollHookReturn = ScrollbarRefs;
|
|
9
11
|
//# sourceMappingURL=ref.hook.types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ref.hook.types.d.ts","sourceRoot":"","sources":["../../src/hooks/ref.hook.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,aAAa,GAAG;IAC1B,gBAAgB,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACnD,oBAAoB,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACvD,gBAAgB,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACnD,kBAAkB,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"ref.hook.types.d.ts","sourceRoot":"","sources":["../../src/hooks/ref.hook.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,aAAa,GAAG;IAC1B,gBAAgB,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACnD,oBAAoB,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACvD,gBAAgB,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACnD,kBAAkB,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACrD,gBAAgB,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACnD,kBAAkB,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,aAAa,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-to.hook.d.ts","sourceRoot":"","sources":["../../src/hooks/scroll-to.hook.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,eAAe,EAAkF,MAAM,2BAA2B,CAAC;AAEjJ,eAAO,MAAM,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"scroll-to.hook.d.ts","sourceRoot":"","sources":["../../src/hooks/scroll-to.hook.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,eAAe,EAAkF,MAAM,2BAA2B,CAAC;AAEjJ,eAAO,MAAM,eAAe,EAAE,eA8B7B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-to.hook.js","sourceRoot":"","sources":["../../src/hooks/scroll-to.hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIlC,MAAM,CAAC,MAAM,eAAe,GAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,EAAE;IAChH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,IAAI,CAAC,oBAAoB,CAAC,OAAO;YAAE,OAAO;QAEvF,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B,CAAC;QAE3F,IAAI,OAAO,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"scroll-to.hook.js","sourceRoot":"","sources":["../../src/hooks/scroll-to.hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIlC,MAAM,CAAC,MAAM,eAAe,GAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,EAAE;IAChH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,IAAI,CAAC,oBAAoB,CAAC,OAAO;YAAE,OAAO;QAEvF,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B,CAAC;QAE3F,IAAI,OAAO,EAAE,CAAC;YACZ,IACE,gBAAgB,CAAC,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS;gBACtD,gBAAgB,CAAC,OAAO,CAAC,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,YAAY;gBACrH,gBAAgB,CAAC,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU;gBACxD,gBAAgB,CAAC,OAAO,CAAC,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,WAAW;gBAErH,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAEvD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,WAAW,IAAI,CAAC,oBAAoB,CAAC,OAAO;YAAE,OAAO;QAE1D,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,oBAAoB,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAEhH,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE;YAC7C,UAAU,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,cAAc,CAAC,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAErD,OAAO,GAAG,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;IAC3C,CAAC,EAAE,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-to.hook.types.d.ts","sourceRoot":"","sources":["../../src/hooks/scroll-to.hook.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,+BAA+B,GAAG,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;AAC/E,MAAM,MAAM,mCAAmC,GAAG,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;AAEnF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,+BAA+B,CAAC;IAClD,oBAAoB,EAAE,mCAAmC,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,
|
|
1
|
+
{"version":3,"file":"scroll-to.hook.types.d.ts","sourceRoot":"","sources":["../../src/hooks/scroll-to.hook.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,+BAA+B,GAAG,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;AAC/E,MAAM,MAAM,mCAAmC,GAAG,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;AAEnF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,+BAA+B,CAAC;IAClD,oBAAoB,EAAE,mCAAmC,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAC5B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,OAAO,EACpB,gBAAgB,EAAE,+BAA+B,EACjD,oBAAoB,EAAE,mCAAmC,KACtD,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-click.hook.d.ts","sourceRoot":"","sources":["../../src/hooks/track-click.hook.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAgBrE,eAAO,MAAM,iBAAiB,EAAE,iBAwC/B,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
const clamp = (value, min, max) => Math.min(max, Math.max(min, value));
|
|
3
|
+
const getScrollFromTrackClick = (clickOffset, trackSize, thumbSize, maxScroll) => {
|
|
4
|
+
if (maxScroll <= 0 || trackSize <= 0)
|
|
5
|
+
return 0;
|
|
6
|
+
const travel = trackSize - thumbSize;
|
|
7
|
+
if (travel <= 0)
|
|
8
|
+
return 0;
|
|
9
|
+
const ratio = clamp((clickOffset - thumbSize / 2) / travel, 0, 1);
|
|
10
|
+
return ratio * maxScroll;
|
|
11
|
+
};
|
|
12
|
+
export const useTrackClickHook = (scrollbarWrapRef, trackVerticalRef, trackHorizontalRef, thumbVerticalRef, thumbHorizontalRef) => {
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
const wrap = scrollbarWrapRef.current;
|
|
15
|
+
const trackVertical = trackVerticalRef.current;
|
|
16
|
+
const trackHorizontal = trackHorizontalRef.current;
|
|
17
|
+
if (!wrap)
|
|
18
|
+
return;
|
|
19
|
+
const handleVerticalPointerDown = (event) => {
|
|
20
|
+
const thumb = thumbVerticalRef.current;
|
|
21
|
+
if (!trackVertical || !thumb)
|
|
22
|
+
return;
|
|
23
|
+
if (thumb.contains(event.target))
|
|
24
|
+
return;
|
|
25
|
+
const clickOffset = event.clientY - trackVertical.getBoundingClientRect().top;
|
|
26
|
+
const maxScroll = wrap.scrollHeight - wrap.clientHeight;
|
|
27
|
+
wrap.scrollTop = getScrollFromTrackClick(clickOffset, trackVertical.clientHeight, thumb.clientHeight, maxScroll);
|
|
28
|
+
};
|
|
29
|
+
const handleHorizontalPointerDown = (event) => {
|
|
30
|
+
const thumb = thumbHorizontalRef.current;
|
|
31
|
+
if (!trackHorizontal || !thumb)
|
|
32
|
+
return;
|
|
33
|
+
if (thumb.contains(event.target))
|
|
34
|
+
return;
|
|
35
|
+
const clickOffset = event.clientX - trackHorizontal.getBoundingClientRect().left;
|
|
36
|
+
const maxScroll = wrap.scrollWidth - wrap.clientWidth;
|
|
37
|
+
wrap.scrollLeft = getScrollFromTrackClick(clickOffset, trackHorizontal.clientWidth, thumb.clientWidth, maxScroll);
|
|
38
|
+
};
|
|
39
|
+
trackVertical?.addEventListener("pointerdown", handleVerticalPointerDown);
|
|
40
|
+
trackHorizontal?.addEventListener("pointerdown", handleHorizontalPointerDown);
|
|
41
|
+
return () => {
|
|
42
|
+
trackVertical?.removeEventListener("pointerdown", handleVerticalPointerDown);
|
|
43
|
+
trackHorizontal?.removeEventListener("pointerdown", handleHorizontalPointerDown);
|
|
44
|
+
};
|
|
45
|
+
}, [scrollbarWrapRef, trackVerticalRef, trackHorizontalRef, thumbVerticalRef, thumbHorizontalRef]);
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=track-click.hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-click.hook.js","sourceRoot":"","sources":["../../src/hooks/track-click.hook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RefObject } from "react";
|
|
2
|
+
export type UseTrackClickHookScrollbarWrapRef = RefObject<HTMLDivElement | null>;
|
|
3
|
+
export type UseTrackClickHookTrackRef = RefObject<HTMLDivElement | null>;
|
|
4
|
+
export type UseTrackClickHookThumbRef = RefObject<HTMLDivElement | null>;
|
|
5
|
+
export type UseTrackClickHookParams = [
|
|
6
|
+
scrollbarWrapRef: UseTrackClickHookScrollbarWrapRef,
|
|
7
|
+
trackVerticalRef: UseTrackClickHookTrackRef,
|
|
8
|
+
trackHorizontalRef: UseTrackClickHookTrackRef,
|
|
9
|
+
thumbVerticalRef: UseTrackClickHookThumbRef,
|
|
10
|
+
thumbHorizontalRef: UseTrackClickHookThumbRef
|
|
11
|
+
];
|
|
12
|
+
export type UseTrackClickHook = (...args: UseTrackClickHookParams) => void;
|
|
13
|
+
//# sourceMappingURL=track-click.hook.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-click.hook.types.d.ts","sourceRoot":"","sources":["../../src/hooks/track-click.hook.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,iCAAiC,GAAG,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;AACjF,MAAM,MAAM,yBAAyB,GAAG,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;AACzE,MAAM,MAAM,yBAAyB,GAAG,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;AAEzE,MAAM,MAAM,uBAAuB,GAAG;IACpC,gBAAgB,EAAE,iCAAiC;IACnD,gBAAgB,EAAE,yBAAyB;IAC3C,kBAAkB,EAAE,yBAAyB;IAC7C,gBAAgB,EAAE,yBAAyB;IAC3C,kBAAkB,EAAE,yBAAyB;CAC9C,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,IAAI,EAAE,uBAAuB,KAAK,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-click.hook.types.js","sourceRoot":"","sources":["../../src/hooks/track-click.hook.types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
package/src/Scrollbar.styles.ts
CHANGED
|
@@ -20,6 +20,7 @@ ${sel(b("scroll"))} {
|
|
|
20
20
|
transition: 1000ms;
|
|
21
21
|
border-radius: ${getVneLength(8)};
|
|
22
22
|
opacity: 0;
|
|
23
|
+
pointer-events: none;
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
${sel(b("thumb"))} {
|
|
@@ -58,6 +59,7 @@ ${sel(b("thumb", { isHorizontal: true }))} {
|
|
|
58
59
|
|
|
59
60
|
${sel(b("scroll", { isVisible: true }))} {
|
|
60
61
|
opacity: 1;
|
|
62
|
+
pointer-events: auto;
|
|
61
63
|
}
|
|
62
64
|
`;
|
|
63
65
|
|
package/src/Scrollbar.tsx
CHANGED
|
@@ -6,6 +6,7 @@ import { getVneLength } from "@vnejs/uis.utils";
|
|
|
6
6
|
import { type ScrollbarProps } from "./Scrollbar.types.js";
|
|
7
7
|
|
|
8
8
|
import { useThumbHook } from "./hooks/thumb.hook";
|
|
9
|
+
import { useTrackClickHook } from "./hooks/track-click.hook";
|
|
9
10
|
import { useScrollHook } from "./hooks/scroll.hook";
|
|
10
11
|
import { useScrollToHook } from "./hooks/scroll-to.hook";
|
|
11
12
|
import { useRefForScrollHook } from "./hooks/ref.hook";
|
|
@@ -13,12 +14,17 @@ import { useRefForScrollHook } from "./hooks/ref.hook";
|
|
|
13
14
|
import { b } from "./Scrollbar.styles.js";
|
|
14
15
|
|
|
15
16
|
const renderScroll = (
|
|
17
|
+
trackRef: RefObject<HTMLDivElement | null>,
|
|
16
18
|
thumbRef: RefObject<HTMLDivElement | null>,
|
|
17
19
|
isVisible: boolean,
|
|
18
20
|
isHorizontal: boolean,
|
|
19
21
|
isVertical: boolean,
|
|
20
22
|
) => (
|
|
21
|
-
<div
|
|
23
|
+
<div
|
|
24
|
+
className={b("scroll", { isVisible, isHorizontal, isVertical })}
|
|
25
|
+
ref={trackRef}
|
|
26
|
+
vne-cursor-type={isVisible ? "pointer" : ""}
|
|
27
|
+
>
|
|
22
28
|
<div
|
|
23
29
|
className={b("thumb", { isHorizontal, isVertical })}
|
|
24
30
|
ref={thumbRef}
|
|
@@ -38,10 +44,11 @@ export const Scrollbar = ({
|
|
|
38
44
|
wrapRef = null,
|
|
39
45
|
textSize = null,
|
|
40
46
|
}: ScrollbarProps) => {
|
|
41
|
-
const { scrollbarWrapRef, scrollbarChildrenRef, thumbHorizontalRef, thumbVerticalRef } = useRefForScrollHook();
|
|
47
|
+
const { scrollbarWrapRef, scrollbarChildrenRef, thumbHorizontalRef, thumbVerticalRef, trackHorizontalRef, trackVerticalRef } = useRefForScrollHook();
|
|
42
48
|
const { shouldRenderHorizontal, shouldRenderVertical } = useScrollHook(scrollbarWrapRef, scrollbarChildrenRef, width, height, textSize);
|
|
43
49
|
|
|
44
50
|
useThumbHook(scrollbarWrapRef, thumbVerticalRef, thumbHorizontalRef);
|
|
51
|
+
useTrackClickHook(scrollbarWrapRef, trackVerticalRef, trackHorizontalRef, thumbVerticalRef, thumbHorizontalRef);
|
|
45
52
|
useScrollToHook(scrollTo, scrollToEnd, scrollbarWrapRef, scrollbarChildrenRef);
|
|
46
53
|
|
|
47
54
|
const style = useMemo(() => {
|
|
@@ -79,8 +86,8 @@ export const Scrollbar = ({
|
|
|
79
86
|
className={b({}, [className])}
|
|
80
87
|
style={style}
|
|
81
88
|
>
|
|
82
|
-
{!hideScrolbars && renderScroll(thumbHorizontalRef, shouldRenderHorizontal, true, false)}
|
|
83
|
-
{!hideScrolbars && renderScroll(thumbVerticalRef, shouldRenderVertical, false, true)}
|
|
89
|
+
{!hideScrolbars && renderScroll(trackHorizontalRef, thumbHorizontalRef, shouldRenderHorizontal, true, false)}
|
|
90
|
+
{!hideScrolbars && renderScroll(trackVerticalRef, thumbVerticalRef, shouldRenderVertical, false, true)}
|
|
84
91
|
|
|
85
92
|
<div
|
|
86
93
|
className={b("wrap")}
|
package/src/hooks/ref.hook.ts
CHANGED
|
@@ -8,6 +8,15 @@ export const useRefForScrollHook = (): UseRefForScrollHookReturn => {
|
|
|
8
8
|
|
|
9
9
|
const thumbVerticalRef = useRef<HTMLDivElement>(null);
|
|
10
10
|
const thumbHorizontalRef = useRef<HTMLDivElement>(null);
|
|
11
|
+
const trackVerticalRef = useRef<HTMLDivElement>(null);
|
|
12
|
+
const trackHorizontalRef = useRef<HTMLDivElement>(null);
|
|
11
13
|
|
|
12
|
-
return {
|
|
14
|
+
return {
|
|
15
|
+
scrollbarWrapRef,
|
|
16
|
+
scrollbarChildrenRef,
|
|
17
|
+
thumbVerticalRef,
|
|
18
|
+
thumbHorizontalRef,
|
|
19
|
+
trackVerticalRef,
|
|
20
|
+
trackHorizontalRef,
|
|
21
|
+
};
|
|
13
22
|
};
|
|
@@ -5,6 +5,8 @@ export type ScrollbarRefs = {
|
|
|
5
5
|
scrollbarChildrenRef: RefObject<HTMLDivElement | null>;
|
|
6
6
|
thumbVerticalRef: RefObject<HTMLDivElement | null>;
|
|
7
7
|
thumbHorizontalRef: RefObject<HTMLDivElement | null>;
|
|
8
|
+
trackVerticalRef: RefObject<HTMLDivElement | null>;
|
|
9
|
+
trackHorizontalRef: RefObject<HTMLDivElement | null>;
|
|
8
10
|
};
|
|
9
11
|
|
|
10
12
|
export type UseRefForScrollHookReturn = ScrollbarRefs;
|
|
@@ -9,7 +9,6 @@ export const useScrollToHook: UseScrollToHook = (scrollTo, scrollToEnd, scrollba
|
|
|
9
9
|
const element = scrollbarChildrenRef.current.children[scrollTo] as HTMLElement | undefined;
|
|
10
10
|
|
|
11
11
|
if (element) {
|
|
12
|
-
|
|
13
12
|
if (
|
|
14
13
|
scrollbarWrapRef.current.scrollTop > element.offsetTop ||
|
|
15
14
|
scrollbarWrapRef.current.scrollTop + scrollbarWrapRef.current.clientHeight < element.offsetTop + element.clientHeight ||
|
|
@@ -10,4 +10,9 @@ export type UseScrollToHookParams = {
|
|
|
10
10
|
scrollbarChildrenRef: UseScrollToHookScrollbarChildrenRef;
|
|
11
11
|
};
|
|
12
12
|
|
|
13
|
-
export type UseScrollToHook = (
|
|
13
|
+
export type UseScrollToHook = (
|
|
14
|
+
scrollTo: number,
|
|
15
|
+
scrollToEnd: boolean,
|
|
16
|
+
scrollbarWrapRef: UseScrollToHookScrollbarWrapRef,
|
|
17
|
+
scrollbarChildrenRef: UseScrollToHookScrollbarChildrenRef,
|
|
18
|
+
) => void;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
|
|
3
|
+
import { type UseTrackClickHook } from "./track-click.hook.types.js";
|
|
4
|
+
|
|
5
|
+
const clamp = (value: number, min: number, max: number) => Math.min(max, Math.max(min, value));
|
|
6
|
+
|
|
7
|
+
const getScrollFromTrackClick = (clickOffset: number, trackSize: number, thumbSize: number, maxScroll: number) => {
|
|
8
|
+
if (maxScroll <= 0 || trackSize <= 0) return 0;
|
|
9
|
+
|
|
10
|
+
const travel = trackSize - thumbSize;
|
|
11
|
+
|
|
12
|
+
if (travel <= 0) return 0;
|
|
13
|
+
|
|
14
|
+
const ratio = clamp((clickOffset - thumbSize / 2) / travel, 0, 1);
|
|
15
|
+
|
|
16
|
+
return ratio * maxScroll;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const useTrackClickHook: UseTrackClickHook = (scrollbarWrapRef, trackVerticalRef, trackHorizontalRef, thumbVerticalRef, thumbHorizontalRef) => {
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
const wrap = scrollbarWrapRef.current;
|
|
22
|
+
const trackVertical = trackVerticalRef.current;
|
|
23
|
+
const trackHorizontal = trackHorizontalRef.current;
|
|
24
|
+
|
|
25
|
+
if (!wrap) return;
|
|
26
|
+
|
|
27
|
+
const handleVerticalPointerDown = (event: PointerEvent) => {
|
|
28
|
+
const thumb = thumbVerticalRef.current;
|
|
29
|
+
|
|
30
|
+
if (!trackVertical || !thumb) return;
|
|
31
|
+
if (thumb.contains(event.target as Node)) return;
|
|
32
|
+
|
|
33
|
+
const clickOffset = event.clientY - trackVertical.getBoundingClientRect().top;
|
|
34
|
+
const maxScroll = wrap.scrollHeight - wrap.clientHeight;
|
|
35
|
+
|
|
36
|
+
wrap.scrollTop = getScrollFromTrackClick(clickOffset, trackVertical.clientHeight, thumb.clientHeight, maxScroll);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const handleHorizontalPointerDown = (event: PointerEvent) => {
|
|
40
|
+
const thumb = thumbHorizontalRef.current;
|
|
41
|
+
|
|
42
|
+
if (!trackHorizontal || !thumb) return;
|
|
43
|
+
if (thumb.contains(event.target as Node)) return;
|
|
44
|
+
|
|
45
|
+
const clickOffset = event.clientX - trackHorizontal.getBoundingClientRect().left;
|
|
46
|
+
const maxScroll = wrap.scrollWidth - wrap.clientWidth;
|
|
47
|
+
|
|
48
|
+
wrap.scrollLeft = getScrollFromTrackClick(clickOffset, trackHorizontal.clientWidth, thumb.clientWidth, maxScroll);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
trackVertical?.addEventListener("pointerdown", handleVerticalPointerDown);
|
|
52
|
+
trackHorizontal?.addEventListener("pointerdown", handleHorizontalPointerDown);
|
|
53
|
+
|
|
54
|
+
return () => {
|
|
55
|
+
trackVertical?.removeEventListener("pointerdown", handleVerticalPointerDown);
|
|
56
|
+
trackHorizontal?.removeEventListener("pointerdown", handleHorizontalPointerDown);
|
|
57
|
+
};
|
|
58
|
+
}, [scrollbarWrapRef, trackVerticalRef, trackHorizontalRef, thumbVerticalRef, thumbHorizontalRef]);
|
|
59
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { RefObject } from "react";
|
|
2
|
+
|
|
3
|
+
export type UseTrackClickHookScrollbarWrapRef = RefObject<HTMLDivElement | null>;
|
|
4
|
+
export type UseTrackClickHookTrackRef = RefObject<HTMLDivElement | null>;
|
|
5
|
+
export type UseTrackClickHookThumbRef = RefObject<HTMLDivElement | null>;
|
|
6
|
+
|
|
7
|
+
export type UseTrackClickHookParams = [
|
|
8
|
+
scrollbarWrapRef: UseTrackClickHookScrollbarWrapRef,
|
|
9
|
+
trackVerticalRef: UseTrackClickHookTrackRef,
|
|
10
|
+
trackHorizontalRef: UseTrackClickHookTrackRef,
|
|
11
|
+
thumbVerticalRef: UseTrackClickHookThumbRef,
|
|
12
|
+
thumbHorizontalRef: UseTrackClickHookThumbRef,
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
export type UseTrackClickHook = (...args: UseTrackClickHookParams) => void;
|
package/tsconfig.json
CHANGED
|
@@ -4,14 +4,6 @@
|
|
|
4
4
|
"outDir": "dist",
|
|
5
5
|
"rootDir": "src"
|
|
6
6
|
},
|
|
7
|
-
"include": [
|
|
8
|
-
|
|
9
|
-
"src/**/*.tsx",
|
|
10
|
-
"../../../globals.d.ts",
|
|
11
|
-
],
|
|
12
|
-
"exclude": [
|
|
13
|
-
"dist",
|
|
14
|
-
"node_modules",
|
|
15
|
-
"src/**/*.stories.tsx"
|
|
16
|
-
]
|
|
7
|
+
"include": ["src/**/*.ts", "src/**/*.tsx", "../../../globals.d.ts"],
|
|
8
|
+
"exclude": ["dist", "node_modules", "src/**/*.stories.tsx"]
|
|
17
9
|
}
|