@dfosco/tiny-canvas 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/tiny-canvas.js +230 -199
  2. package/package.json +1 -1
@@ -1,289 +1,320 @@
1
- import { jsx as W } from "react/jsx-runtime";
2
- import me, { useRef as le, useState as F, useEffect as Q, Children as Ee, useCallback as Ce } from "react";
3
- var ae = { dragStart: !0 }, se = { delay: 0, distance: 3 };
4
- function Ae(e, t = {}) {
5
- let n, o, { bounds: a, axis: l = "both", gpuAcceleration: c = !0, legacyTranslate: p = !1, transform: y, applyUserSelectHack: C = !0, disabled: u = !1, ignoreMultitouch: m = !1, recomputeBounds: S = ae, grid: B, threshold: w = se, position: v, cancel: N, handle: q, defaultClass: d = "neodrag", defaultClassDragging: D = "neodrag-dragging", defaultClassDragged: M = "neodrag-dragged", defaultPosition: be = { x: 0, y: 0 }, onDragStart: Se, onDrag: we, onDragEnd: De } = t, H = !1, T = !1, de = 0, X = !1, O = !1, R = 0, $ = 0, L = 0, k = 0, _ = 0, G = 0, { x: P, y: J } = v ? { x: (v == null ? void 0 : v.x) ?? 0, y: (v == null ? void 0 : v.y) ?? 0 } : be;
6
- te(P, J);
7
- let x, I, Y, K, Z, fe = "", xe = !!v;
8
- S = { ...ae, ...S }, w = { ...se, ...w ?? {} };
1
+ import { jsx as Z } from "react/jsx-runtime";
2
+ import vt, { useRef as W, useState as B, useEffect as ft, Children as Mt, useCallback as Rt } from "react";
3
+ var it = { dragStart: !0 }, ct = { delay: 0, distance: 3 };
4
+ function It(t, e = {}) {
5
+ let n, o, { bounds: a, axis: s = "both", gpuAcceleration: f = !0, legacyTranslate: d = !1, transform: v, applyUserSelectHack: w = !0, disabled: D = !1, ignoreMultitouch: N = !1, recomputeBounds: x = it, grid: I, threshold: y = ct, position: S, cancel: u, handle: m, defaultClass: i = "neodrag", defaultClassDragging: b = "neodrag-dragging", defaultClassDragged: A = "neodrag-dragged", defaultPosition: Et = { x: 0, y: 0 }, onDragStart: xt, onDrag: Nt, onDragEnd: At } = e, L = !1, $ = !1, gt = 0, Y = !1, _ = !1, T = 0, O = 0, q = 0, X = 0, G = 0, K = 0, { x: U, y: J } = S ? { x: (S == null ? void 0 : S.x) ?? 0, y: (S == null ? void 0 : S.y) ?? 0 } : Et;
6
+ nt(U, J);
7
+ let C, P, k, tt, et, pt = "", Ct = !!S;
8
+ x = { ...it, ...x }, y = { ...ct, ...y ?? {} };
9
9
  let j = /* @__PURE__ */ new Set();
10
- function ge(r) {
11
- H && !T && O && X && Z && (T = !0, (function(s) {
12
- re("neodrag:start", Se, s);
13
- })(r), A.add(D), C && (fe = ee.userSelect, ee.userSelect = "none"));
10
+ function ht(r) {
11
+ L && !$ && _ && Y && et && ($ = !0, (function(c) {
12
+ ot("neodrag:start", xt, c);
13
+ })(r), R.add(b), w && (pt = rt.userSelect, rt.userSelect = "none"));
14
14
  }
15
- const ee = document.body.style, A = e.classList;
16
- function te(r = R, s = $) {
17
- if (!y) {
18
- if (p) {
19
- let g = `${+r}px, ${+s}px`;
20
- return z(e, "transform", c ? `translate3d(${g}, 0)` : `translate(${g})`);
15
+ const rt = document.body.style, R = t.classList;
16
+ function nt(r = T, c = O) {
17
+ if (!v) {
18
+ if (d) {
19
+ let p = `${+r}px, ${+c}px`;
20
+ return Q(t, "transform", f ? `translate3d(${p}, 0)` : `translate(${p})`);
21
21
  }
22
- return z(e, "translate", `${+r}px ${+s}px`);
22
+ return Q(t, "translate", `${+r}px ${+c}px`);
23
23
  }
24
- const f = y({ offsetX: r, offsetY: s, rootNode: e });
25
- ie(f) && z(e, "transform", f);
24
+ const g = v({ offsetX: r, offsetY: c, rootNode: t });
25
+ lt(g) && Q(t, "transform", g);
26
26
  }
27
- function re(r, s, f) {
28
- const g = /* @__PURE__ */ (function(h) {
29
- return { offsetX: R, offsetY: $, rootNode: e, currentNode: Z, event: h };
30
- })(f);
31
- e.dispatchEvent(new CustomEvent(r, { detail: g })), s == null || s(g);
27
+ function ot(r, c, g) {
28
+ const p = /* @__PURE__ */ (function(h) {
29
+ return { offsetX: T, offsetY: O, rootNode: t, currentNode: et, event: h };
30
+ })(g);
31
+ t.dispatchEvent(new CustomEvent(r, { detail: p })), c == null || c(p);
32
32
  }
33
- const U = addEventListener, ne = new AbortController(), oe = { signal: ne.signal, capture: !1 };
34
- function pe() {
35
- let r = e.offsetWidth / I.width;
33
+ const F = addEventListener, at = new AbortController(), st = { signal: at.signal, capture: !1 };
34
+ function yt() {
35
+ let r = t.offsetWidth / P.width;
36
36
  return isNaN(r) && (r = 1), r;
37
37
  }
38
- return z(e, "touch-action", "none"), U("pointerdown", ((r) => {
39
- if (u || r.button === 2) return;
40
- if (j.add(r.pointerId), m && j.size > 1) return r.preventDefault();
41
- if (S.dragStart && (x = ce(a, e)), ie(q) && ie(N) && q === N) throw new Error("`handle` selector can't be same as `cancel` selector");
42
- if (A.add(d), Y = (function(i, b) {
43
- if (!i) return [b];
44
- if (ue(i)) return [i];
45
- if (Array.isArray(i)) return i;
46
- const E = b.querySelectorAll(i);
47
- if (E === null) throw new Error("Selector passed for `handle` option should be child of the element on which the action is applied");
48
- return Array.from(E.values());
49
- })(q, e), K = (function(i, b) {
50
- if (!i) return [];
51
- if (ue(i)) return [i];
52
- if (Array.isArray(i)) return i;
53
- const E = b.querySelectorAll(i);
54
- if (E === null) throw new Error("Selector passed for `cancel` option should be child of the element on which the action is applied");
55
- return Array.from(E.values());
56
- })(N, e), n = /(both|x)/.test(l), o = /(both|y)/.test(l), ye(K, Y)) throw new Error("Element being dragged can't be a child of the element on which `cancel` is applied");
57
- const s = r.composedPath()[0];
58
- if (!Y.some(((i) => {
59
- var b;
60
- return i.contains(s) || ((b = i.shadowRoot) == null ? void 0 : b.contains(s));
61
- })) || ye(K, [s])) return;
62
- Z = Y.length === 1 ? e : Y.find(((i) => i.contains(s))), H = !0, de = Date.now(), w.delay || (X = !0), I = e.getBoundingClientRect();
63
- const { clientX: f, clientY: g } = r, h = pe();
64
- n && (L = f - P / h), o && (k = g - J / h), x && (_ = f - I.left, G = g - I.top);
65
- }), oe), U("pointermove", ((r) => {
66
- if (!H || m && j.size > 1) return;
67
- if (!T) {
68
- if (X || Date.now() - de >= w.delay && (X = !0, ge(r)), !O) {
69
- const h = r.clientX - L, i = r.clientY - k;
70
- Math.sqrt(h ** 2 + i ** 2) >= w.distance && (O = !0, ge(r));
38
+ return Q(t, "touch-action", "none"), F("pointerdown", ((r) => {
39
+ if (D || r.button === 2) return;
40
+ if (j.add(r.pointerId), N && j.size > 1) return r.preventDefault();
41
+ if (x.dragStart && (C = ut(a, t)), lt(m) && lt(u) && m === u) throw new Error("`handle` selector can't be same as `cancel` selector");
42
+ if (R.add(i), k = (function(l, E) {
43
+ if (!l) return [E];
44
+ if (dt(l)) return [l];
45
+ if (Array.isArray(l)) return l;
46
+ const M = E.querySelectorAll(l);
47
+ if (M === null) throw new Error("Selector passed for `handle` option should be child of the element on which the action is applied");
48
+ return Array.from(M.values());
49
+ })(m, t), tt = (function(l, E) {
50
+ if (!l) return [];
51
+ if (dt(l)) return [l];
52
+ if (Array.isArray(l)) return l;
53
+ const M = E.querySelectorAll(l);
54
+ if (M === null) throw new Error("Selector passed for `cancel` option should be child of the element on which the action is applied");
55
+ return Array.from(M.values());
56
+ })(u, t), n = /(both|x)/.test(s), o = /(both|y)/.test(s), St(tt, k)) throw new Error("Element being dragged can't be a child of the element on which `cancel` is applied");
57
+ const c = r.composedPath()[0];
58
+ if (!k.some(((l) => {
59
+ var E;
60
+ return l.contains(c) || ((E = l.shadowRoot) == null ? void 0 : E.contains(c));
61
+ })) || St(tt, [c])) return;
62
+ et = k.length === 1 ? t : k.find(((l) => l.contains(c))), L = !0, gt = Date.now(), y.delay || (Y = !0), P = t.getBoundingClientRect();
63
+ const { clientX: g, clientY: p } = r, h = yt();
64
+ n && (q = g - U / h), o && (X = p - J / h), C && (G = g - P.left, K = p - P.top);
65
+ }), st), F("pointermove", ((r) => {
66
+ if (!L || N && j.size > 1) return;
67
+ if (!$) {
68
+ if (Y || Date.now() - gt >= y.delay && (Y = !0, ht(r)), !_) {
69
+ const h = r.clientX - q, l = r.clientY - X;
70
+ Math.sqrt(h ** 2 + l ** 2) >= y.distance && (_ = !0, ht(r));
71
71
  }
72
- if (!T) return;
72
+ if (!$) return;
73
73
  }
74
- S.drag && (x = ce(a, e)), r.preventDefault(), I = e.getBoundingClientRect();
75
- let s = r.clientX, f = r.clientY;
76
- const g = pe();
77
- if (x) {
78
- const h = { left: x.left + _, top: x.top + G, right: x.right + _ - I.width, bottom: x.bottom + G - I.height };
79
- s = he(s, h.left, h.right), f = he(f, h.top, h.bottom);
74
+ x.drag && (C = ut(a, t)), r.preventDefault(), P = t.getBoundingClientRect();
75
+ let c = r.clientX, g = r.clientY;
76
+ const p = yt();
77
+ if (C) {
78
+ const h = { left: C.left + G, top: C.top + K, right: C.right + G - P.width, bottom: C.bottom + K - P.height };
79
+ c = mt(c, h.left, h.right), g = mt(g, h.top, h.bottom);
80
80
  }
81
- if (Array.isArray(B)) {
82
- let [h, i] = B;
81
+ if (Array.isArray(I)) {
82
+ let [h, l] = I;
83
83
  if (isNaN(+h) || h < 0) throw new Error("1st argument of `grid` must be a valid positive number");
84
- if (isNaN(+i) || i < 0) throw new Error("2nd argument of `grid` must be a valid positive number");
85
- let b = s - L, E = f - k;
86
- [b, E] = Ne([h / g, i / g], b, E), s = L + b, f = k + E;
84
+ if (isNaN(+l) || l < 0) throw new Error("2nd argument of `grid` must be a valid positive number");
85
+ let E = c - q, M = g - X;
86
+ [E, M] = Tt([h / p, l / p], E, M), c = q + E, g = X + M;
87
87
  }
88
- n && (R = Math.round((s - L) * g)), o && ($ = Math.round((f - k) * g)), P = R, J = $, re("neodrag", we, r), te();
89
- }), oe), U("pointerup", ((r) => {
90
- j.delete(r.pointerId), H && (T && (U("click", ((s) => s.stopPropagation()), { once: !0, signal: ne.signal, capture: !0 }), S.dragEnd && (x = ce(a, e)), A.remove(D), A.add(M), C && (ee.userSelect = fe), re("neodrag:end", De, r), n && (L = R), o && (k = $)), H = !1, T = !1, X = !1, O = !1);
91
- }), oe), { destroy: () => ne.abort(), update: (r) => {
92
- var f, g;
93
- l = r.axis || "both", u = r.disabled ?? !1, m = r.ignoreMultitouch ?? !1, q = r.handle, a = r.bounds, S = r.recomputeBounds ?? ae, N = r.cancel, C = r.applyUserSelectHack ?? !0, B = r.grid, c = r.gpuAcceleration ?? !0, p = r.legacyTranslate ?? !1, y = r.transform, w = { ...se, ...r.threshold ?? {} };
94
- const s = A.contains(M);
95
- A.remove(d, M), d = r.defaultClass ?? "neodrag", D = r.defaultClassDragging ?? "neodrag-dragging", M = r.defaultClassDragged ?? "neodrag-dragged", A.add(d), s && A.add(M), xe && (P = R = ((f = r.position) == null ? void 0 : f.x) ?? R, J = $ = ((g = r.position) == null ? void 0 : g.y) ?? $, te());
88
+ n && (T = Math.round((c - q) * p)), o && (O = Math.round((g - X) * p)), U = T, J = O, ot("neodrag", Nt, r), nt();
89
+ }), st), F("pointerup", ((r) => {
90
+ j.delete(r.pointerId), L && ($ && (F("click", ((c) => c.stopPropagation()), { once: !0, signal: at.signal, capture: !0 }), x.dragEnd && (C = ut(a, t)), R.remove(b), R.add(A), w && (rt.userSelect = pt), ot("neodrag:end", At, r), n && (q = T), o && (X = O)), L = !1, $ = !1, Y = !1, _ = !1);
91
+ }), st), { destroy: () => at.abort(), update: (r) => {
92
+ var g, p;
93
+ s = r.axis || "both", D = r.disabled ?? !1, N = r.ignoreMultitouch ?? !1, m = r.handle, a = r.bounds, x = r.recomputeBounds ?? it, u = r.cancel, w = r.applyUserSelectHack ?? !0, I = r.grid, f = r.gpuAcceleration ?? !0, d = r.legacyTranslate ?? !1, v = r.transform, y = { ...ct, ...r.threshold ?? {} };
94
+ const c = R.contains(A);
95
+ R.remove(i, A), i = r.defaultClass ?? "neodrag", b = r.defaultClassDragging ?? "neodrag-dragging", A = r.defaultClassDragged ?? "neodrag-dragged", R.add(i), c && R.add(A), Ct && (U = T = ((g = r.position) == null ? void 0 : g.x) ?? T, J = O = ((p = r.position) == null ? void 0 : p.y) ?? O, nt());
96
96
  } };
97
97
  }
98
- var he = (e, t, n) => Math.min(Math.max(e, t), n), ie = (e) => typeof e == "string", Ne = ([e, t], n, o) => {
99
- const a = (l, c) => c === 0 ? 0 : Math.ceil(l / c) * c;
100
- return [a(n, e), a(o, t)];
101
- }, ye = (e, t) => e.some(((n) => t.some(((o) => n.contains(o)))));
102
- function ce(e, t) {
103
- if (e === void 0) return;
104
- if (ue(e)) return e.getBoundingClientRect();
105
- if (typeof e == "object") {
106
- const { top: o = 0, left: a = 0, right: l = 0, bottom: c = 0 } = e;
107
- return { top: o, right: window.innerWidth - l, bottom: window.innerHeight - c, left: a };
98
+ var mt = (t, e, n) => Math.min(Math.max(t, e), n), lt = (t) => typeof t == "string", Tt = ([t, e], n, o) => {
99
+ const a = (s, f) => f === 0 ? 0 : Math.ceil(s / f) * f;
100
+ return [a(n, t), a(o, e)];
101
+ }, St = (t, e) => t.some(((n) => e.some(((o) => n.contains(o)))));
102
+ function ut(t, e) {
103
+ if (t === void 0) return;
104
+ if (dt(t)) return t.getBoundingClientRect();
105
+ if (typeof t == "object") {
106
+ const { top: o = 0, left: a = 0, right: s = 0, bottom: f = 0 } = t;
107
+ return { top: o, right: window.innerWidth - s, bottom: window.innerHeight - f, left: a };
108
108
  }
109
- if (e === "parent") return t.parentNode.getBoundingClientRect();
110
- const n = document.querySelector(e);
109
+ if (t === "parent") return e.parentNode.getBoundingClientRect();
110
+ const n = document.querySelector(t);
111
111
  if (n === null) throw new Error("The selector provided for bound doesn't exists in the document.");
112
112
  return n.getBoundingClientRect();
113
113
  }
114
- var z = (e, t, n) => e.style.setProperty(t, n), ue = (e) => e instanceof HTMLElement;
115
- function V(e) {
116
- return e == null || typeof e == "string" || e instanceof HTMLElement ? e : "current" in e ? e.current : Array.isArray(e) ? e.map(((t) => t instanceof HTMLElement ? t : t.current)) : void 0;
114
+ var Q = (t, e, n) => t.style.setProperty(e, n), dt = (t) => t instanceof HTMLElement;
115
+ function z(t) {
116
+ return t == null || typeof t == "string" || t instanceof HTMLElement ? t : "current" in t ? t.current : Array.isArray(t) ? t.map(((e) => e instanceof HTMLElement ? e : e.current)) : void 0;
117
117
  }
118
- function qe(e, t = {}) {
119
- const n = le(), [o, a] = F(!1), [l, c] = F();
120
- let { onDragStart: p, onDrag: y, onDragEnd: C, handle: u, cancel: m } = t, S = V(u), B = V(m);
121
- function w(d, D) {
122
- c(d), D == null || D(d);
118
+ function Ot(t, e = {}) {
119
+ const n = W(), [o, a] = B(!1), [s, f] = B();
120
+ let { onDragStart: d, onDrag: v, onDragEnd: w, handle: D, cancel: N } = e, x = z(D), I = z(N);
121
+ function y(i, b) {
122
+ f(i), b == null || b(i);
123
123
  }
124
- function v(d) {
125
- a(!0), w(d, p);
124
+ function S(i) {
125
+ a(!0), y(i, d);
126
126
  }
127
- function N(d) {
128
- w(d, y);
127
+ function u(i) {
128
+ y(i, v);
129
129
  }
130
- function q(d) {
131
- a(!1), w(d, C);
130
+ function m(i) {
131
+ a(!1), y(i, w);
132
132
  }
133
- return Q((() => {
133
+ return ft((() => {
134
134
  if (typeof window > "u") return;
135
- const d = e.current;
136
- if (!d) return;
137
- ({ onDragStart: p, onDrag: y, onDragEnd: C } = t);
138
- const { update: D, destroy: M } = Ae(d, { ...t, handle: S, cancel: B, onDragStart: v, onDrag: N, onDragEnd: q });
139
- return n.current = D, M;
140
- }), []), Q((() => {
141
- var d;
142
- (d = n.current) == null || d.call(n, { ...t, handle: V(u), cancel: V(m), onDragStart: v, onDrag: N, onDragEnd: q });
143
- }), [t]), { isDragging: o, dragState: l };
135
+ const i = t.current;
136
+ if (!i) return;
137
+ ({ onDragStart: d, onDrag: v, onDragEnd: w } = e);
138
+ const { update: b, destroy: A } = It(i, { ...e, handle: x, cancel: I, onDragStart: S, onDrag: u, onDragEnd: m });
139
+ return n.current = b, A;
140
+ }), []), ft((() => {
141
+ var i;
142
+ (i = n.current) == null || i.call(n, { ...e, handle: z(D), cancel: z(N), onDragStart: S, onDrag: u, onDragEnd: m });
143
+ }), [e]), { isDragging: o, dragState: s };
144
144
  }
145
- const Me = (e) => {
146
- if (!e) return null;
147
- let t = null;
145
+ const H = "tiny-canvas-queue";
146
+ function wt() {
147
+ const t = localStorage.getItem(H);
148
+ if (!t) return [];
149
+ try {
150
+ const e = JSON.parse(t);
151
+ return Array.isArray(e) ? e : [];
152
+ } catch {
153
+ return localStorage.setItem(H, JSON.stringify([])), [];
154
+ }
155
+ }
156
+ const Pt = (t) => {
157
+ if (!t) return null;
158
+ let e = null;
148
159
  const n = (o) => {
149
160
  if (o.props && o.props.id) {
150
- t = o.props.id;
161
+ e = o.props.id;
151
162
  return;
152
163
  }
153
- o.props && o.props.children && me.Children.forEach(o.props.children, n);
164
+ o.props && o.props.children && vt.Children.forEach(o.props.children, n);
154
165
  };
155
- return n(e), t;
166
+ return n(t), e;
156
167
  };
157
- function Re(e) {
158
- let t = 5381;
159
- for (let n = 0; n < e.length; n++)
160
- t = (t << 5) + t + e.charCodeAt(n) >>> 0;
161
- return t.toString(16).padStart(8, "0");
168
+ function $t(t) {
169
+ let e = 5381;
170
+ for (let n = 0; n < t.length; n++)
171
+ e = (e << 5) + e + t.charCodeAt(n) >>> 0;
172
+ return e.toString(16).padStart(8, "0");
162
173
  }
163
- function ve(e) {
164
- var l;
165
- if (e == null || typeof e == "boolean") return "";
166
- if (typeof e == "string" || typeof e == "number") return "#text";
167
- const t = e.type, n = typeof t == "function" ? t.displayName || t.name || "Anonymous" : typeof t == "string" ? t : "Fragment", o = (l = e.props) == null ? void 0 : l.children;
174
+ function Dt(t) {
175
+ var s;
176
+ if (t == null || typeof t == "boolean") return "";
177
+ if (typeof t == "string" || typeof t == "number") return "#text";
178
+ const e = t.type, n = typeof e == "function" ? e.displayName || e.name || "Anonymous" : typeof e == "string" ? e : "Fragment", o = (s = t.props) == null ? void 0 : s.children;
168
179
  if (o == null) return n;
169
180
  const a = [];
170
- return me.Children.forEach(o, (c) => {
171
- const p = ve(c);
172
- p && a.push(p);
181
+ return vt.Children.forEach(o, (f) => {
182
+ const d = Dt(f);
183
+ d && a.push(d);
173
184
  }), a.length ? `${n}(${a.join(",")})` : n;
174
185
  }
175
- const $e = (e, t) => {
176
- const n = ve(e);
177
- return `tc-${Re(n)}-${t}`;
178
- }, Ie = (e) => {
186
+ const qt = (t, e) => {
187
+ const n = Dt(t);
188
+ return `tc-${$t(n)}-${e}`;
189
+ }, Ut = (t) => {
179
190
  try {
180
- return (JSON.parse(localStorage.getItem("tiny-canvas-queue")) || []).reduce((o, a) => (o[a.id] = { id: a.id, x: a.x, y: a.y }, o), {})[e] || { x: 0, y: 0 };
181
- } catch (t) {
182
- return console.error("Error getting saved coordinates:", t), { x: 0, y: 0 };
191
+ return wt().reduce((o, a) => (o[a.id] = { id: a.id, x: a.x, y: a.y }, o), {})[t] || { x: 0, y: 0 };
192
+ } catch (e) {
193
+ return console.error("Error getting saved coordinates:", e), { x: 0, y: 0 };
183
194
  }
184
- }, Te = () => {
195
+ }, Jt = () => {
185
196
  try {
186
- localStorage.getItem("tiny-canvas-queue") || localStorage.setItem("tiny-canvas-queue", JSON.stringify([]));
187
- } catch (e) {
188
- console.error("LocalStorage is not available:", e);
197
+ localStorage.getItem(H) || localStorage.setItem(H, JSON.stringify([]));
198
+ } catch (t) {
199
+ console.error("LocalStorage is not available:", t);
189
200
  }
190
- }, Le = (e, t, n) => {
201
+ }, Xt = (t, e, n) => {
191
202
  try {
192
- const o = JSON.parse(localStorage.getItem("tiny-canvas-queue")) || [], a = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-"), l = { id: e, x: t, y: n, time: a }, c = o.findIndex((p) => p.id === e);
193
- c >= 0 ? o[c] = l : o.push(l), localStorage.setItem("tiny-canvas-queue", JSON.stringify(o));
203
+ const o = wt(), a = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-"), s = { id: t, x: e, y: n, time: a }, f = o.findIndex((d) => d.id === t);
204
+ f >= 0 ? o[f] = s : o.push(s), localStorage.setItem(H, JSON.stringify(o));
194
205
  } catch (o) {
195
206
  console.error("Error saving drag position:", o);
196
207
  }
197
- }, ke = 250;
198
- function Be({ children: e, dragId: t }) {
199
- const n = le(null), o = le(Ie(t)), [a, l] = F({ x: 0, y: 0 }), [c, p] = F(
200
- () => Math.random() < 0.5 ? -0.5 : 0.5
208
+ }, Lt = 250, bt = 4, Yt = 10, V = 1.5;
209
+ function kt({ children: t, dragId: e, initialPosition: n, onDragEnd: o }) {
210
+ const a = W(null), s = n || { x: 0, y: 0 }, f = W(s), d = W(!1), [v, w] = B(!1), [D, N] = B(s), [x, I] = B(
211
+ () => Math.random() < 0.5 ? -V : V
201
212
  );
202
- Q(() => {
203
- const u = n.current, m = o.current;
204
- if (u && t && m && (m.x !== 0 || m.y !== 0)) {
213
+ ft(() => {
214
+ const u = a.current;
215
+ if (u && e && (s.x !== 0 || s.y !== 0)) {
205
216
  u.classList.add("tc-on-translation");
206
- const S = setTimeout(() => {
217
+ const m = setTimeout(() => {
207
218
  u.classList.remove("tc-on-translation");
208
- }, ke * 4);
219
+ }, Lt * 4);
209
220
  return () => {
210
- clearTimeout(S);
221
+ clearTimeout(m);
211
222
  };
212
223
  }
213
- }, [t]), Q(() => {
214
- Te();
215
- const u = o.current;
216
- n.current && u && l({ x: u.x, y: u.y });
217
- }, []);
218
- const { isDragging: y } = qe(n, {
224
+ }, [e, s.x, s.y]);
225
+ const { isDragging: y } = Ot(a, {
219
226
  axis: "both",
220
227
  threshold: { delay: 50, distance: 30 },
221
228
  defaultClass: "tc-drag",
222
229
  defaultClassDragging: "tc-on",
223
230
  defaultClassDragged: "tc-off",
224
231
  applyUserSelectHack: !0,
225
- position: { x: a.x, y: a.y },
226
- onDrag: ({ offsetX: u, offsetY: m }) => l({ x: u, y: m }),
232
+ position: { x: D.x, y: D.y },
233
+ onDragStart: () => {
234
+ f.current = D, d.current = !1, w(!1);
235
+ },
236
+ onDrag: ({ offsetX: u, offsetY: m }) => {
237
+ const i = u - f.current.x, b = m - f.current.y, A = Math.hypot(i, b);
238
+ !d.current && Math.hypot(i, b) >= bt && (d.current = !0), !v && A >= Yt && w(!0), N({ x: u, y: m });
239
+ },
227
240
  onDragEnd: (u) => {
228
- l({ x: u.offsetX, y: u.offsetY }), p(Math.random() < 0.5 ? -0.5 : 0.5), t !== null && Le(t, u.offsetX, u.offsetY);
241
+ N({ x: u.offsetX, y: u.offsetY }), I(Math.random() < 0.5 ? -V : V), w(!1);
242
+ const m = u.offsetX - f.current.x, i = u.offsetY - f.current.y;
243
+ (d.current || Math.hypot(m, i) >= bt) && (e && Xt(e, u.offsetX, u.offsetY), o == null || o(e, { x: u.offsetX, y: u.offsetY }));
229
244
  }
230
- }), C = y ? `${c}deg` : "0deg";
231
- return /* @__PURE__ */ W(
245
+ }), S = y && v ? `${x}deg` : "0deg";
246
+ return /* @__PURE__ */ Z(
232
247
  "article",
233
248
  {
234
- ref: n,
249
+ ref: a,
235
250
  style: { cursor: y ? "grabbing" : "grab" },
236
- children: /* @__PURE__ */ W(
251
+ children: /* @__PURE__ */ Z(
237
252
  "div",
238
253
  {
239
254
  className: "tc-draggable-inner",
240
255
  style: {
241
- transform: y ? `rotate(${C})` : void 0,
256
+ transform: y ? `rotate(${S})` : void 0,
242
257
  transition: "transform ease-in-out 150ms"
243
258
  },
244
- children: e
259
+ children: t
245
260
  }
246
261
  )
247
262
  }
248
263
  );
249
264
  }
250
- function Ye({
251
- children: e,
252
- dotted: t = !1,
265
+ function Bt(t) {
266
+ var o, a;
267
+ const e = Number((o = t == null ? void 0 : t.props) == null ? void 0 : o["data-tc-x"]), n = Number((a = t == null ? void 0 : t.props) == null ? void 0 : a["data-tc-y"]);
268
+ return Number.isFinite(e) && Number.isFinite(n) ? { x: e, y: n } : null;
269
+ }
270
+ function jt({
271
+ children: t,
272
+ dotted: e = !1,
253
273
  grid: n = !1,
254
274
  gridSize: o,
255
- colorMode: a = "auto"
275
+ colorMode: a = "auto",
276
+ onDragEnd: s
256
277
  }) {
257
- return /* @__PURE__ */ W(
278
+ return /* @__PURE__ */ Z(
258
279
  "main",
259
280
  {
260
281
  className: "tc-canvas",
261
- "data-dotted": t || n || void 0,
282
+ "data-dotted": e || n || void 0,
262
283
  "data-color-mode": a !== "auto" ? a : void 0,
263
- children: Ee.map(e, (c, p) => {
264
- const y = Me(c) ?? $e(c, p);
265
- return /* @__PURE__ */ W(Be, { gridSize: o, dragId: y, children: c }, p);
284
+ children: Mt.map(t, (d, v) => {
285
+ const w = Pt(d) ?? qt(d, v), D = Bt(d);
286
+ return /* @__PURE__ */ Z(
287
+ kt,
288
+ {
289
+ gridSize: o,
290
+ dragId: w,
291
+ initialPosition: D,
292
+ onDragEnd: s,
293
+ children: d
294
+ },
295
+ v
296
+ );
266
297
  })
267
298
  }
268
299
  );
269
300
  }
270
- function Oe({ reload: e = !1 } = {}) {
271
- return Ce(() => {
301
+ function Ft({ reload: t = !1 } = {}) {
302
+ return Rt(() => {
272
303
  try {
273
304
  localStorage.removeItem("tiny-canvas-queue");
274
- } catch (t) {
275
- console.error("Error clearing canvas state:", t);
305
+ } catch (e) {
306
+ console.error("Error clearing canvas state:", e);
276
307
  }
277
- e && window.location.reload();
278
- }, [e]);
308
+ t && window.location.reload();
309
+ }, [t]);
279
310
  }
280
311
  export {
281
- Ye as Canvas,
282
- Be as Draggable,
283
- Me as findDragId,
284
- $e as generateDragId,
285
- Ie as getQueue,
286
- Te as refreshStorage,
287
- Le as saveDrag,
288
- Oe as useResetCanvas
312
+ jt as Canvas,
313
+ kt as Draggable,
314
+ Pt as findDragId,
315
+ qt as generateDragId,
316
+ Ut as getQueue,
317
+ Jt as refreshStorage,
318
+ Xt as saveDrag,
319
+ Ft as useResetCanvas
289
320
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dfosco/tiny-canvas",
3
- "version": "1.1.1",
3
+ "version": "1.2.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "A lightweight React canvas with draggable elements and persistent positions",