@v-c/virtual-list 0.0.1 → 1.0.0

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.
Files changed (66) hide show
  1. package/bump.config.ts +6 -0
  2. package/dist/Filler.cjs +51 -1
  3. package/dist/Filler.js +47 -56
  4. package/dist/Item.cjs +26 -1
  5. package/dist/Item.js +23 -26
  6. package/dist/List.cjs +408 -1
  7. package/dist/List.d.ts +45 -9
  8. package/dist/List.js +403 -274
  9. package/dist/ScrollBar.cjs +259 -1
  10. package/dist/ScrollBar.d.ts +3 -97
  11. package/dist/ScrollBar.js +254 -191
  12. package/dist/_virtual/rolldown_runtime.cjs +21 -0
  13. package/dist/hooks/useDiffItem.cjs +19 -1
  14. package/dist/hooks/useDiffItem.js +16 -20
  15. package/dist/hooks/useFrameWheel.cjs +63 -1
  16. package/dist/hooks/useFrameWheel.js +60 -51
  17. package/dist/hooks/useGetSize.cjs +29 -1
  18. package/dist/hooks/useGetSize.d.ts +2 -2
  19. package/dist/hooks/useGetSize.js +27 -23
  20. package/dist/hooks/useHeights.cjs +66 -1
  21. package/dist/hooks/useHeights.d.ts +1 -1
  22. package/dist/hooks/useHeights.js +62 -41
  23. package/dist/hooks/useMobileTouchMove.cjs +82 -1
  24. package/dist/hooks/useMobileTouchMove.js +79 -43
  25. package/dist/hooks/useOriginScroll.cjs +23 -1
  26. package/dist/hooks/useOriginScroll.js +20 -16
  27. package/dist/hooks/useScrollDrag.cjs +83 -1
  28. package/dist/hooks/useScrollDrag.js +77 -48
  29. package/dist/hooks/useScrollTo.cjs +97 -0
  30. package/dist/hooks/useScrollTo.d.ts +19 -0
  31. package/dist/hooks/useScrollTo.js +94 -0
  32. package/dist/index.cjs +4 -1
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.js +3 -4
  35. package/dist/interface.cjs +0 -1
  36. package/dist/interface.d.ts +1 -1
  37. package/dist/interface.js +0 -1
  38. package/dist/utils/CacheMap.cjs +25 -1
  39. package/dist/utils/CacheMap.d.ts +1 -1
  40. package/dist/utils/CacheMap.js +23 -28
  41. package/dist/utils/isFirefox.cjs +4 -1
  42. package/dist/utils/isFirefox.js +2 -4
  43. package/dist/utils/scrollbarUtil.cjs +8 -1
  44. package/dist/utils/scrollbarUtil.js +7 -6
  45. package/docs/animate.less +31 -0
  46. package/docs/animate.vue +159 -0
  47. package/docs/basic.vue +2 -1
  48. package/docs/nest.vue +1 -1
  49. package/docs/switch.vue +2 -1
  50. package/docs/virtual-list.stories.vue +4 -0
  51. package/package.json +16 -14
  52. package/src/Filler.tsx +2 -1
  53. package/src/Item.tsx +2 -1
  54. package/src/List.tsx +189 -124
  55. package/src/ScrollBar.tsx +33 -44
  56. package/src/hooks/useDiffItem.ts +3 -2
  57. package/src/hooks/useFrameWheel.ts +2 -1
  58. package/src/hooks/useGetSize.ts +5 -4
  59. package/src/hooks/useHeights.ts +7 -6
  60. package/src/hooks/useMobileTouchMove.ts +2 -1
  61. package/src/hooks/useOriginScroll.ts +2 -1
  62. package/src/hooks/useScrollDrag.ts +2 -1
  63. package/src/hooks/useScrollTo.tsx +184 -0
  64. package/src/index.ts +1 -1
  65. package/tsconfig.json +7 -0
  66. package/vitest.config.ts +1 -1
