@aplus-frontend/ui
Version:
77 lines (76 loc) • 2.28 kB
JavaScript
import { ref as n } from "vue";
import { ensureRangeValue as w } from "../utils/index.mjs";
const h = () => {
};
function U({
currentScroll: e = n(0),
trackSpeed: f = n(2),
track: p = n(null),
bar: o = n(null),
tracking: m = n(!1),
type: r = n("vertical"),
barLength: i = n(35),
disabled: D = n(!1),
onDown: A = h,
onMove: B = h,
onUp: C = h,
onScroll: P = h
}) {
let d, s, v, u, M = !0, c = !1;
function x() {
if (!m.value) return;
c = !0;
const t = q(u, e.value);
let a = !1;
if (M) {
if (e.value < u) {
const l = e.value + t * f.value;
e.value = Math.min(l, u), a = !0;
}
} else if (e.value > u) {
const l = e.value - t * f.value;
e.value = Math.max(l, u), a = !0;
}
a && P(e.value), (m.value && M ? e.value < u : e.value > u) ? requestAnimationFrame(x) : c = !1;
}
function X(t) {
if (D.value || t.button !== 0 || (t.stopPropagation(), t.preventDefault(), !p.value || !o.value)) return !1;
document.addEventListener("pointermove", E), document.addEventListener("pointerup", g);
const a = p.value.getBoundingClientRect(), l = o.value.getBoundingClientRect();
let R;
r.value === "vertical" ? (d = a.height, s = l.top - a.top, v = l.top, R = s + t.clientY - v) : (d = a.width, s = l.left - a.left, v = l.left, R = s + t.clientX - v), M = R / d * 100 > i.value;
const Y = (R / d * 100 - (M ? i.value : 0)) / (100 - i.value);
u = w(Y * 100), m.value = !0, A(e.value), x();
}
function E(t) {
t.stopPropagation(), t.preventDefault(), B(e.value);
let a;
r.value === "vertical" ? a = s + t.clientY - v : a = s + t.clientX - v;
const l = (a / d * 100 - (M ? i.value : 0)) / (100 - i.value);
u = w(l * 100), !c && x();
}
function g(t) {
t.preventDefault(), document.removeEventListener("pointermove", E), document.removeEventListener("pointerup", g), m.value = !1, C(e.value);
}
return {
currentScroll: e,
trackSpeed: f,
track: p,
bar: o,
tracking: m,
type: r,
barLength: i,
disabled: D,
handleMouseDown: X
};
}
function q(e, f) {
const p = Math.abs(e - f);
for (let o = 0; o < 5; ++o)
if (p < (o + 1) * 20)
return 1 + 0.25 * o;
return 2;
}
export {
U as useTrack
};