UNPKG

vue-select-avatar

Version:
671 lines (670 loc) 30.2 kB
var fe = Object.defineProperty; var pe = (a, e, i) => e in a ? fe(a, e, { enumerable: !0, configurable: !0, writable: !0, value: i }) : a[e] = i; var le = (a, e, i) => pe(a, typeof e != "symbol" ? e + "" : e, i); import { defineComponent as ve, reactive as P, ref as p, computed as G, watch as j, onUnmounted as Q, createElementBlock as U, openBlock as H, normalizeStyle as C, normalizeClass as re, createCommentVNode as J, watchEffect as ae, onMounted as ue, unref as f, createElementVNode as W, renderSlot as Z } from "vue"; const Se = "image/jpeg, image/png, image/webp, image/bmp, image/svg+xml, image/avif, image/tiff", we = () => ({ viewportWidth: 0, viewportHeight: 0, viewX: 0, viewY: 0, viewSize: 0, imageX: 0, imageY: 0, imageWidth: 0, imageHeight: 0, imageScale: 1 }); class k extends Error { constructor(i) { super(i); le(this, "code"); this.name = "SelectAvatarError", this.code = i; } } const ye = { UNKNOWN: "未知错误", CANCEL: "取消", NOT_IMAGE_FILE: "非图片文件", IMAGE_FILE_TOO_LARGE: "图片文件过大", IMAGE_TOO_SMALL: "图片尺寸过小", IMAGE_TOO_LARGE: "图片尺寸过大", IMAGE_LOAD_FAILED: "图片加载失败", CANVAS_TO_BLOB_FAILED: "canvas 转 blob 失败", BLOB_TO_BASE64_FAILED: "blob 转 base64 失败", CANVAS_CONTEXT_NOT_DEFINED: "canvas context 未定义", NO_IMAGE_SELECTED: "未选择图片" }, We = (a) => a instanceof k && a.code === "CANCEL", Ue = (a, e = ye) => a instanceof k ? e[a.code] : a instanceof Error ? a.message : e.UNKNOWN, xe = (a) => new Promise((e, i) => { const { accept: t, multiple: n } = a || {}, l = document.createElement("input"); l.type = "file", t && (l.accept = t), n && (l.multiple = n), l.onchange = () => { const v = Array.from(l.files || []); v.length > 0 ? e(v) : i(new k("CANCEL")); }, l.oncancel = () => i(new k("CANCEL")), l.onerror = (v, w, c, s, r) => i(r || new k("UNKNOWN")), l.click(); }), Xe = async (a) => { const { accept: e = Se, maxFileSize: i = 2 * 1024 * 1024, minSize: t, maxSize: n = 5e3, resizeToMax: l = !1, compress: v = !1, quality: w = 0.8 } = a || {}; let [c] = await xe({ accept: e }); if (!c.type.startsWith("image/")) throw new k("NOT_IMAGE_FILE"); if (c.size > i) throw new k("IMAGE_FILE_TOO_LARGE"); let s = await ze(c); if (typeof t == "number" && Math.min(s.width, s.height) < t) throw new k("IMAGE_TOO_SMALL"); if (Math.max(s.width, s.height) > n) { if (!l) throw new k("IMAGE_TOO_LARGE"); const r = n / Math.max(s.width, s.height); s = { width: Math.floor(s.width * r), height: Math.floor(s.height * r) }; } return Ye(c, v) ? c = await te(c, s, "image/png", w) : l ? c = await te(c, s, "image/png") : c.type !== "image/png" && (c = await te(c, s, "image/png")), { file: c, ...s }; }, ze = async (a) => { const e = await ne(URL.createObjectURL(a), !0); return { width: e.width, height: e.height }; }, Ye = (a, e) => typeof e == "number" ? a.size > e : !!e, te = async (a, e, i, t) => { const n = await ne(URL.createObjectURL(a), !0), l = document.createElement("canvas"); l.width = e.width, l.height = e.height; const v = l.getContext("2d"); if (!v) throw new k("CANVAS_CONTEXT_NOT_DEFINED"); v.drawImage(n, 0, 0, e.width, e.height); const w = await me(l, i || a.type, t); return new File([w], a.name, { type: a.type }); }, ne = async (a, e = !1) => new Promise((i, t) => { const n = new Image(); n.onload = () => { e && URL.revokeObjectURL(n.src), i(n); }, n.onerror = () => { e && URL.revokeObjectURL(n.src), t(new k("IMAGE_LOAD_FAILED")); }, n.src = a; }), me = (a, e, i) => new Promise((t, n) => { a.toBlob( (l) => { l ? t(l) : n(new k("CANVAS_TO_BLOB_FAILED")); }, e, i ); }), Ee = (a) => new Promise((e, i) => { const t = new FileReader(); t.onload = () => { typeof t.result == "string" ? e(t.result) : i(new k("BLOB_TO_BASE64_FAILED")); }, t.onerror = (n) => { i(n); }, t.readAsDataURL(a); }), Le = async (a, e, i) => { const { format: t = "file", size: n, type: l = "image/png", quality: v = 1, filename: w, maxSize: c, useOriginSize: s = !0, backgroundColor: r = "#ffffff" } = i || {}; let m = a.url, X = !1; m || (m = URL.createObjectURL(a.file), X = !0); const S = await ne(m); X && URL.revokeObjectURL(m); const E = document.createElement("canvas"), y = E.getContext("2d"); if (!y) throw new k("CANVAS_CONTEXT_NOT_DEFINED"); let u = e.viewSize / e.imageScale; const I = (e.viewX - e.imageX) / e.imageScale, L = (e.viewY - e.imageY) / e.imageScale, z = e.viewSize / e.imageScale; typeof n == "number" ? (u > n || !s) && (u = n) : typeof c == "number" && u > c && (u = c), E.width = u, E.height = u, l === "image/jpeg" && r && (y.fillStyle = r, y.fillRect(0, 0, u, u)), y.drawImage(S, I, L, z, z, 0, 0, u, u); const M = await me(E, l, v); return t === "file" ? new File([M], w || a.file.name, { type: l }) : await Ee(M); }, be = () => "clipPath" in document.createElement("div").style, ge = (a, e, i) => { const t = { x: 0, y: 0 }; switch (i) { case "top-left": t.x += a.x - e.viewX, t.y += a.y - e.viewY; break; case "top-right": t.x += a.x - (e.viewX + e.viewSize), t.y += a.y - e.viewY; break; case "bottom-left": t.x += a.x - e.viewX, t.y += a.y - (e.viewY + e.viewSize); break; case "bottom-right": t.x += a.x - (e.viewX + e.viewSize), t.y += a.y - (e.viewY + e.viewSize); break; } return t; }, ke = ["src"], Ie = /* @__PURE__ */ ve({ __name: "Preview", props: { size: { default: 180 }, viewportRef: {}, round: { type: Boolean }, bg: {} }, setup(a) { const e = a, i = P(we()), t = p(), n = G(() => { var r; return (r = e.viewportRef) == null ? void 0 : r.backing; }), l = G(() => ({ width: `${e.size}px`, height: `${e.size}px`, "--bg": e.bg })), v = G(() => { const r = e.size / (i.viewSize / i.imageScale), m = (i.imageX - i.viewX) / i.imageScale * r, X = (i.imageY - i.viewY) / i.imageScale * r; return { watch: `${i.imageWidth}px`, height: `${i.imageHeight}px`, transform: `translate3d(${m}px, ${X}px, 0px) scale(${r})` }; }), w = (r) => { t.value = r.detail; }, c = (r) => { Object.assign(i, r.detail); }; let s = () => { }; return j( () => e.viewportRef, (r) => { r && (r.elEmitter.addEventListener("broadcast:info", w), r.elEmitter.addEventListener("broadcast:pos", c), s = () => { r.elEmitter.removeEventListener("broadcast:info", w), r.elEmitter.removeEventListener("broadcast:pos", c); }); } ), Q(s), (r, m) => { var X; return H(), U("div", { class: re(["preview", { backing: n.value, round: r.round }]), style: C(l.value) }, [ (X = t.value) != null && X.url ? (H(), U("img", { key: 0, class: "image", src: t.value.url, alt: "image", style: C(v.value) }, null, 12, ke)) : J("", !0) ], 6); }; } }), de = (a, e) => { const i = a.__vccOpts || a; for (const [t, n] of e) i[t] = n; return i; }, He = /* @__PURE__ */ de(Ie, [["__scopeId", "data-v-ea39dbca"]]), Me = (a) => { const { pos: e, showViewLayer: i, props: t } = a, n = P({}), l = P({}), v = P({}), w = P({}), c = P({}), s = P({}); return ae(() => { n.width = `${e.viewportWidth}px`, n.height = `${e.viewportHeight}px`, v.width = `${e.viewSize}px`, v.height = `${e.viewSize}px`, v.transform = `translate3d(${e.viewX}px, ${e.viewY}px, 0px)`, w.width = `${e.imageWidth}px`, w.height = `${e.imageHeight}px`, w.transform = `translate3d(${e.imageX}px, ${e.imageY}px, 0px) scale(${e.imageScale})`, s.width = `${e.viewSize + 2}px`, s.height = `${e.viewSize + 2}px`, s.transform = `translate3d(${e.viewX - 1}px, ${e.viewY - 1}px, 0px)`, t.forceDoubleLayer ? l.clipPath = void 0 : l.clipPath = `polygon(0% 0%, 0% 100%, ${e.viewX}px 100%, ${e.viewX}px ${e.viewY}px, ${e.viewX + e.viewSize}px ${e.viewY}px, ${e.viewX + e.viewSize}px ${e.viewY + e.viewSize}px, ${e.viewX}px ${e.viewY + e.viewSize}px, ${e.viewX}px 100%, 100% 100%, 100% 0%)`, i.value && (c.width = `${e.imageWidth}px`, c.height = `${e.imageHeight}px`, c.transform = `translate3d(${e.imageX - e.viewX}px, ${e.imageY - e.viewY}px, 0px) scale(${e.imageScale})`); }), { viewportStyle: n, maskStyle: l, viewStyle: v, imageStyle: w, innerImageStyle: c, consolesStyle: s }; }, Ae = (a) => { const { imageMoving: e } = a, i = p(!1), t = () => { i.value = !1; }; return j(e, (n) => { n && (i.value = !1); }), { backing: i, handleTransitionEnd: t }; }, ce = (a) => { const e = p(!1), i = (n) => { n.key === a && (e.value = !0); }, t = (n) => { n.key === a && (e.value = !1); }; return ue(() => { window.addEventListener("keydown", i), window.addEventListener("keyup", t); }), Q(() => { window.removeEventListener("keydown", i), window.removeEventListener("keyup", t); }), e; }, ee = (a) => { const { props: e, info: i, pos: t, backing: n } = a; return { checkImageBack: (v = !0) => { if (!i.value || e.fixedImage) return; const w = t.imageWidth * t.imageScale, c = t.imageHeight * t.imageScale; let s = t.imageX; s > t.viewX ? s = t.viewX : s < t.viewX + t.viewSize - w && (s = t.viewX + t.viewSize - w); let r = t.imageY; r > t.viewY ? r = t.viewY : r < t.viewY + t.viewSize - c && (r = t.viewY + t.viewSize - c), (s !== t.imageX || r !== t.imageY) && (t.imageX = s, t.imageY = r, n.value = v); } }; }, oe = (a) => { const { pos: e, info: i } = a; return { checkViewPosition: () => { i.value && (e.viewX < e.imageX && (e.viewX = e.imageX), e.viewY < e.imageY && (e.viewY = e.imageY), e.viewX + e.viewSize > e.imageX + e.imageWidth * e.imageScale && (e.viewX = e.imageX + e.imageWidth * e.imageScale - e.viewSize), e.viewY + e.viewSize > e.imageY + e.imageHeight * e.imageScale && (e.viewY = e.imageY + e.imageHeight * e.imageScale - e.viewSize)); } }; }, he = (a) => { const { pos: e, pointPosition: i, props: t, info: n } = a; return { resizeView: (v) => { switch (i.value) { case "top-left": const w = v.x - e.viewX, c = v.y - e.viewY; let s = w; v.x >= e.viewX + c && v.x <= e.viewX + e.viewSize + c && (s = c), e.viewX += s, e.viewY += s, e.viewSize -= s, e.viewSize < t.minViewSize && (e.viewX += e.viewSize - t.minViewSize, e.viewY += e.viewSize - t.minViewSize, e.viewSize = t.minViewSize), n.value && e.viewX < e.imageX && (e.viewSize -= e.imageX - e.viewX, e.viewY += e.imageX - e.viewX, e.viewX = e.imageX), n.value && e.viewY < e.imageY && (e.viewSize -= e.imageY - e.viewY, e.viewX += e.imageY - e.viewY, e.viewY = e.imageY); break; case "top-right": const r = v.x - (e.viewX + e.viewSize), m = v.y - e.viewY; v.x >= e.viewX && v.x <= e.viewX + e.viewSize - m ? (e.viewY += m, e.viewSize -= m, e.viewSize < t.minViewSize && (e.viewY += e.viewSize - t.minViewSize, e.viewSize = t.minViewSize)) : (e.viewY -= r, e.viewSize += r, e.viewSize < t.minViewSize && (e.viewY += e.viewSize - t.minViewSize, e.viewSize = t.minViewSize)), n.value && e.viewY < e.imageY && (e.viewSize -= e.imageY - e.viewY, e.viewY = e.imageY), n.value && e.viewX + e.viewSize > e.imageX + e.imageWidth * e.imageScale && (e.viewY -= e.imageX + e.imageWidth * e.imageScale - (e.viewX + e.viewSize), e.viewSize = e.imageX + e.imageWidth * e.imageScale - e.viewX); break; case "bottom-left": const X = v.x - e.viewX, S = v.y - (e.viewY + e.viewSize); v.x >= e.viewX - S && v.x <= e.viewX - S + (e.viewSize + S) ? (e.viewX -= S, e.viewSize += S, e.viewSize < t.minViewSize && (e.viewX = e.viewX + e.viewSize - t.minViewSize, e.viewSize = t.minViewSize)) : (e.viewX += X, e.viewSize -= X, e.viewSize < t.minViewSize && (e.viewX = e.viewX + e.viewSize - t.minViewSize, e.viewSize = t.minViewSize)), n.value && e.viewX < e.imageX && (e.viewSize -= e.imageX - e.viewX, e.viewX = e.imageX), n.value && e.viewY + e.viewSize > e.imageY + e.imageHeight * e.imageScale && (e.viewX -= e.imageY + e.imageHeight * e.imageScale - (e.viewY + e.viewSize), e.viewSize = e.imageY + e.imageHeight * e.imageScale - e.viewY); break; case "bottom-right": const E = v.x - (e.viewX + e.viewSize), y = v.y - (e.viewY + e.viewSize); v.x >= e.viewX && v.x <= e.viewX + e.viewSize + y ? e.viewSize += y : e.viewSize += E, e.viewSize < t.minViewSize && (e.viewSize = t.minViewSize), n.value && e.viewX + e.viewSize > e.imageX + e.imageWidth * e.imageScale && (e.viewSize = e.imageX + e.imageWidth * e.imageScale - e.viewX), n.value && e.viewY + e.viewSize > e.imageY + e.imageHeight * e.imageScale && (e.viewSize = e.imageY + e.imageHeight * e.imageScale - e.viewY); break; } } }; }, Te = (a) => { const { imageMoving: e, viewMoving: i, viewResizing: t, info: n, pos: l, props: v, viewportRef: w, pointPosition: c } = a, s = p({ x: 0, y: 0 }), r = p({ x: 0, y: 0 }), m = p({ x: 0, y: 0 }), X = p({ x: 0, y: 0 }), S = p({ x: 0, y: 0 }), { checkImageBack: E } = ee(a), { resizeView: y } = he(a), { checkViewPosition: u } = oe(a), I = (g) => { !n.value || v.fixedImage || (g.preventDefault(), g.stopPropagation(), s.value.x = g.clientX, s.value.y = g.clientY, e.value = !0, document.addEventListener("mousemove", L), document.addEventListener("mouseup", z)); }, L = (g) => { g.preventDefault(), g.stopPropagation(), l.imageX += g.clientX - s.value.x, l.imageY += g.clientY - s.value.y, s.value.x = g.clientX, s.value.y = g.clientY; }, z = () => { e.value = !1, document.removeEventListener("mousemove", L), document.removeEventListener("mouseup", z), E(); }, M = (g, A) => { if (!w.value) return; g.preventDefault(), g.stopPropagation(), t.value = !0, c.value = A; const { left: B, top: D } = w.value.getBoundingClientRect(); X.value.x = B, X.value.y = D, s.value.x = g.clientX - B, s.value.y = g.clientY - D, S.value = ge(s.value, l, A), s.value.x -= S.value.x, s.value.y -= S.value.y, document.addEventListener("mousemove", O), document.addEventListener("mouseup", Y); }, O = (g) => { if (!w.value) return; g.preventDefault(), g.stopPropagation(); const A = { x: g.clientX - X.value.x, y: g.clientY - X.value.y }; A.x -= S.value.x, A.y -= S.value.y, y(A), s.value = A; }, Y = () => { t.value = !1, c.value = void 0, document.removeEventListener("mousemove", O), document.removeEventListener("mouseup", Y); }, F = (g) => { !v.fixedImage || !w.value || (g.preventDefault(), g.stopPropagation(), i.value = !0, r.value.x = g.clientX, r.value.y = g.clientY, m.value.x = l.viewX, m.value.y = l.viewY, document.addEventListener("mousemove", _), document.addEventListener("mouseup", $)); }, _ = (g) => { g.preventDefault(), g.stopPropagation(), l.viewX = g.clientX - r.value.x + m.value.x, l.viewY = g.clientY - r.value.y + m.value.y, u(); }, $ = () => { i.value = !1, document.removeEventListener("mousemove", _), document.removeEventListener("mouseup", $); }; return { handleMouseDown: I, handlePointMouseDown: M, handleViewMouseDown: F }; }, Ve = (a) => { const { props: e, imageMoving: i, pos: t, viewportRef: n, info: l, minImageScale: v, pressCtrl: w, pressShift: c, step: s, ctrlStep: r, shiftStep: m } = a, X = (y = -1) => { let u = s.value; return e.shiftScaleStep > 0 && c.value ? u = m.value : e.ctrlScaleStep > 0 && w.value && (u = r.value), y > 0 && (u = -u), e.wheelReverse && (u = -u), u; }, { checkImageBack: S } = ee(a); return { handleWheel: (y) => { if (!l.value || i.value || e.fixedImage) return; y.preventDefault(), y.stopPropagation(); const I = n.value.getBoundingClientRect(), L = y.clientX - I.left, z = y.clientY - I.top, M = t.imageScale, O = X(y.deltaY), Y = Math.max(v.value, M + O); t.imageX = L - (L - t.imageX) * (Y / M), t.imageY = z - (z - t.imageY) * (Y / M), t.imageScale = Y, S(!1); } }; }, Oe = (a) => { const { info: e, imageMoving: i, pos: t, minImageScale: n, viewportRef: l, pointPosition: v, viewResizing: w, props: c, viewMoving: s } = a, { checkImageBack: r } = ee(a), { resizeView: m } = he(a), { checkViewPosition: X } = oe(a), S = p(), E = p(), y = p(!1), u = p({ x: 0, y: 0 }), I = p({ x: 0, y: 0 }), L = p({ x: 0, y: 0 }), z = p({ x: 0, y: 0 }), M = (o) => { if (!(!e.value || c.fixedImage)) { if (o.preventDefault(), o.stopPropagation(), o.touches.length === 1) { const x = o.touches[0]; S.value = { x: x.clientX, y: x.clientY }, y.value = !1; } else o.touches.length >= 2 && (y.value = !0, u.value = { x: (o.touches[0].clientX + o.touches[1].clientX) / 2, y: (o.touches[0].clientY + o.touches[1].clientY) / 2 }, E.value = Math.hypot( o.touches[0].clientX - o.touches[1].clientX, o.touches[0].clientY - o.touches[1].clientY )); i.value = !0, document.addEventListener("touchmove", O, { passive: !1 }), document.addEventListener("touchend", Y), document.addEventListener("touchcancel", Y); } }, O = (o) => { if (!(!e.value || !i.value)) if (o.preventDefault(), o.stopPropagation(), y.value) { if (o.touches.length >= 2) { const x = Math.hypot( o.touches[0].clientX - o.touches[1].clientX, o.touches[0].clientY - o.touches[1].clientY ), T = { x: (o.touches[0].clientX + o.touches[1].clientX) / 2, y: (o.touches[0].clientY + o.touches[1].clientY) / 2 }, V = T.x - u.value.x, q = T.y - u.value.y; if (t.imageX += V, t.imageY += q, u.value = T, E.value) { const ie = x / E.value, K = Math.max(n.value, t.imageScale * ie), d = l.value.getBoundingClientRect(), h = u.value.x - d.left, se = u.value.y - d.top; t.imageX = h - (h - t.imageX) * (K / t.imageScale), t.imageY = se - (se - t.imageY) * (K / t.imageScale), t.imageScale = K, E.value = x; } } } else { const x = o.touches[0]; if (S.value) { const T = x.clientX - S.value.x, V = x.clientY - S.value.y; t.imageX += T, t.imageY += V, S.value = { x: x.clientX, y: x.clientY }; } } }, Y = (o) => { if (i.value) { if (o.touches.length === 1) { const x = o.touches[0]; S.value = { x: x.clientX, y: x.clientY }, y.value = !1; } o.touches.length > 0 || (S.value = void 0, E.value = void 0, y.value = !1, i.value = !1, r(), document.removeEventListener("touchmove", O), document.removeEventListener("touchend", Y), document.removeEventListener("touchcancel", F)); } }, F = (o) => { Y(o); }, _ = (o, x) => { if (!l.value) return; o.preventDefault(), o.stopPropagation(), w.value = !0, v.value = x; const { left: T, top: V } = l.value.getBoundingClientRect(); I.value.x = T, I.value.y = V, u.value.x = o.touches[0].clientX - T, u.value.y = o.touches[0].clientY - V, z.value = ge(u.value, t, x), u.value.x -= z.value.x, u.value.y -= z.value.y, document.addEventListener("touchmove", $, { passive: !1 }), document.addEventListener("touchend", g), document.addEventListener("touchcancel", A); }, $ = (o) => { if (!l.value) return; o.preventDefault(), o.stopPropagation(); const x = { x: o.touches[0].clientX - I.value.x, y: o.touches[0].clientY - I.value.y }; x.x -= z.value.x, x.y -= z.value.y, m(x), u.value = x; }, g = (o) => { o.touches.length > 0 || (w.value = !1, v.value = void 0, document.removeEventListener("touchmove", $), document.removeEventListener("touchend", g), document.removeEventListener("touchcancel", A)); }, A = (o) => { g(o); }, B = (o) => { !c.fixedImage || !l.value || (o.preventDefault(), o.stopPropagation(), s.value = !0, u.value.x = o.touches[0].clientX, u.value.y = o.touches[0].clientY, L.value.x = t.viewX, L.value.y = t.viewY, document.addEventListener("touchmove", D, { passive: !1 }), document.addEventListener("touchend", N), document.addEventListener("touchcancel", R)); }, D = (o) => { o.preventDefault(), o.stopPropagation(), t.viewX = o.touches[0].clientX - u.value.x + L.value.x, t.viewY = o.touches[0].clientY - u.value.y + L.value.y, X(); }, N = (o) => { o.touches.length > 0 || (s.value = !1, document.removeEventListener("touchmove", D), document.removeEventListener("touchend", N), document.removeEventListener("touchcancel", R)); }, R = (o) => { N(o); }; return { handleTouchStart: M, handlePointTouchStart: _, handleViewTouchStart: B }; }, De = () => { const a = p(); let e; return Q(() => { var i; (i = a.value) != null && i.url && URL.revokeObjectURL(a.value.url); }), ae(() => { var i, t; e && e !== ((i = a.value) == null ? void 0 : i.url) && URL.revokeObjectURL(e), e = (t = a.value) == null ? void 0 : t.url; }), a; }, Pe = (a) => { const { props: e, pos: i, info: t, minImageScale: n, step: l, ctrlStep: v, shiftStep: w, elEmitter: c } = a; let s = !0; j( () => e, () => { i.viewportWidth = e.width ?? e.size ?? 0, i.viewportHeight = e.height ?? e.size ?? 0, (!e.fixedImage || s) && (i.viewSize = e.viewSize ?? 0, i.viewX = (i.viewportWidth - i.viewSize) / 2, i.viewY = (i.viewportHeight - i.viewSize) / 2), s = !1; }, { deep: !0, immediate: !0 } ), j( () => e.fixedImage, () => { t.value && r(t.value); } ); const r = (m) => { t.value = m, t.value.url = URL.createObjectURL(m.file), c.dispatchEvent(new CustomEvent("broadcast:info", { detail: { ...t.value } })), i.imageWidth = m.width, i.imageHeight = m.height, e.fixedImage ? (i.imageScale = Math.abs(m.width - i.viewportWidth) > Math.abs(m.height - i.viewportHeight) ? (i.viewportWidth - e.imagePadding * 2) / m.width : (i.viewportHeight - e.imagePadding * 2) / m.height, i.imageX = (i.viewportWidth - m.width * i.imageScale) / 2, i.imageY = (i.viewportHeight - m.height * i.imageScale) / 2, i.viewSize = Math.min(i.imageWidth, i.imageHeight) * i.imageScale, i.viewX = (i.viewportWidth - i.viewSize) / 2, i.viewY = (i.viewportHeight - i.viewSize) / 2) : (i.imageScale = Math.max(i.viewSize / m.width, i.viewSize / m.height), i.imageX = (i.viewportWidth - m.width * i.imageScale) / 2, i.imageY = (i.viewportHeight - m.height * i.imageScale) / 2, n.value = i.imageScale, l.value = n.value * (e.scaleStep / i.viewSize), v.value = n.value * (e.ctrlScaleStep / i.viewSize), w.value = n.value * (e.shiftScaleStep / i.viewSize)); }; return ae( () => c.dispatchEvent(new CustomEvent("broadcast:pos", { detail: { ...i } })) ), { initPosition: r }; }, Ce = (a) => { const { props: e, pos: i, info: t } = a, { checkImageBack: n } = ee(a), { checkViewPosition: l } = oe(a), v = (c) => { if (e.fixedImage) { if (e.directionKey) switch (c.key) { case "ArrowUp": i.viewY -= 1; break; case "ArrowRight": i.viewX += 1; break; case "ArrowDown": i.viewY += 1; break; case "ArrowLeft": i.viewX -= 1; break; } if (e.wasdKey) switch (c.key) { case "w": i.viewY -= 1; break; case "d": i.viewX += 1; break; case "s": i.viewY += 1; break; case "a": i.viewX -= 1; break; } l(); } else { if (!t.value) return; if (e.directionKey) switch (c.key) { case "ArrowUp": i.imageY -= 1; break; case "ArrowRight": i.imageX += 1; break; case "ArrowDown": i.imageY += 1; break; case "ArrowLeft": i.imageX -= 1; break; } if (e.wasdKey) switch (c.key) { case "w": i.imageY -= 1; break; case "d": i.imageX += 1; break; case "s": i.imageY += 1; break; case "a": i.imageX -= 1; break; } n(); } }; let w; j( [() => e.wasdKey, () => e.directionKey], () => { const c = e.wasdKey || e.directionKey; c !== w && (w = c, c ? document.addEventListener("keydown", v) : document.removeEventListener("keydown", v)); }, { immediate: !0 } ), Q(() => { document.removeEventListener("keydown", v); }); }, $e = ["src"], Re = ["src"], _e = /* @__PURE__ */ ve({ __name: "Viewport", props: { size: { default: 300 }, width: {}, height: {}, info: {}, viewSize: { default: 180 }, grid: { type: Boolean, default: !1 }, scaleStep: { default: 10 }, ctrlScaleStep: { default: 5 }, shiftScaleStep: { default: 1 }, wheelReverse: { type: Boolean, default: !1 }, fixedImage: { type: Boolean, default: !1 }, minViewSize: { default: 10 }, imagePadding: { default: 10 }, directionKey: { type: Boolean, default: !0 }, wasdKey: { type: Boolean, default: !0 }, forceDoubleLayer: { type: Boolean, default: !1 }, showSize: { type: Boolean } }, setup(a, { expose: e }) { const i = a, t = P(we()), n = De(), l = G(() => { var b; return (b = n.value) == null ? void 0 : b.url; }), v = p(!1), w = p(!1), c = p(!1), s = p(), r = p(0), m = p(0), X = p(0), S = p(0), E = ce("Control"), y = ce("Shift"), u = p(be()), I = p(), L = G( () => i.forceDoubleLayer || !!l.value && !u.value ), { backing: z, handleTransitionEnd: M } = Ae({ imageMoving: v }), O = document.createElement("div"), Y = { props: i, pos: t, info: n, imageMoving: v, viewMoving: w, viewResizing: c, viewportRef: s, minImageScale: r, step: m, ctrlStep: X, shiftStep: S, pressCtrl: E, pressShift: y, pointPosition: I, backing: z, elEmitter: O, showViewLayer: L }, { viewportStyle: F, maskStyle: _, viewStyle: $, imageStyle: g, innerImageStyle: A, consolesStyle: B } = Me(Y), { initPosition: D } = Pe(Y), { handleMouseDown: N, handlePointMouseDown: R, handleViewMouseDown: o } = Te(Y), { handleWheel: x } = Ve(Y), { handleTouchStart: T, handlePointTouchStart: V, handleViewTouchStart: q } = Oe(Y); Ce(Y); const ie = async (b) => { const d = await Xe(b); D(d); }, K = async (b) => { if (!n.value) throw new k("NO_IMAGE_SELECTED"); return Le(n.value, t, b); }; return ue(() => { i.info && D(i.info); }), e({ select: ie, cropper: K, initPosition: D, elEmitter: O, backing: z }), (b, d) => (H(), U("div", { class: re(["viewport", [ { grid: b.grid, backing: f(z), "image-moving": v.value, "view-moving": w.value, "view-resizing": c.value, "fixed-image": b.fixedImage }, I.value ]]), style: C(f(F)), ref_key: "viewportRef", ref: s, onMousedown: d[11] || (d[11] = //@ts-ignore (...h) => f(N) && f(N)(...h)), onWheel: d[12] || (d[12] = //@ts-ignore (...h) => f(x) && f(x)(...h)), onTouchstart: d[13] || (d[13] = //@ts-ignore (...h) => f(T) && f(T)(...h)) }, [ l.value ? (H(), U("img", { key: 0, class: "image", src: l.value, alt: "image", style: C(f(g)), onTransitionend: d[0] || (d[0] = //@ts-ignore (...h) => f(M) && f(M)(...h)) }, null, 44, $e)) : J("", !0), W("div", { class: "mask", style: C(f(_)) }, null, 4), L.value ? (H(), U("div", { key: 1, class: "view", style: C(f($)) }, [ W("img", { class: "inner-image", src: l.value, alt: "inner-image", style: C(f(A)) }, null, 12, Re) ], 4)) : J("", !0), b.fixedImage ? (H(), U("div", { key: 2, class: "consoles", style: C(f(B)), onMousedown: d[9] || (d[9] = //@ts-ignore (...h) => f(o) && f(o)(...h)), onTouchstart: d[10] || (d[10] = //@ts-ignore (...h) => f(q) && f(q)(...h)) }, [ W("div", { class: "point top-left", onMousedown: d[1] || (d[1] = (h) => f(R)(h, "top-left")), onTouchstart: d[2] || (d[2] = (h) => f(V)(h, "top-left")) }, [ Z(b.$slots, "point-top-left", {}, void 0, !0) ], 32), W("div", { class: "point top-right", onMousedown: d[3] || (d[3] = (h) => f(R)(h, "top-right")), onTouchstart: d[4] || (d[4] = (h) => f(V)(h, "top-right")) }, [ Z(b.$slots, "point-top-right", {}, void 0, !0) ], 32), W("div", { class: "point bottom-left", onMousedown: d[5] || (d[5] = (h) => f(R)(h, "bottom-left")), onTouchstart: d[6] || (d[6] = (h) => f(V)(h, "bottom-left")) }, [ Z(b.$slots, "point-bottom-left", {}, void 0, !0) ], 32), W("div", { class: "point bottom-right", onMousedown: d[7] || (d[7] = (h) => f(R)(h, "bottom-right")), onTouchstart: d[8] || (d[8] = (h) => f(V)(h, "bottom-right")) }, [ Z(b.$slots, "point-bottom-right", {}, void 0, !0) ], 32) ], 36)) : J("", !0) ], 38)); } }), Fe = /* @__PURE__ */ de(_e, [["__scopeId", "data-v-79ced8d8"]]); export { He as Preview, k as SelectAvatarError, Fe as Viewport, Se as accept, Ee as blobToBase64, me as canvasToBlob, Le as cropper, ye as errorMessageMap, we as getDefaultPosition, Ue as getErrorMessage, ze as getImageDimensions, be as getIsClipPathSupported, ge as getPointOffset, We as isCancelError, ne as loadImage, te as resizeImage, xe as selectFile, Xe as selectImage };