import { defineComponent as Fe, inject as he, ref as pe, reactive as we, toRef as Ae, onBeforeMount as Pe, onMounted as Ye, watchEffect as Le, onBeforeUnmount as Oe, computed as N, watch as b, createElementBlock as be, openBlock as ze, normalizeStyle as Xe, normalizeClass as ve, renderSlot as _e, createCommentVNode as $e } from "vue"; import { isNull as x, nextTickOnce as f, throttle as ye } from "@vexip-ui/utils"; import { LAYOUT_KEY as Ge, EMITTER_KEY as je, useNameHelper as Ke, setTransformRtl as Ve, setTransform as qe, setTopRight as Je, setTopLeft as Qe } from "../helpers/common.mjs"; import { getControlPosition as Re, createCoreData as xe } from "../helpers/draggable.mjs"; import { getColsFromBreakpoint as Ze } from "../helpers/responsive.mjs"; import { getDocumentDir as He } from "../helpers/dom.mjs"; import Se from "interactjs"; const ot = /* @__PURE__ */ Fe({ __name: "grid-item", props: { isDraggable: { type: Boolean, default: void 0 }, isResizable: { type: Boolean, default: void 0 }, isBounded: { type: Boolean, default: void 0 }, static: { type: Boolean, default: !1 }, minH: { default: 1 }, minW: { default: 1 }, maxH: { default: 1 / 0 }, maxW: { default: 1 / 0 }, x: {}, y: {}, w: {}, h: {}, i: {}, dragIgnoreFrom: { default: "a, button" }, dragAllowFrom: { default: void 0 }, resizeIgnoreFrom: { default: "a, button" }, preserveAspectRatio: { type: Boolean, default: !1 }, dragOption: { default: () => ({}) }, resizeOption: { default: () => ({}) } }, emits: ["container-resized", "resize", "resized", "move", "moved"], setup(Me, { expose: We, emit: Be }) { const i = Me, M = Be, l = he(Ge), g = he(je); if (!l) throw new Error("[grid-layout-plus]: missing layout store, GridItem must under a GridLayout."); const d = pe(null), e = we({ cols: 1, containerWidth: 100, rowHeight: 30, margin: [10, 10], maxRows: 1 / 0, draggable: void 0, resizable: void 0, bounded: void 0, transformScale: 1, useCssTransforms: !0, useStyleCursor: !0, isDragging: !1, dragging: { top: -1, left: -1 }, isResizing: !1, resizing: { width: -1, height: -1 }, style: {}, rtl: !1 }); let X = !1, _ = !1, $ = NaN, G = NaN, k = NaN, E = NaN, j = -1, K = -1, V = -1, q = -1, h = i.x, v = i.y, p = i.w, y = i.h; const W = pe(), J = we({ i: Ae(i, "i"), state: e, wrapper: W, calcXY: A }); function Q(t) { Ie(t); } function Z() { de(); } function U(t) { x(i.isDraggable) && (e.draggable = t); } function ee(t) { x(i.isResizable) && (e.resizable = t); } function te(t) { x(i.isBounded) && (e.bounded = t); } function ie(t) { e.transformScale = t; } function ae(t) { e.rowHeight = t; } function re(t) { e.maxRows = t; } function ne() { e.rtl = He() === "rtl", de(); } function oe(t) { e.cols = Math.floor(t); } l.increaseItem(J), Pe(() => { e.rtl = He() === "rtl"; }), Ye(() => { l.responsive && l.lastBreakpoint ? e.cols = Ze(l.lastBreakpoint, l.cols) : e.cols = l.colNum, e.rowHeight = l.rowHeight, e.containerWidth = l.width !== null ? l.width : 100, e.margin = l.margin !== void 0 ? l.margin.map(Number) : [10, 10], e.maxRows = l.maxRows, x(i.isDraggable) ? e.draggable = l.isDraggable : e.draggable = i.isDraggable, x(i.isResizable) ? e.resizable = l.isResizable : e.resizable = i.isResizable, x(i.isBounded) ? e.bounded = l.isBounded : e.bounded = i.isBounded, e.transformScale = l.transformScale, e.useCssTransforms = l.useCssTransforms, e.useStyleCursor = l.useStyleCursor, Le(() => { h = i.x, v = i.y, y = i.h, p = i.w, f(H); }), g.on("updateWidth", Q), g.on("compact", Z), g.on("setDraggable", U), g.on("setResizable", ee), g.on("setBounded", te), g.on("setTransformScale", ie), g.on("setRowHeight", ae), g.on("setMaxRows", re), g.on("directionchange", ne), g.on("setColNum", oe); }), Oe(() => { g.off("updateWidth", Q), g.off("compact", Z), g.off("setDraggable", U), g.off("setResizable", ee), g.off("setBounded", te), g.off("setTransformScale", ie), g.off("setRowHeight", ae), g.off("setMaxRows", re), g.off("directionchange", ne), g.off("setColNum", oe), d.value && (d.value.unset(), d.value = null), l.decreaseItem(J); }), We({ state: e, wrapper: W }); const Ce = typeof navigator < "u" ? navigator.userAgent.toLowerCase().includes("android") : !1, se = N(() => e.resizable && !i.static), m = N(() => l.isMirrored ? !e.rtl : e.rtl), De = N(() => (e.draggable || e.resizable) && !i.static), z = Ke("item"), Ne = N(() => ({ [z.b()]: !0, [z.bm("resizable")]: se.value, [z.bm("static")]: i.static, [z.bm("resizing")]: e.isResizing, [z.bm("dragging")]: e.isDragging, [z.bm("transform")]: e.useCssTransforms, [z.bm("rtl")]: m.value, [z.bm("no-touch")]: Ce && De.value })), T = N(() => [z.be("resizer"), m.value && z.bem("resizer", "rtl")].filter(Boolean)); b( () => i.isDraggable, (t) => { e.draggable = t; } ), b( () => i.static, () => { f(ue), f(S); } ), b( () => e.draggable, () => { f(ue); } ), b( () => i.isResizable, (t) => { e.resizable = t; } ), b( () => i.isBounded, (t) => { e.bounded = t; } ), b( () => e.resizable, () => { f(S); } ), b( () => e.rowHeight, () => { f(H), f(F); } ), b([() => e.cols, () => e.containerWidth], () => { f(S), f(H), f(F); }), b([() => i.minH, () => i.maxH, () => i.minW, () => i.maxW], () => { f(S); }), b(m, () => { f(S), f(H); }), b([() => l.margin, () => l.margin[0], () => l.margin[1]], () => { const t = l.margin; !t || t[0] === e.margin[0] && t[1] === e.margin[1] || (e.margin = t.map(Number), f(H), f(F)); }); function H() { i.x + i.w > e.cols ? (h = 0, p = i.w > e.cols ? e.cols : i.w) : (h = i.x, p = i.w); const t = B(h, v, p, y); e.isDragging && (t.top = e.dragging.top, m.value ? t.right = e.dragging.left : t.left = e.dragging.left), e.isResizing && (t.width = e.resizing.width, t.height = e.resizing.height); let r; e.useCssTransforms ? m.value ? r = Ve(t.top, t.right, t.width, t.height) : r = qe(t.top, t.left, t.width, t.height) : m.value ? r = Je(t.top, t.right, t.width, t.height) : r = Qe(t.top, t.left, t.width, t.height), e.style = r; } function F() { const t = {}; for (const r of ["width", "height"]) { const o = e.style[r].match(/^(\d+)px$/); if (!o) return; t[r] = o[1]; } M("container-resized", i.i, i.h, i.w, t.height, t.width); } function le(t) { if (i.static) return; const r = t.type; if (r === "resizestart" && e.isResizing || r !== "resizestart" && !e.isResizing) return; const s = Re(t); if (x(s)) return; const { x: o, y: c } = s, n = { width: 0, height: 0 }; let a; switch (r) { case "resizestart": { S(), j = p, K = y, a = B(h, v, p, y), n.width = a.width, n.height = a.height, e.resizing = n, e.isResizing = !0; break; } case "resizemove": { !t.edges.right && !t.edges.left && (k = o), !t.edges.top && !t.edges.bottom && (E = c); const u = xe(k, E, o, c); m.value ? n.width = e.resizing.width - u.deltaX / e.transformScale : n.width = e.resizing.width + u.deltaX / e.transformScale, n.height = e.resizing.height + u.deltaY / e.transformScale, e.resizing = n; break; } case "resizeend": { a = B(h, v, p, y), n.width = a.width, n.height = a.height, e.resizing = { width: -1, height: -1 }, e.isResizing = !1; break; } } a = Te(n.height, n.width), a.w < i.minW && (a.w = i.minW), a.w > i.maxW && (a.w = i.maxW), a.h < i.minH && (a.h = i.minH), a.h > i.maxH && (a.h = i.maxH), a.h < 1 && (a.h = 1), a.w < 1 && (a.w = 1), k = o, E = c, (p !== a.w || y !== a.h) && M("resize", i.i, a.h, a.w, n.height, n.width), t.type === "resizeend" && (j !== p || K !== y) && M("resized", i.i, a.h, a.w, n.height, n.width), g.emit("resizeEvent", t.type, i.i, h, v, a.h, a.w); } function ge(t) { if (i.static || e.isResizing) return; const r = t.type; if (r === "dragstart" && e.isDragging || r !== "dragstart" && !e.isDragging) return; const s = Re(t); if (x(s)) return; const { x: o, y: c } = s, n = t.target; if (!n.offsetParent) return; const a = { top: 0, left: 0 }; switch (r) { case "dragstart": { V = h, q = v; const w = n.offsetParent.getBoundingClientRect(), R = n.getBoundingClientRect(), C = R.left / e.transformScale, D = w.left / e.transformScale, P = R.right / e.transformScale, Y = w.right / e.transformScale, L = R.top / e.transformScale, O = w.top / e.transformScale; m.value ? a.left = (P - Y) * -1 : a.left = C - D, a.top = L - O, e.dragging = a, e.isDragging = !0; break; } case "dragmove": { const w = xe($, G, o, c); if (m.value ? a.left = e.dragging.left - w.deltaX / e.transformScale : a.left = e.dragging.left + w.deltaX / e.transformScale, a.top = e.dragging.top + w.deltaY / e.transformScale, e.bounded) { const R = n.offsetParent.clientHeight - ce(i.h, e.rowHeight, e.margin[1]); a.top = fe(a.top, 0, R); const C = I(), D = e.containerWidth - ce(i.w, C, e.margin[0]); a.left = fe(a.left, 0, D); } e.dragging = a; break; } case "dragend": { const w = n.offsetParent.getBoundingClientRect(), R = n.getBoundingClientRect(), C = R.left / e.transformScale, D = w.left / e.transformScale, P = R.right / e.transformScale, Y = w.right / e.transformScale, L = R.top / e.transformScale, O = w.top / e.transformScale; m.value ? a.left = (P - Y) * -1 : a.left = C - D, a.top = L - O, e.dragging = { top: -1, left: -1 }, e.isDragging = !1; break; } } let u; m.value, u = A(a.top, a.left), $ = o, G = c, (h !== u.x || v !== u.y) && M("move", i.i, u.x, u.y), t.type === "dragend" && (V !== h || q !== v) && M("moved", i.i, u.x, u.y), g.emit("dragEvent", t.type, i.i, u.x, u.y, y, p); } function B(t, r, s, o) { const c = I(); let n; return m.value ? n = { right: Math.round(c * t + (t + 1) * e.margin[0]), top: Math.round(e.rowHeight * r + (r + 1) * e.margin[1]), // 0 * Infinity === NaN, which causes problems with resize constraints; // Fix this if it occurs. // Note we do it here rather than later because Math.round(Infinity) causes depot width: s === 1 / 0 ? s : Math.round(c * s + Math.max(0, s - 1) * e.margin[0]), height: o === 1 / 0 ? o : Math.round(e.rowHeight * o + Math.max(0, o - 1) * e.margin[1]) } : n = { left: Math.round(c * t + (t + 1) * e.margin[0]), top: Math.round(e.rowHeight * r + (r + 1) * e.margin[1]), // 0 * Infinity === NaN, which causes problems with resize constraints; // Fix this if it occurs. // Note we do it here rather than later because Math.round(Infinity) causes depot width: s === 1 / 0 ? s : Math.round(c * s + Math.max(0, s - 1) * e.margin[0]), height: o === 1 / 0 ? o : Math.round(e.rowHeight * o + Math.max(0, o - 1) * e.margin[1]) }, n; } function A(t, r) { const s = I(); let o = Math.round((r - e.margin[0]) / (s + e.margin[0])), c = Math.round((t - e.margin[1]) / (e.rowHeight + e.margin[1])); return o = Math.max(Math.min(o, e.cols - p), 0), c = Math.max(Math.min(c, e.maxRows - y), 0), { x: o, y: c }; } function I() { return (e.containerWidth - e.margin[0] * (e.cols + 1)) / e.cols; } function ce(t, r, s) { return Number.isFinite(t) ? Math.round(r * t + Math.max(0, t - 1) * s) : t; } function fe(t, r, s) { return Math.max(Math.min(t, s), r); } function Te(t, r, s = !1) { const o = I(); let c = Math.round((r + e.margin[0]) / (o + e.margin[0])), n = 0; return s ? n = Math.ceil((t + e.margin[1]) / (e.rowHeight + e.margin[1])) : n = Math.round((t + e.margin[1]) / (e.rowHeight + e.margin[1])), c = Math.max(Math.min(c, e.cols - h), 0), n = Math.max(Math.min(n, e.maxRows - v), 0), { w: c, h: n }; } function Ie(t, r) { e.containerWidth = t; } function de() { H(); } function me() { !d.value && W.value && (d.value = Se(W.value), e.useStyleCursor || d.value.styleCursor(!1)); } const ke = ye(ge); function ue() { if (me(), !!d.value) if (e.draggable && !i.static) { const t = { ignoreFrom: i.dragIgnoreFrom, allowFrom: i.dragAllowFrom, ...i.dragOption }; d.value.draggable(t), X || (X = !0, d.value.on("dragstart dragmove dragend", (r) => { r.type === "dragmove" ? ke(r) : ge(r); })); } else d.value.draggable({ enabled: !1 }); } const Ee = ye(le); function S() { if (me(), !!d.value) if (e.resizable && !i.static) { const t = B(0, 0, i.maxW, i.maxH), r = B(0, 0, i.minW, i.minH), s = { edges: { left: m.value ? `.${T.value[0]}` : !1, right: m.value ? !1 : `.${T.value[0]}`, bottom: `.${T.value[0]}`, top: !1 }, ignoreFrom: i.resizeIgnoreFrom, restrictSize: { min: { height: r.height * e.transformScale, width: r.width * e.transformScale }, max: { height: t.height * e.transformScale, width: t.width * e.transformScale } }, ...i.resizeOption }; i.preserveAspectRatio && (s.modifiers = [Se.modifiers.aspectRatio({ ratio: "preserve" })]), d.value.resizable(s), _ || (_ = !0, d.value.on("resizestart resizemove resizeend", (o) => { o.type === "resizemove" ? Ee(o) : le(o); })); } else d.value.resizable({ enabled: !1 }); } return (t, r) => (ze(), be("section", { ref_key: "wrapper", ref: W, class: ve(Ne.value), style: Xe(e.style) }, [ _e(t.$slots, "default"), se.value ? (ze(), be("span", { key: 0, class: ve(T.value) }, null, 2)) : $e("", !0) ], 6)); } }); export { ot as default }; //# sourceMappingURL=grid-item.vue.mjs.map