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