UNPKG

y-design-ssr

Version:

SSR component library of YUI with Vue3

419 lines (418 loc) 13.2 kB
import { ref as D, reactive as w, getCurrentInstance as P, provide as le, isVNode as ce, inject as ue, onUnmounted as fe, computed as b, defineComponent as J, createVNode as E, watch as de, onMounted as ve, nextTick as me, onBeforeUnmount as he } from "vue"; const I = (t, s) => s ? typeof s == "string" ? ` ${t}--${s}` : Array.isArray(s) ? s.reduce((a, n) => a + I(t, n), "") : Object.keys(s).reduce( (a, n) => a + (s[n] ? I(t, n) : ""), "" ) : "", ge = (t) => (s, a) => { let n = s, d = a; return n && typeof n != "string" && (d = n, n = ""), n = n ? `${t}__${n}` : t, `${n}${I(n, d)}`; }, ye = () => (t, s) => s ? `${I(`y-${t}`, s)}` : `y-${t}`, we = { "pull-refresh": { pulling: "下拉刷新...", loosing: "释放刷新...", loading: "数据加载中...", success: "数据已更新", failed: "数据跟新失败,请稍后再试" }, "form-item": { validateMessage: "请输入正确内容" } }; D("zh-CN"); w({ "zh-CN": we }); const Q = (t) => { const s = `y-${t}`; return [s, ge(s), ye()]; }; var R = /* @__PURE__ */ ((t) => (t.left = "left", t.top = "top", t.bottom = "bottom", t.right = "right", t))(R || {}), T = /* @__PURE__ */ ((t) => (t.start = "start", t.center = "center", t.end = "end", t))(T || {}); const q = (t, s) => typeof t == "string" && t.includes("%") && t.includes("%") ? s * Number(t.replace(/%/g, "")) / 100 : Number(t), be = (t) => { const s = [], a = (n) => { Array.isArray(n) && n.forEach((d) => { var c; ce(d) && (s.push(d), (c = d.component) != null && c.subTree && a(d.component.subTree.children), d.children && a(d.children)); }); }; return a(t), s; }, pe = (t, s) => { const a = be(s.subTree.children); t.sort((n, d) => a.indexOf(n.vnode) - a.indexOf(d.vnode)); }, Ee = (t) => { const s = P(), a = w([]); return { children: a, initProvide: (d) => { le(t, { addChild: (r) => { r.proxy && (a.push(r), s && pe(a, s)); }, removeChild: (r) => { const l = a.indexOf(r); a.splice(l, 1); }, children: a, ...d }); } }; }, ze = (t) => { const s = ue(t, null), a = P(); if (s && a) { const { children: n, addChild: d, removeChild: c } = s; return d(a), fe(() => c(a)), { index: b(() => n.indexOf(a)), parent: s }; } return { parent: null, index: D(-1) }; }, [Ne, Se] = Q("swipe-item"), F = /* @__PURE__ */ J({ name: Ne, props: { clonenNode: { type: Object, default: null }, index: { type: Number, default: -1 } }, setup(t, { slots: s }) { const a = P(), { parent: n } = ze(ee); !t.clonenNode && a && (n == null || n.children.push(a)); const d = b(() => t.clonenNode ? t.index : n == null ? void 0 : n.children.findIndex((u) => u.proxy === (a == null ? void 0 : a.proxy))), c = b(() => { const u = `${(n == null ? void 0 : n.itemDetail.size) || 0}px`; let r = "auto"; const l = `${(n == null ? void 0 : n.itemDetail.space) || 0}px`; return n != null && n.props.autoHeight && (n == null ? void 0 : n.activeIndex) !== d.value && (r = "0"), n != null && n.props.vertical ? { height: u, width: r, marginBottom: l } : { width: u, height: r, marginRight: l }; }); return () => { var r, l; const u = ((r = n == null ? void 0 : n.itemShowedList) == null ? void 0 : r.list[d.value || 0]) || !1; return E("div", { class: Se(), style: c.value }, [u ? t.clonenNode || ((l = s.default) == null ? void 0 : l.call(s)) : null]); }; } }), De = { autoplayTime: { type: Number, default: 0 }, duration: { type: Number, default: 300 }, initIndex: { type: Number, default: 0 }, loop: { type: Boolean, default: !0 }, dots: { type: Boolean, default: !0 }, dotsPosition: { type: String, default: null }, dotsColor: { type: String, default: "" }, lazy: { type: Boolean, default: !1 }, vertical: { type: Boolean, default: !1 }, autoHeight: { type: Boolean, default: !1 }, itemSize: { type: [Number, String], default: "" }, itemSpace: { type: [Number, String], default: 0 }, minSwipeDistance: { type: [Number, String], default: "50%" }, touchable: { type: Boolean, default: !0 }, isFollowHand: { type: Boolean, default: !0 }, align: { type: String, default: "center" } }, [Z, O] = Q("swipe"), ee = Z, xe = /* @__PURE__ */ J({ name: Z, components: { YSwipeItem: F }, props: De, setup(t, { slots: s, emit: a, expose: n }) { const { initProvide: d } = Ee(ee), c = w([]), u = D(Number(t.initIndex)), r = w({ // 元素尺寸 size: 0, // 间距 space: 0, // 元素宽度比swipe小,占满整个视窗 isFillViewport: !1 }), l = w({ // 偏移量 offset: 0, // 视窗大小 viewportSize: 0, // 重复节点个数 cloneNodeCount: 0 }), p = D(), $ = D(), V = () => { const e = c.length, i = []; for (let f = 0; f < e; f++) i.push(!t.lazy); return i; }, _ = () => { if (!t.lazy) return; const e = r.size + r.space, i = c.length * e; let f = -(l.offset + o.offset) - l.cloneNodeCount * e; f < 0 && (f += i); const m = f + l.viewportSize; for (let v = 0; v < c.length; v++) if (!x.list[v]) { const h = e * v, g = h + r.size; (h >= f && h < m || g > f && g < m || h < f && g > m) && (x.list[v] = !0); } }, x = w({ list: V() }), A = () => { x.list = V(), _(); }; de(() => [...c], A); const H = (e, i) => { e ? r.size = q(e, i) : r.size = i, r.space = Number(t.itemSpace) || 0, r.isFillViewport = r.size >= i, l.viewportSize = i, l.cloneNodeCount = te(); }, te = () => { if (k.value) { const e = r.size + r.space; if (e === 0) return 0; const i = l.viewportSize * 2 - e, f = Math.ceil(i / e); return Math.min(f, c.length - 1); } return 0; }, z = () => { if (!p.value) return; const { width: e, height: i } = p.value.getBoundingClientRect(); t.vertical ? H(t.itemSize, i) : H(t.itemSize, e), u.value = u.value >= c.length ? c.length - 1 : u.value, u.value < 0 && (u.value = 0), B(u.value), A(), W(); }; ve(() => { if (me(z).catch(() => { }), t.touchable && p.value) { const e = p.value; e.addEventListener("touchstart", C, !1), e.addEventListener("mousedown", C, !1), e.addEventListener("touchmove", L, !1), e.addEventListener("mousemove", L, !1), e.addEventListener("touchend", y, !1), e.addEventListener("mouseup", y, !1), e.addEventListener("mouseleave", y, !1), e.addEventListener("touchcancel", y, !1); } window.addEventListener("resize", z, !1), window.addEventListener("orientationchange", z, !1); }), he(() => { if (K(), t.touchable && p.value) { const e = p.value; e.removeEventListener("touchstart", C, !1), e.removeEventListener("mousedown", C, !1), e.removeEventListener("mousemove", L, !1), e.removeEventListener("touchmove", L, !1), e.removeEventListener("mouseup", y, !1), e.removeEventListener("touchend", y, !1), e.removeEventListener("mouseleave", y, !1), e.removeEventListener("touchcancel", y, !1); } window.removeEventListener("resize", z, !1), window.removeEventListener("orientationchange", z, !1); }); const j = b(() => { let e = 0; switch (t.align) { case T.start: e = 0; break; case T.center: e = (l.viewportSize - r.size) / 2; break; case T.end: e = l.viewportSize - r.size; break; default: e = 0; } return e; }), k = b(() => t.loop && c.length > 1), B = (e) => { const i = r.size + r.space; k.value ? l.offset = -i * (e + l.cloneNodeCount) + j.value : (l.offset = -i * e + j.value, t.align !== "center" && (e === 0 && (l.offset = 0), e === c.length - 1 && (l.offset = -i * e + l.viewportSize - r.size))); }, G = () => { B(u.value), a("afterChange", u.value); }, Y = (e) => (c.length + e) % c.length, M = (e, i = !0) => { u.value = Y(e), B(e), _(), a("change", u.value), i ? (o.transitionEnabled = !0, $.value && $.value.addEventListener("transitionend", () => { o.transitionEnabled = !1, G(); }, { once: !0 })) : G(); }, U = (e = !0) => { M(u.value - 1, e); }, X = (e = !0) => { M(u.value + 1, e); }; let N = null; const K = () => { t.autoplayTime && N && clearInterval(N); }, W = () => { t.autoplayTime && c.length > 1 && (N && clearInterval(N), N = setInterval(() => { X(); }, Number(t.autoplayTime))); }, o = w({ // 拖拽中 isDragging: !1, // 是否首次拖动 isFirstTouch: !0, // 拖拽起始位置X startX: 0, // 拖拽起始位置Y startY: 0, // 拖拽距离 offset: 0, // 开始拖动时间 startTime: /* @__PURE__ */ new Date(), // 是否在执行动画 transitionEnabled: !1, // 当前次拖拽不满足翻页条件 isDissatisfy: !1 }), C = (e) => { if (o.transitionEnabled) return; let i = 0, f = 0; "touches" in e ? (i = e.touches[0].clientX, f = e.touches[0].clientY) : (i = e.clientX, f = e.clientY), o.startX = i, o.startY = f, o.isDragging = !0, o.isFirstTouch = !0, o.startTime = /* @__PURE__ */ new Date(), K(); }, L = (e) => { if (!o.isDragging) return; let i = 0, f = 0; "touches" in e ? (i = e.touches[0].clientX, f = e.touches[0].clientY) : (i = e.clientX, f = e.clientY); const m = i - o.startX, v = f - o.startY; if (o.isFirstTouch && (o.isFirstTouch = !1, Math.abs(m) < Math.abs(v) !== t.vertical)) { o.isDragging = !1; return; } e.preventDefault(), o.offset = t.vertical ? v : m, _(), a("dragging", { percent: o.offset / (r.size + r.space), offset: o.offset }), o.isDissatisfy = !1; }, y = () => { if (!o.isDragging) return; o.isDragging = !1; const i = (/* @__PURE__ */ new Date()).getTime() - o.startTime.getTime(); ie() && (Math.abs(o.offset) > ne.value || Math.abs(o.offset) / i > 0.5) ? (o.offset > 0 ? U() : X(), o.offset = 0, o.isDissatisfy = !1) : (o.offset = 0, o.isDissatisfy = !0), W(); }, ne = b(() => q(t.minSwipeDistance, r.size + r.space)), ie = () => { if (k.value) return !0; const e = o.offset > 0 ? u.value - 1 : u.value + 1; return e >= 0 && e < c.length; }, se = b(() => { const e = o.isDragging && !t.isFollowHand ? l.offset : l.offset + o.offset, i = {}; return t.vertical ? (i.transform = `translate3d(0, ${e}px, 0)`, i.transitionDuration = o.transitionEnabled || o.isDissatisfy ? `${t.duration}ms` : "0ms") : (i.transform = `translate3d(${e}px, 0, 0)`, i.transitionDuration = o.transitionEnabled || o.isDissatisfy ? `${t.duration}ms` : "0ms"), o.isDragging && (i.transition = "none"), t.vertical && (i.flexDirection = "column"), t.autoHeight && (i.display = "block", i.whiteSpace = "nowrap"), i; }), oe = b(() => ["y-swipe__dots", `y-swipe__dots--${t.dotsPosition || (t.vertical ? R.left : R.bottom)}`]); n({ moveTo: M, next: X, prev: U, resize: z }); const ae = w({ children: c, activeIndex: u, props: t, itemDetail: r, itemShowedList: x }); d(ae); const re = () => t.dots ? E("div", { class: oe.value }, [c.map((e, i) => { const f = O("dot", { active: i === u.value }); return E("div", { class: f, style: { backgroundColor: t.dotsColor }, key: i }, null); })]) : null; return () => { var e; return E("div", { class: O(), ref: p }, [E("div", { class: O("track"), style: se.value, ref: $ }, [Array(l.cloneNodeCount).fill("").map((i, f) => { var h, g, S; const m = Y(f - l.cloneNodeCount), v = (S = (h = c[m]) == null ? void 0 : (g = h.slots).default) == null ? void 0 : S.call(g); return v ? E(F, { clonenNode: v, index: m }, null) : null; }), (e = s.default) == null ? void 0 : e.call(s), Array(l.cloneNodeCount).fill("").map((i, f) => { var h, g, S; const m = Y(f), v = (S = (h = c[m]) == null ? void 0 : (g = h.slots).default) == null ? void 0 : S.call(g); return v ? E(F, { clonenNode: v, index: m }, null) : null; })]), s.dots ? s.dots() : re()]); }; } }); function Ce(t) { const s = t; return s.install = (a) => { const { name: n } = t; n && a.component(n, t); }, s; } const Te = Ce(xe); export { Te as default, De as swipeProps };