UNPKG

vue-amazing-ui

Version:

An Amazing Vue3 UI Components Library, Using TypeScript.

211 lines (210 loc) 8.45 kB
import { defineComponent as Ce, ref as a, computed as n, onMounted as Pe, createElementBlock as De, openBlock as Ue, normalizeStyle as W, createElementVNode as b, withDirectives as ue, normalizeClass as g, renderSlot as Ne, withModifiers as ne, vShow as se } from "vue"; import { useScroll as Ve, useResizeObserver as Fe, debounce as B } from "../utils/index.js"; const je = /* @__PURE__ */ Ce({ __name: "Scrollbar", props: { contentClass: { default: void 0 }, contentStyle: { default: () => ({}) }, size: { default: 5 }, trigger: { default: "hover" }, autoHide: { type: Boolean, default: !0 }, delay: { default: 500 }, xScrollable: { type: Boolean, default: !1 }, yScrollable: { type: Boolean, default: !0 }, xPlacement: { default: "bottom" }, yPlacement: { default: "right" } }, emits: ["scroll", "scrollend"], setup(ve, { expose: ie, emit: ce }) { const r = ve, o = a(), H = a(), O = a(), j = a(), d = a(!1), p = a(!1), L = a(0), x = a(0), R = a(0), C = a(0), s = a(0), i = a(0), c = a(0), f = a(0), k = a(0), y = a(0), E = a(0), P = a(0), z = a(!1), m = a(!1), h = a(!1), S = a(!1), q = a(0), G = a(0), I = a(0), J = a(0), fe = { width: "fit-content" }, X = a(!1), Y = a(!1), $ = ce, t = n(() => r.trigger === "hover" && r.autoHide), w = n(() => r.trigger === "hover" && !r.autoHide), K = n(() => L.value > R.value), Q = n(() => x.value > C.value), D = n(() => L.value || x.value ? r.yScrollable && K.value || r.xScrollable && Q.value : !0), U = n(() => { if (r.yScrollable && K.value && s.value && c.value && k.value) { const e = Math.min( s.value, k.value * s.value / c.value + 1.5 * r.size ); return Number(e.toFixed(4)); } return 0; }), de = n(() => s.value && c.value && k.value ? E.value / (c.value - s.value) * (k.value - U.value) : 0), pe = n(() => ({ top: `${de.value}px`, height: `${U.value}px` })), N = n(() => { if (r.xScrollable && Q.value && i.value && f.value && y.value) { const e = y.value * i.value / f.value + 1.5 * r.size; return Number(e.toFixed(4)); } return 0; }), me = n(() => i.value && f.value && y.value ? P.value / (f.value - i.value) * (y.value - N.value) : 0), he = n(() => ({ left: `${me.value}px`, width: `${N.value}px` })); Pe(() => { oe(); }); const { left: Z, right: _, top: ee, bottom: le } = Ve(o); Fe([o, H], oe); function ae() { E.value = o.value.scrollTop, P.value = o.value.scrollLeft; } function Se() { L.value = o.value.scrollHeight, x.value = o.value.scrollWidth, R.value = o.value.clientHeight, C.value = o.value.clientWidth, s.value = o.value.offsetHeight, i.value = o.value.offsetWidth, c.value = H.value.offsetHeight, f.value = H.value.offsetWidth, k.value = O.value.offsetHeight, y.value = j.value.offsetWidth; } function oe() { ae(), Se(); } const be = B(ke, 100), ge = B(ye, 100), T = B(Te, 100 + r.delay), M = B(Me, 100 + r.delay); function ke(e, l) { $("scrollend", e, l); } function ye(e, l) { $("scrollend", e, l); } function Te() { t.value && !X.value && (d.value = !1), w.value && !z.value && (d.value = !1); } function Me() { t.value && !Y.value && (p.value = !1), w.value && !z.value && (p.value = !1); } function He(e) { if (Z.value || _.value) { let l = ""; Z.value && (l = "left"), _.value && (l = "right"), $("scroll", e, l), t.value && (p.value = !0, h.value || (ge(e, l), M())); } if (ee.value || le.value) { let l = ""; ee.value && (l = "top"), le.value && (l = "bottom"), $("scroll", e, l), t.value && (d.value = !0, m.value || (be(e, l), T())); } ae(); } function Le() { z.value = !0, h.value || m.value ? S.value = !1 : t.value || (p.value = !0, d.value = !0); } function xe() { z.value = !1, h.value || m.value ? S.value = !0 : t.value || (p.value && M(), d.value && T()); } function Ee() { X.value = !0; } function ze() { X.value = !1, t.value && !m.value && T(); } function Xe() { Y.value = !0; } function Ye() { Y.value = !1, t.value && !h.value && M(); } function $e(e) { m.value = !0, q.value = E.value, I.value = e.clientY, document.addEventListener("mousemove", V), document.addEventListener("mouseup", te), V(e); } function V(e) { const v = (e.clientY - I.value) * (c.value - s.value) / (s.value - U.value), A = c.value - s.value; let u = q.value + v; u = Math.min(A, u), u = Math.max(u, 0), o.value.scrollTop = u; } function te() { m.value = !1, t.value && !X.value ? T() : w.value && S.value && (S.value = !1, T()), document.removeEventListener("mousemove", V), document.removeEventListener("mouseup", te); } function we(e) { h.value = !0, G.value = P.value, J.value = e.clientX, document.addEventListener("mousemove", F), document.addEventListener("mouseup", re), F(e); } function F(e) { const v = (e.clientX - J.value) * (f.value - i.value) / (i.value - N.value), A = f.value - i.value; let u = G.value + v; u = Math.min(A, u), u = Math.max(u, 0), o.value.scrollLeft = u; } function re() { h.value = !1, t.value && !Y.value ? M() : w.value && S.value && (S.value = !1, M()), document.removeEventListener("mousemove", F), document.removeEventListener("mouseup", re); } function We(...e) { o.value?.scrollTo(...e); } function Be(...e) { o.value?.scrollBy(...e); } function Re() { return { scrollTop: E.value, scrollWidth: x.value, scrollHeight: L.value, clientWidth: C.value, clientHeight: R.value }; } return ie({ scrollTo: We, scrollBy: Be, getScrollData: Re }), (e, l) => (Ue(), De("div", { class: "scrollbar-wrap", style: W(` --scrollbar-width: ${e.size}px; --scrollbar-height: ${e.size}px; --scrollbar-border-radius: ${e.size}px; --scrollbar-color: rgba(0, 0, 0, 0.25); --scrollbar-color-hover: rgba(0, 0, 0, 0.4); --scrollbar-rail-horizontal-top: 4px 2px auto 2px; --scrollbar-rail-horizontal-bottom: auto 2px 4px 2px; --scrollbar-rail-vertical-right: 2px 4px 2px auto; --scrollbar-rail-vertical-left: 2px auto 2px 4px; --scrollbar-rail-color: transparent; `), onMouseenter: l[4] || (l[4] = (v) => D.value && e.trigger === "hover" ? Le() : () => !1), onMouseleave: l[5] || (l[5] = (v) => D.value && e.trigger === "hover" ? xe() : () => !1) }, [ b("div", { ref_key: "containerRef", ref: o, class: g(["scrollbar-container", { "container-scroll": D.value }]), onScroll: He }, [ b("div", { ref_key: "contentRef", ref: H, class: g(["scrollbar-content", e.contentClass]), style: W([e.xScrollable ? { ...fe, ...e.contentStyle } : e.contentStyle]) }, [ Ne(e.$slots, "default", {}, void 0, !0) ], 6) ], 34), ue(b("div", { ref_key: "railVerticalRef", ref: O, class: g(["scrollbar-rail rail-vertical", `rail-vertical-${e.yPlacement}`]) }, [ b("div", { class: g(["scrollbar-track", { "track-visible": e.trigger === "none" || d.value }]), style: W(pe.value), onMouseenter: l[0] || (l[0] = (v) => t.value ? Ee() : () => !1), onMouseleave: l[1] || (l[1] = (v) => t.value ? ze() : () => !1), onMousedown: ne($e, ["prevent", "stop"]) }, null, 38) ], 2), [ [se, e.yScrollable] ]), ue(b("div", { ref_key: "railHorizontalRef", ref: j, class: g(["scrollbar-rail rail-horizontal", `rail-horizontal-${e.xPlacement}`]) }, [ b("div", { class: g(["scrollbar-track", { "track-visible": e.trigger === "none" || p.value }]), style: W(he.value), onMouseenter: l[2] || (l[2] = (v) => t.value ? Xe() : () => !1), onMouseleave: l[3] || (l[3] = (v) => t.value ? Ye() : () => !1), onMousedown: ne(we, ["prevent", "stop"]) }, null, 38) ], 2), [ [se, e.xScrollable] ]) ], 36)); } }); export { je as default };