@@ -1,52 +1,61 @@
1
- import { ref as u, onUnmounted as y } from "vue";
2
- import h from "../utils/isFirefox.js";
3
- import W from "./useOriginScroll.js";
4
- function _(c, d, p, x, A, D, m) {
5
- const r = u(0);
6
- let t = null;
7
- const v = u(null), F = u(!1), b = W(
8
- d,
9
- p,
10
- x,
11
- A
12
- );
13
- function g(e, l) {
14
- if (t && cancelAnimationFrame(t), b(!1, l))
15
- return;
16
- const a = e;
17
- if (!a._virtualHandled)
18
- a._virtualHandled = !0;
19
- else
20
- return;
21
- r.value += l, v.value = l, h || a.preventDefault(), t = requestAnimationFrame(() => {
22
- const o = F.value ? 10 : 1;
23
- m(r.value * o, !1), r.value = 0;
24
- });
25
- }
26
- function M(e, l) {
27
- m(l, !0), h || e.preventDefault();
28
- }
29
- const n = u(null);
30
- let i = null;
31
- function R(e) {
32
- if (!c.value)
33
- return;
34
- i && cancelAnimationFrame(i), i = requestAnimationFrame(() => {
35
- n.value = null;
36
- });
37
- const { deltaX: l, deltaY: a, shiftKey: o } = e;
38
- let f = l, s = a;
39
- (n.value === "sx" || !n.value && o && a && !l) && (f = a, s = 0, n.value = "sx");
40
- const X = Math.abs(f), w = Math.abs(s);
41
- n.value === null && (n.value = D && X > w ? "x" : "y"), n.value === "y" ? g(e, s) : M(e, f);
42
- }
43
- function S(e) {
44
- c.value && (F.value = e.detail === v.value);
45
- }
46
- return y(() => {
47
- t && cancelAnimationFrame(t), i && cancelAnimationFrame(i);
48
- }), [R, S];
1
+ import isFirefox_default from "../utils/isFirefox.js";
2
+ import useOriginScroll from "./useOriginScroll.js";
3
+ import { onUnmounted, ref } from "vue";
4
+ function useFrameWheel(inVirtual, isScrollAtTop, isScrollAtBottom, isScrollAtLeft, isScrollAtRight, horizontalScroll, onWheelDelta) {
5
+ const offsetRef = ref(0);
6
+ let nextFrame = null;
7
+ const wheelValueRef = ref(null);
8
+ const isMouseScrollRef = ref(false);
9
+ const originScroll = useOriginScroll(isScrollAtTop, isScrollAtBottom, isScrollAtLeft, isScrollAtRight);
10
+ function onWheelY(e, deltaY) {
11
+ if (nextFrame) cancelAnimationFrame(nextFrame);
12
+ if (originScroll(false, deltaY)) return;
13
+ const event = e;
14
+ if (!event._virtualHandled) event._virtualHandled = true;
15
+ else return;
16
+ offsetRef.value += deltaY;
17
+ wheelValueRef.value = deltaY;
18
+ if (!isFirefox_default) event.preventDefault();
19
+ nextFrame = requestAnimationFrame(() => {
20
+ const patchMultiple = isMouseScrollRef.value ? 10 : 1;
21
+ onWheelDelta(offsetRef.value * patchMultiple, false);
22
+ offsetRef.value = 0;
23
+ });
24
+ }
25
+ function onWheelX(event, deltaX) {
26
+ onWheelDelta(deltaX, true);
27
+ if (!isFirefox_default) event.preventDefault();
28
+ }
29
+ const wheelDirectionRef = ref(null);
30
+ let wheelDirectionClean = null;
31
+ function onWheel(event) {
32
+ if (!inVirtual.value) return;
33
+ if (wheelDirectionClean) cancelAnimationFrame(wheelDirectionClean);
34
+ wheelDirectionClean = requestAnimationFrame(() => {
35
+ wheelDirectionRef.value = null;
36
+ });
37
+ const { deltaX, deltaY, shiftKey } = event;
38
+ let mergedDeltaX = deltaX;
39
+ let mergedDeltaY = deltaY;
40
+ if (wheelDirectionRef.value === "sx" || !wheelDirectionRef.value && (shiftKey || false) && deltaY && !deltaX) {
41
+ mergedDeltaX = deltaY;
42
+ mergedDeltaY = 0;
43
+ wheelDirectionRef.value = "sx";
44
+ }
45
+ const absX = Math.abs(mergedDeltaX);
46
+ const absY = Math.abs(mergedDeltaY);
47
+ if (wheelDirectionRef.value === null) wheelDirectionRef.value = horizontalScroll && absX > absY ? "x" : "y";
48
+ if (wheelDirectionRef.value === "y") onWheelY(event, mergedDeltaY);
49
+ else onWheelX(event, mergedDeltaX);
50
+ }
51
+ function onFireFoxScroll(event) {
52
+ if (!inVirtual.value) return;
53
+ isMouseScrollRef.value = event.detail === wheelValueRef.value;
54
+ }
55
+ onUnmounted(() => {
56
+ if (nextFrame) cancelAnimationFrame(nextFrame);
57
+ if (wheelDirectionClean) cancelAnimationFrame(wheelDirectionClean);
58
+ });
59
+ return [onWheel, onFireFoxScroll];
49
60
  }
50
- export {
51
- _ as default
52
- };
61
+ export { useFrameWheel as default };
@@ -1 +1,29 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("vue");function p(e,t,c,v){return b.computed(()=>(n,u)=>{let f=0,r=e.value.length-1;n!=null&&(f=e.value.findIndex(o=>t(o)===n)),u!=null&&(r=e.value.findIndex(o=>t(o)===u));let d=0;for(let o=0;o<f;o+=1){const i=t(e.value[o]),l=c.get(i);d+=l===void 0?v:l}let s=0;for(let o=e.value.length-1;o>r;o-=1){const i=t(e.value[o]),l=c.get(i);s+=l===void 0?v:l}return{top:d,bottom:s}})}exports.useGetSize=p;
1
+ const require_rolldown_runtime = require("../_virtual/rolldown_runtime.cjs");
2
+ let vue = require("vue");
3
+ function useGetSize(mergedData, getKey, heights, itemHeight) {
4
+ return (0, vue.computed)(() => {
5
+ return (startKey, endKey) => {
6
+ let topIndex = 0;
7
+ let bottomIndex = mergedData.value.length - 1;
8
+ if (startKey !== void 0 && startKey !== null) topIndex = mergedData.value.findIndex((item) => getKey(item) === startKey);
9
+ if (endKey !== void 0 && endKey !== null) bottomIndex = mergedData.value.findIndex((item) => getKey(item) === endKey);
10
+ let top = 0;
11
+ for (let i = 0; i < topIndex; i += 1) {
12
+ const key = getKey(mergedData.value[i]);
13
+ const cacheHeight = heights.get(key);
14
+ top += cacheHeight === void 0 ? itemHeight.value : cacheHeight;
15
+ }
16
+ let bottom = 0;
17
+ for (let i = mergedData.value.length - 1; i > bottomIndex; i -= 1) {
18
+ const key = getKey(mergedData.value[i]);
19
+ const cacheHeight = heights.get(key);
20
+ bottom += cacheHeight === void 0 ? itemHeight.value : cacheHeight;
21
+ }
22
+ return {
23
+ top,
24
+ bottom
25
+ };
26
+ };
27
+ });
28
+ }
29
+ exports.useGetSize = useGetSize;
@@ -1,7 +1,7 @@
1
+ import { ComputedRef, Ref } from 'vue';
1
2
  import { GetKey } from '../interface';
2
3
  import { default as CacheMap } from '../utils/CacheMap';
3
- import { ComputedRef, Ref } from 'vue';
4
- export declare function useGetSize<T>(mergedData: Ref<T[]>, getKey: GetKey<T>, heights: CacheMap, itemHeight: number): ComputedRef<(startKey: any, endKey?: any) => {
4
+ export declare function useGetSize<T>(mergedData: Ref<T[]>, getKey: GetKey<T>, heights: CacheMap, itemHeight: Ref<number>): ComputedRef<(startKey: any, endKey?: any) => {
5
5
  top: number;
6
6
  bottom: number;
7
7
  }>;
@@ -1,24 +1,28 @@
1
- import { computed as r } from "vue";
2
- function h(l, t, v, e) {
3
- return r(() => (u, i) => {
4
- let f = 0, p = l.value.length - 1;
5
- u != null && (f = l.value.findIndex((o) => t(o) === u)), i != null && (p = l.value.findIndex((o) => t(o) === i));
6
- let x = 0;
7
- for (let o = 0; o < f; o += 1) {
8
- const c = t(l.value[o]), n = v.get(c);
9
- x += n === void 0 ? e : n;
10
- }
11
- let d = 0;
12
- for (let o = l.value.length - 1; o > p; o -= 1) {
13
- const c = t(l.value[o]), n = v.get(c);
14
- d += n === void 0 ? e : n;
15
- }
16
- return {
17
- top: x,
18
- bottom: d
19
- };
20
- });
1
+ import { computed } from "vue";
2
+ function useGetSize(mergedData, getKey, heights, itemHeight) {
3
+ return computed(() => {
4
+ return (startKey, endKey) => {
5
+ let topIndex = 0;
6
+ let bottomIndex = mergedData.value.length - 1;
7
+ if (startKey !== void 0 && startKey !== null) topIndex = mergedData.value.findIndex((item) => getKey(item) === startKey);
8
+ if (endKey !== void 0 && endKey !== null) bottomIndex = mergedData.value.findIndex((item) => getKey(item) === endKey);
9
+ let top = 0;
10
+ for (let i = 0; i < topIndex; i += 1) {
11
+ const key = getKey(mergedData.value[i]);
12
+ const cacheHeight = heights.get(key);
13
+ top += cacheHeight === void 0 ? itemHeight.value : cacheHeight;
14
+ }
15
+ let bottom = 0;
16
+ for (let i = mergedData.value.length - 1; i > bottomIndex; i -= 1) {
17
+ const key = getKey(mergedData.value[i]);
18
+ const cacheHeight = heights.get(key);
19
+ bottom += cacheHeight === void 0 ? itemHeight.value : cacheHeight;
20
+ }
21
+ return {
22
+ top,
23
+ bottom
24
+ };
25
+ };
26
+ });
21
27
  }
22
- export {
23
- h as useGetSize
24
- };
28
+ export { useGetSize };
@@ -1 +1,66 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n=require("vue"),C=require("../utils/CacheMap.cjs");function h(f){const s=parseFloat(f);return isNaN(s)?0:s}function P(f,s,m){const i=n.ref(0),a=n.ref(new Map),l=n.ref(new C.default),r=n.ref(0);function c(){r.value+=1}function g(u=!1){c();const e=()=>{let t=!1;a.value.forEach((o,v)=>{if(o&&o.offsetParent){const{offsetHeight:M}=o,{marginTop:N,marginBottom:R}=getComputedStyle(o),H=h(N),b=h(R),d=M+H+b;l.value.get(v)!==d&&(l.value.set(v,d),t=!0)}}),t&&(i.value+=1)};if(u)e();else{r.value+=1;const t=r.value;Promise.resolve().then(()=>{t===r.value&&e()})}}function p(u,e){const t=f(u),o=a.value.get(t);o!==e&&(e?(a.value.set(t,e),g()):a.value.delete(t),!o!=!e&&(e?s?.(u):m?.(u)))}return n.onUnmounted(()=>{c()}),[p,g,l.value,i]}exports.default=P;
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ const require_rolldown_runtime = require("../_virtual/rolldown_runtime.cjs");
3
+ const require_CacheMap = require("../utils/CacheMap.cjs");
4
+ let vue = require("vue");
5
+ function parseNumber(value) {
6
+ const num = parseFloat(value);
7
+ return isNaN(num) ? 0 : num;
8
+ }
9
+ function useHeights(getKey, onItemAdd, onItemRemove) {
10
+ const updatedMark = (0, vue.ref)(0);
11
+ const instanceRef = (0, vue.ref)(/* @__PURE__ */ new Map());
12
+ const heightsRef = (0, vue.reactive)(new require_CacheMap.default());
13
+ const promiseIdRef = (0, vue.ref)(0);
14
+ function cancelRaf() {
15
+ promiseIdRef.value += 1;
16
+ }
17
+ function collectHeight(sync = false) {
18
+ cancelRaf();
19
+ const doCollect = () => {
20
+ let changed = false;
21
+ instanceRef.value.forEach((element, key) => {
22
+ if (element && element.offsetParent) {
23
+ const { offsetHeight } = element;
24
+ const { marginTop, marginBottom } = getComputedStyle(element);
25
+ const marginTopNum = parseNumber(marginTop);
26
+ const marginBottomNum = parseNumber(marginBottom);
27
+ const totalHeight = offsetHeight + marginTopNum + marginBottomNum;
28
+ if (heightsRef.get(key) !== totalHeight) {
29
+ heightsRef.set(key, totalHeight);
30
+ changed = true;
31
+ }
32
+ }
33
+ });
34
+ if (changed) updatedMark.value += 1;
35
+ };
36
+ if (sync) doCollect();
37
+ else {
38
+ promiseIdRef.value += 1;
39
+ const id = promiseIdRef.value;
40
+ Promise.resolve().then(() => {
41
+ if (id === promiseIdRef.value) doCollect();
42
+ });
43
+ }
44
+ }
45
+ function setInstanceRef(item, instance) {
46
+ const key = getKey(item);
47
+ const origin = instanceRef.value.get(key);
48
+ if (origin === instance) return;
49
+ if (instance) {
50
+ instanceRef.value.set(key, instance);
51
+ collectHeight();
52
+ } else instanceRef.value.delete(key);
53
+ if (!origin !== !instance) if (instance) onItemAdd?.(item);
54
+ else onItemRemove?.(item);
55
+ }
56
+ (0, vue.onUnmounted)(() => {
57
+ cancelRaf();
58
+ });
59
+ return [
60
+ setInstanceRef,
61
+ collectHeight,
62
+ heightsRef,
63
+ updatedMark
64
+ ];
65
+ }
66
+ exports.default = useHeights;
@@ -1,5 +1,5 @@
1
- import { GetKey } from '../interface';
2
1
  import { Ref } from 'vue';
2
+ import { GetKey } from '../interface';
3
3
  import { default as CacheMap } from '../utils/CacheMap';
4
4
  export default function useHeights<T>(getKey: GetKey<T>, onItemAdd?: (item: T) => void, onItemRemove?: (item: T) => void): [
5
5
  setInstanceRef: (item: T, instance: HTMLElement | null) => void,
@@ -1,43 +1,64 @@
1
- import { ref as u, onUnmounted as w } from "vue";
2
- import B from "../utils/CacheMap.js";
3
- function p(r) {
4
- const a = parseFloat(r);
5
- return isNaN(a) ? 0 : a;
1
+ import CacheMap_default from "../utils/CacheMap.js";
2
+ import { onUnmounted, reactive, ref } from "vue";
3
+ function parseNumber(value) {
4
+ const num = parseFloat(value);
5
+ return isNaN(num) ? 0 : num;
6
6
  }
7
- function T(r, a, d) {
8
- const l = u(0), s = u(/* @__PURE__ */ new Map()), i = u(new B()), f = u(0);
9
- function c() {
10
- f.value += 1;
11
- }
12
- function g(n = !1) {
13
- c();
14
- const e = () => {
15
- let t = !1;
16
- s.value.forEach((o, m) => {
17
- if (o && o.offsetParent) {
18
- const { offsetHeight: N } = o, { marginTop: R, marginBottom: H } = getComputedStyle(o), C = p(R), M = p(H), v = N + C + M;
19
- i.value.get(m) !== v && (i.value.set(m, v), t = !0);
20
- }
21
- }), t && (l.value += 1);
22
- };
23
- if (n)
24
- e();
25
- else {
26
- f.value += 1;
27
- const t = f.value;
28
- Promise.resolve().then(() => {
29
- t === f.value && e();
30
- });
31
- }
32
- }
33
- function h(n, e) {
34
- const t = r(n), o = s.value.get(t);
35
- o !== e && (e ? (s.value.set(t, e), g()) : s.value.delete(t), !o != !e && (e ? a?.(n) : d?.(n)));
36
- }
37
- return w(() => {
38
- c();
39
- }), [h, g, i.value, l];
7
+ function useHeights(getKey, onItemAdd, onItemRemove) {
8
+ const updatedMark = ref(0);
9
+ const instanceRef = ref(/* @__PURE__ */ new Map());
10
+ const heightsRef = reactive(new CacheMap_default());
11
+ const promiseIdRef = ref(0);
12
+ function cancelRaf() {
13
+ promiseIdRef.value += 1;
14
+ }
15
+ function collectHeight(sync = false) {
16
+ cancelRaf();
17
+ const doCollect = () => {
18
+ let changed = false;
19
+ instanceRef.value.forEach((element, key) => {
20
+ if (element && element.offsetParent) {
21
+ const { offsetHeight } = element;
22
+ const { marginTop, marginBottom } = getComputedStyle(element);
23
+ const marginTopNum = parseNumber(marginTop);
24
+ const marginBottomNum = parseNumber(marginBottom);
25
+ const totalHeight = offsetHeight + marginTopNum + marginBottomNum;
26
+ if (heightsRef.get(key) !== totalHeight) {
27
+ heightsRef.set(key, totalHeight);
28
+ changed = true;
29
+ }
30
+ }
31
+ });
32
+ if (changed) updatedMark.value += 1;
33
+ };
34
+ if (sync) doCollect();
35
+ else {
36
+ promiseIdRef.value += 1;
37
+ const id = promiseIdRef.value;
38
+ Promise.resolve().then(() => {
39
+ if (id === promiseIdRef.value) doCollect();
40
+ });
41
+ }
42
+ }
43
+ function setInstanceRef(item, instance) {
44
+ const key = getKey(item);
45
+ const origin = instanceRef.value.get(key);
46
+ if (origin === instance) return;
47
+ if (instance) {
48
+ instanceRef.value.set(key, instance);
49
+ collectHeight();
50
+ } else instanceRef.value.delete(key);
51
+ if (!origin !== !instance) if (instance) onItemAdd?.(item);
52
+ else onItemRemove?.(item);
53
+ }
54
+ onUnmounted(() => {
55
+ cancelRaf();
56
+ });
57
+ return [
58
+ setInstanceRef,
59
+ collectHeight,
60
+ heightsRef,
61
+ updatedMark
62
+ ];
40
63
  }
41
- export {
42
- T as default
43
- };
64
+ export { useHeights as default };
@@ -1 +1,82 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const s=require("vue"),L=14/15;function X(S,b,M){const u=s.ref(!1),v=s.ref(0),f=s.ref(0);let o=null,r=null,t=null,c;const m=e=>{if(u.value){const n=Math.ceil(e.touches[0].pageX),d=Math.ceil(e.touches[0].pageY);let l=v.value-n,i=f.value-d;const a=Math.abs(l)>Math.abs(i);a?v.value=n:f.value=d;const g=M(a,a?l:i,!1,e);g&&e.preventDefault(),t&&clearInterval(t),g&&(t=setInterval(()=>{a?l*=L:i*=L;const T=Math.floor(a?l:i);(!M(a,T,!0)||Math.abs(T)<=.1)&&t&&clearInterval(t)},16))}},p=()=>{u.value=!1,c()},E=e=>{c(),e.touches.length===1&&!u.value&&(u.value=!0,v.value=Math.ceil(e.touches[0].pageX),f.value=Math.ceil(e.touches[0].pageY),o=e.target,o.addEventListener("touchmove",m,{passive:!1}),o.addEventListener("touchend",p,{passive:!0}))};c=()=>{o&&(o.removeEventListener("touchmove",m),o.removeEventListener("touchend",p),o=null)};const I=()=>{r&&(r.removeEventListener("touchstart",E),r=null)},h=()=>{I(),c(),t&&(clearInterval(t),t=null)};s.onUnmounted(h),s.watch([S,b],([e,n],d,l)=>{e&&n?(r=n,n.addEventListener("touchstart",E,{passive:!0}),l(()=>{h()})):h()},{immediate:!0})}exports.default=X;
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ const require_rolldown_runtime = require("../_virtual/rolldown_runtime.cjs");
3
+ let vue = require("vue");
4
+ var SMOOTH_PTG = 14 / 15;
5
+ function useMobileTouchMove(inVirtual, listRef, callback) {
6
+ const touchedRef = (0, vue.ref)(false);
7
+ const touchXRef = (0, vue.ref)(0);
8
+ const touchYRef = (0, vue.ref)(0);
9
+ let elementRef = null;
10
+ let touchStartElement = null;
11
+ let intervalId = null;
12
+ let cleanUpEvents;
13
+ const onTouchMove = (e) => {
14
+ if (touchedRef.value) {
15
+ const currentX = Math.ceil(e.touches[0].pageX);
16
+ const currentY = Math.ceil(e.touches[0].pageY);
17
+ let offsetX = touchXRef.value - currentX;
18
+ let offsetY = touchYRef.value - currentY;
19
+ const isHorizontal = Math.abs(offsetX) > Math.abs(offsetY);
20
+ if (isHorizontal) touchXRef.value = currentX;
21
+ else touchYRef.value = currentY;
22
+ const scrollHandled = callback(isHorizontal, isHorizontal ? offsetX : offsetY, false, e);
23
+ if (scrollHandled) e.preventDefault();
24
+ if (intervalId) clearInterval(intervalId);
25
+ if (scrollHandled) intervalId = setInterval(() => {
26
+ if (isHorizontal) offsetX *= SMOOTH_PTG;
27
+ else offsetY *= SMOOTH_PTG;
28
+ const offset = Math.floor(isHorizontal ? offsetX : offsetY);
29
+ if (!callback(isHorizontal, offset, true) || Math.abs(offset) <= .1) {
30
+ if (intervalId) clearInterval(intervalId);
31
+ }
32
+ }, 16);
33
+ }
34
+ };
35
+ const onTouchEnd = () => {
36
+ touchedRef.value = false;
37
+ cleanUpEvents();
38
+ };
39
+ const onTouchStart = (e) => {
40
+ cleanUpEvents();
41
+ if (e.touches.length === 1 && !touchedRef.value) {
42
+ touchedRef.value = true;
43
+ touchXRef.value = Math.ceil(e.touches[0].pageX);
44
+ touchYRef.value = Math.ceil(e.touches[0].pageY);
45
+ elementRef = e.target;
46
+ elementRef.addEventListener("touchmove", onTouchMove, { passive: false });
47
+ elementRef.addEventListener("touchend", onTouchEnd, { passive: true });
48
+ }
49
+ };
50
+ cleanUpEvents = () => {
51
+ if (elementRef) {
52
+ elementRef.removeEventListener("touchmove", onTouchMove);
53
+ elementRef.removeEventListener("touchend", onTouchEnd);
54
+ elementRef = null;
55
+ }
56
+ };
57
+ const removeTouchStartListener = () => {
58
+ if (touchStartElement) {
59
+ touchStartElement.removeEventListener("touchstart", onTouchStart);
60
+ touchStartElement = null;
61
+ }
62
+ };
63
+ const teardown = () => {
64
+ removeTouchStartListener();
65
+ cleanUpEvents();
66
+ if (intervalId) {
67
+ clearInterval(intervalId);
68
+ intervalId = null;
69
+ }
70
+ };
71
+ (0, vue.onUnmounted)(teardown);
72
+ (0, vue.watch)([inVirtual, listRef], ([enabled, ele], _prev, onCleanup) => {
73
+ if (enabled && ele) {
74
+ touchStartElement = ele;
75
+ ele.addEventListener("touchstart", onTouchStart, { passive: true });
76
+ onCleanup(() => {
77
+ teardown();
78
+ });
79
+ } else teardown();
80
+ }, { immediate: true });
81
+ }
82
+ exports.default = useMobileTouchMove;
@@ -1,44 +1,80 @@
1
- import { ref as d, onUnmounted as R, watch as S } from "vue";
2
- const g = 14 / 15;
3
- function H(I, X, m) {
4
- const s = d(!1), i = d(0), v = d(0);
5
- let o = null, u = null, t = null, c;
6
- const p = (e) => {
7
- if (s.value) {
8
- const n = Math.ceil(e.touches[0].pageX), h = Math.ceil(e.touches[0].pageY);
9
- let a = i.value - n, r = v.value - h;
10
- const l = Math.abs(a) > Math.abs(r);
11
- l ? i.value = n : v.value = h;
12
- const L = m(l, l ? a : r, !1, e);
13
- L && e.preventDefault(), t && clearInterval(t), L && (t = setInterval(() => {
14
- l ? a *= g : r *= g;
15
- const T = Math.floor(l ? a : r);
16
- (!m(l, T, !0) || Math.abs(T) <= 0.1) && t && clearInterval(t);
17
- }, 16));
18
- }
19
- }, M = () => {
20
- s.value = !1, c();
21
- }, E = (e) => {
22
- c(), e.touches.length === 1 && !s.value && (s.value = !0, i.value = Math.ceil(e.touches[0].pageX), v.value = Math.ceil(e.touches[0].pageY), o = e.target, o.addEventListener("touchmove", p, { passive: !1 }), o.addEventListener("touchend", M, { passive: !0 }));
23
- };
24
- c = () => {
25
- o && (o.removeEventListener("touchmove", p), o.removeEventListener("touchend", M), o = null);
26
- };
27
- const Y = () => {
28
- u && (u.removeEventListener("touchstart", E), u = null);
29
- }, f = () => {
30
- Y(), c(), t && (clearInterval(t), t = null);
31
- };
32
- R(f), S(
33
- [I, X],
34
- ([e, n], h, a) => {
35
- e && n ? (u = n, n.addEventListener("touchstart", E, { passive: !0 }), a(() => {
36
- f();
37
- })) : f();
38
- },
39
- { immediate: !0 }
40
- );
1
+ import { onUnmounted, ref, watch } from "vue";
2
+ var SMOOTH_PTG = 14 / 15;
3
+ function useMobileTouchMove(inVirtual, listRef, callback) {
4
+ const touchedRef = ref(false);
5
+ const touchXRef = ref(0);
6
+ const touchYRef = ref(0);
7
+ let elementRef = null;
8
+ let touchStartElement = null;
9
+ let intervalId = null;
10
+ let cleanUpEvents;
11
+ const onTouchMove = (e) => {
12
+ if (touchedRef.value) {
13
+ const currentX = Math.ceil(e.touches[0].pageX);
14
+ const currentY = Math.ceil(e.touches[0].pageY);
15
+ let offsetX = touchXRef.value - currentX;
16
+ let offsetY = touchYRef.value - currentY;
17
+ const isHorizontal = Math.abs(offsetX) > Math.abs(offsetY);
18
+ if (isHorizontal) touchXRef.value = currentX;
19
+ else touchYRef.value = currentY;
20
+ const scrollHandled = callback(isHorizontal, isHorizontal ? offsetX : offsetY, false, e);
21
+ if (scrollHandled) e.preventDefault();
22
+ if (intervalId) clearInterval(intervalId);
23
+ if (scrollHandled) intervalId = setInterval(() => {
24
+ if (isHorizontal) offsetX *= SMOOTH_PTG;
25
+ else offsetY *= SMOOTH_PTG;
26
+ const offset = Math.floor(isHorizontal ? offsetX : offsetY);
27
+ if (!callback(isHorizontal, offset, true) || Math.abs(offset) <= .1) {
28
+ if (intervalId) clearInterval(intervalId);
29
+ }
30
+ }, 16);
31
+ }
32
+ };
33
+ const onTouchEnd = () => {
34
+ touchedRef.value = false;
35
+ cleanUpEvents();
36
+ };
37
+ const onTouchStart = (e) => {
38
+ cleanUpEvents();
39
+ if (e.touches.length === 1 && !touchedRef.value) {
40
+ touchedRef.value = true;
41
+ touchXRef.value = Math.ceil(e.touches[0].pageX);
42
+ touchYRef.value = Math.ceil(e.touches[0].pageY);
43
+ elementRef = e.target;
44
+ elementRef.addEventListener("touchmove", onTouchMove, { passive: false });
45
+ elementRef.addEventListener("touchend", onTouchEnd, { passive: true });
46
+ }
47
+ };
48
+ cleanUpEvents = () => {
49
+ if (elementRef) {
50
+ elementRef.removeEventListener("touchmove", onTouchMove);
51
+ elementRef.removeEventListener("touchend", onTouchEnd);
52
+ elementRef = null;
53
+ }
54
+ };
55
+ const removeTouchStartListener = () => {
56
+ if (touchStartElement) {
57
+ touchStartElement.removeEventListener("touchstart", onTouchStart);
58
+ touchStartElement = null;
59
+ }
60
+ };
61
+ const teardown = () => {
62
+ removeTouchStartListener();
63
+ cleanUpEvents();
64
+ if (intervalId) {
65
+ clearInterval(intervalId);
66
+ intervalId = null;
67
+ }
68
+ };
69
+ onUnmounted(teardown);
70
+ watch([inVirtual, listRef], ([enabled, ele], _prev, onCleanup) => {
71
+ if (enabled && ele) {
72
+ touchStartElement = ele;
73
+ ele.addEventListener("touchstart", onTouchStart, { passive: true });
74
+ onCleanup(() => {
75
+ teardown();
76
+ });
77
+ } else teardown();
78
+ }, { immediate: true });
41
79
  }
42
- export {
43
- H as default
44
- };
80
+ export { useMobileTouchMove as default };
@@ -1 +1,23 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const s=require("vue");function v(r,i,t,a){const e=s.ref(!1);let l=null;function c(){l&&clearTimeout(l),e.value=!0,l=setTimeout(()=>{e.value=!1},50)}return(f,u,n=!1)=>{const o=f?u<0&&t.value||u>0&&a.value:u<0&&r.value||u>0&&i.value;return n&&o?(l&&clearTimeout(l),e.value=!1):(!o||e.value)&&c(),!e.value&&o}}exports.default=v;
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ const require_rolldown_runtime = require("../_virtual/rolldown_runtime.cjs");
3
+ let vue = require("vue");
4
+ function useOriginScroll(isScrollAtTop, isScrollAtBottom, isScrollAtLeft, isScrollAtRight) {
5
+ const lockRef = (0, vue.ref)(false);
6
+ let lockTimeout = null;
7
+ function lockScroll() {
8
+ if (lockTimeout) clearTimeout(lockTimeout);
9
+ lockRef.value = true;
10
+ lockTimeout = setTimeout(() => {
11
+ lockRef.value = false;
12
+ }, 50);
13
+ }
14
+ return (isHorizontal, delta, smoothOffset = false) => {
15
+ const originScroll = isHorizontal ? delta < 0 && isScrollAtLeft.value || delta > 0 && isScrollAtRight.value : delta < 0 && isScrollAtTop.value || delta > 0 && isScrollAtBottom.value;
16
+ if (smoothOffset && originScroll) {
17
+ if (lockTimeout) clearTimeout(lockTimeout);
18
+ lockRef.value = false;
19
+ } else if (!originScroll || lockRef.value) lockScroll();
20
+ return !lockRef.value && originScroll;
21
+ };
22
+ }
23
+ exports.default = useOriginScroll;