@frigate-nvr/image-annotator 1.0.10 → 1.0.11

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.
@@ -1,70 +1,71 @@
1
- import { jsxs as v, Fragment as oe, jsx as i } from "react/jsx-runtime";
2
- import { useRef as B, useEffect as ne, useMemo as ae, useState as $, Fragment as se } from "react";
1
+ import { jsxs as v, Fragment as oe, jsx as l } from "react/jsx-runtime";
2
+ import { useRef as M, useEffect as re, useMemo as se, useState as Z, Fragment as de } from "react";
3
3
  import { Button as b } from "./Button.js";
4
- import { Crosshairs as de } from "./Crosshairs.js";
5
- import { InfoDialog as ue } from "./InfoDialog.js";
6
- import { LabelDialog as he } from "./LabelDialog.js";
7
- import { VerifyDialog as q } from "./VerifyDialog.js";
8
- import { BoundingBox as te, BoundingBoxType as Z } from "./BoundingBox.js";
9
- import { T as fe, a as me } from "../index.esm-FeyXGhGs.js";
10
- function we(a, x, d) {
11
- var m = this, y = B(null), L = B(0), e = B(null), c = B([]), p = B(), M = B(), C = B(a), k = B(!0);
12
- C.current = a;
13
- var A = typeof window < "u", W = !x && x !== 0 && A;
14
- if (typeof a != "function") throw new TypeError("Expected a function");
4
+ import { Crosshairs as ue } from "./Crosshairs.js";
5
+ import { InfoDialog as he } from "./InfoDialog.js";
6
+ import { LabelDialog as fe } from "./LabelDialog.js";
7
+ import { VerifyDialog as G } from "./VerifyDialog.js";
8
+ import { BoundingBox as ne, BoundingBoxType as J } from "./BoundingBox.js";
9
+ import { T as me, a as we } from "../index.esm-FeyXGhGs.js";
10
+ function ge(o, x, u) {
11
+ var m = this, y = M(null), k = M(0), e = M(null), a = M([]), p = M(), B = M(), C = M(o), N = M(!0);
12
+ C.current = o;
13
+ var A = typeof window < "u", z = !x && x !== 0 && A;
14
+ if (typeof o != "function") throw new TypeError("Expected a function");
15
15
  x = +x || 0;
16
- var X = !!(d = d || {}).leading, E = !("trailing" in d) || !!d.trailing, T = "maxWait" in d, j = "debounceOnServer" in d && !!d.debounceOnServer, Y = T ? Math.max(+d.maxWait || 0, x) : null;
17
- ne(function() {
18
- return k.current = !0, function() {
19
- k.current = !1;
16
+ var j = !!(u = u || {}).leading, V = !("trailing" in u) || !!u.trailing, W = "maxWait" in u, U = "debounceOnServer" in u && !!u.debounceOnServer, Y = W ? Math.max(+u.maxWait || 0, x) : null;
17
+ re(function() {
18
+ return N.current = !0, function() {
19
+ N.current = !1;
20
20
  };
21
21
  }, []);
22
- var V = ae(function() {
23
- var N = function(u) {
24
- var w = c.current, H = p.current;
25
- return c.current = p.current = null, L.current = u, M.current = C.current.apply(H, w);
26
- }, D = function(u, w) {
27
- W && cancelAnimationFrame(e.current), e.current = W ? requestAnimationFrame(u) : setTimeout(u, w);
28
- }, U = function(u) {
29
- if (!k.current) return !1;
30
- var w = u - y.current;
31
- return !y.current || w >= x || w < 0 || T && u - L.current >= Y;
32
- }, _ = function(u) {
33
- return e.current = null, E && c.current ? N(u) : (c.current = p.current = null, M.current);
34
- }, z = function u() {
22
+ var _ = se(function() {
23
+ var F = function(f) {
24
+ var w = a.current, R = p.current;
25
+ return a.current = p.current = null, k.current = f, B.current = C.current.apply(R, w);
26
+ }, L = function(f, w) {
27
+ z && cancelAnimationFrame(e.current), e.current = z ? requestAnimationFrame(f) : setTimeout(f, w);
28
+ }, O = function(f) {
29
+ if (!N.current) return !1;
30
+ var w = f - y.current;
31
+ return !y.current || w >= x || w < 0 || W && f - k.current >= Y;
32
+ }, $ = function(f) {
33
+ return e.current = null, V && a.current ? F(f) : (a.current = p.current = null, B.current);
34
+ }, H = function f() {
35
35
  var w = Date.now();
36
- if (U(w)) return _(w);
37
- if (k.current) {
38
- var H = x - (w - y.current), S = T ? Math.min(H, Y - (w - L.current)) : H;
39
- D(u, S);
36
+ if (O(w)) return $(w);
37
+ if (N.current) {
38
+ var R = x - (w - y.current), S = W ? Math.min(R, Y - (w - k.current)) : R;
39
+ L(f, S);
40
40
  }
41
- }, P = function() {
42
- if (A || j) {
43
- var u = Date.now(), w = U(u);
44
- if (c.current = [].slice.call(arguments), p.current = m, y.current = u, w) {
45
- if (!e.current && k.current) return L.current = y.current, D(z, x), X ? N(y.current) : M.current;
46
- if (T) return D(z, x), N(y.current);
41
+ }, K = function() {
42
+ if (A || U) {
43
+ var f = Date.now(), w = O(f);
44
+ if (a.current = [].slice.call(arguments), p.current = m, y.current = f, w) {
45
+ if (!e.current && N.current) return k.current = y.current, L(H, x), j ? F(y.current) : B.current;
46
+ if (W) return L(H, x), F(y.current);
47
47
  }
48
- return e.current || D(z, x), M.current;
48
+ return e.current || L(H, x), B.current;
49
49
  }
50
50
  };
51
- return P.cancel = function() {
52
- e.current && (W ? cancelAnimationFrame(e.current) : clearTimeout(e.current)), L.current = 0, c.current = y.current = p.current = e.current = null;
53
- }, P.isPending = function() {
51
+ return K.cancel = function() {
52
+ e.current && (z ? cancelAnimationFrame(e.current) : clearTimeout(e.current)), k.current = 0, a.current = y.current = p.current = e.current = null;
53
+ }, K.isPending = function() {
54
54
  return !!e.current;
55
- }, P.flush = function() {
56
- return e.current ? _(Date.now()) : M.current;
57
- }, P;
58
- }, [X, T, x, Y, E, W, A, j]);
59
- return V;
55
+ }, K.flush = function() {
56
+ return e.current ? $(Date.now()) : B.current;
57
+ }, K;
58
+ }, [j, W, x, Y, V, z, A, U]);
59
+ return _;
60
60
  }
61
- const Se = (a) => {
62
- var J;
61
+ const Le = (o) => {
62
+ var ee;
63
63
  const x = [
64
64
  { codes: ["?"], action: "Shortcut help" },
65
65
  { codes: ["w"], action: "Add Box" },
66
66
  { codes: ["d"], action: "Mark Difficult" },
67
67
  { codes: ["s"], action: "Cycle Label" },
68
+ { codes: ["Shift", "s"], action: "Previous Label" },
68
69
  { codes: ["Tab"], action: "Select Next Box" },
69
70
  { codes: ["Del"], action: "Delete Box" },
70
71
  { codes: ["Esc"], action: "Deselect/Cancel" },
@@ -72,7 +73,7 @@ const Se = (a) => {
72
73
  { codes: ["Shift", "← ↑ → ↓"], action: "Resize Box" },
73
74
  { codes: ["f"], action: "Toggle Unselected Boxes" },
74
75
  { codes: ["Spacebar"], action: "Verify and Save" }
75
- ], [d, m] = $([]), [y, L] = $([]), [e, c] = $({
76
+ ], [u, m] = Z([]), [y, k] = Z([]), [e, a] = Z({
76
77
  createMode: !1,
77
78
  drawingMode: !1,
78
79
  showBoxes: !0,
@@ -81,236 +82,236 @@ const Se = (a) => {
81
82
  showVerify: !1,
82
83
  showDelete: !1,
83
84
  showConfirmDeleteFalsePositive: !1,
84
- showTutorial: a.userAnnotationCount === 0,
85
+ showTutorial: o.userAnnotationCount === 0,
85
86
  drawStartX: 0,
86
87
  drawStartY: 0,
87
- selectedLabel: a.labels.find((t) => !(a.verifiedLabels ?? []).includes(t)) ?? a.labels[0],
88
+ selectedLabel: o.labels.find((t) => !(o.verifiedLabels ?? []).includes(t)) ?? o.labels[0],
88
89
  difficult: !1,
89
90
  width: 1,
90
91
  height: 1
91
- }), p = B(null), M = B(null), C = B(null), k = () => {
92
- var g, K, R, F;
93
- const t = ((g = p.current) == null ? void 0 : g.naturalHeight) ?? 1, n = (((K = p.current) == null ? void 0 : K.naturalWidth) ?? 1) / t, o = ((R = M.current) == null ? void 0 : R.clientHeight) ?? 0, l = ((F = M.current) == null ? void 0 : F.clientWidth) ?? 0, h = o - 5, s = l - 5, f = h * n;
94
- f > s ? c({
92
+ }), p = M(null), B = M(null), C = M(null), N = () => {
93
+ var P, X, E, te;
94
+ const t = ((P = p.current) == null ? void 0 : P.naturalHeight) ?? 1, i = (((X = p.current) == null ? void 0 : X.naturalWidth) ?? 1) / t, r = ((E = B.current) == null ? void 0 : E.clientHeight) ?? 0, c = ((te = B.current) == null ? void 0 : te.clientWidth) ?? 0, d = r - 5, s = c - 5, h = d * i;
95
+ let g, D;
96
+ h > s ? (g = s, D = Math.round(s / i)) : (g = h, D = Math.round(h / i)), a({
95
97
  ...e,
96
- width: s,
97
- height: Math.round(s / n)
98
- }) : c({
99
- ...e,
100
- width: f,
101
- height: Math.round(f / n)
98
+ width: g,
99
+ height: D
102
100
  });
103
- }, A = we(() => {
104
- k();
101
+ const I = Math.max(0, s * 0.1 / 2), T = Math.max(0, d * 0.1 / 2);
102
+ return { leftPad: I, topPad: T };
103
+ }, A = ge(() => {
104
+ N();
105
105
  }, 200);
106
- ne(() => {
107
- var t, r;
108
- return window.addEventListener("resize", A), (r = (t = M.current) == null ? void 0 : t.parentElement) == null || r.focus(), () => {
106
+ re(() => {
107
+ var t, n;
108
+ return window.addEventListener("resize", A), (n = (t = B.current) == null ? void 0 : t.parentElement) == null || n.focus(), () => {
109
109
  window.removeEventListener("resize", A);
110
110
  };
111
111
  }, [A]);
112
- const W = (t, r, n) => {
112
+ const z = (t, n, i) => {
113
113
  m(
114
- (o) => o.map((l) => l.id === n ? {
115
- ...l,
116
- x: r.x / e.width,
117
- y: r.y / e.height,
114
+ (r) => r.map((c) => c.id === i ? {
115
+ ...c,
116
+ x: n.x / e.width,
117
+ y: n.y / e.height,
118
118
  w: t.offsetWidth / e.width,
119
119
  h: t.offsetHeight / e.height
120
- } : l)
120
+ } : c)
121
121
  );
122
- }, X = (t, r) => {
122
+ }, j = (t, n) => {
123
123
  m(
124
- (n) => n.map((o) => o.id === r ? {
125
- ...o,
124
+ (i) => i.map((r) => r.id === n ? {
125
+ ...r,
126
126
  x: t.x / e.width,
127
127
  y: t.y / e.height
128
- } : o)
128
+ } : r)
129
129
  );
130
- }, E = (t) => {
131
- var r, n;
130
+ }, V = (t) => {
131
+ var n, i;
132
132
  if (e.createMode) {
133
- const o = ((r = C.current) == null ? void 0 : r.instance.transformState.scale) ?? 1, l = (n = p.current) == null ? void 0 : n.getBoundingClientRect(), h = (t.clientX - ((l == null ? void 0 : l.left) ?? 0)) / o / e.width, s = (t.clientY - ((l == null ? void 0 : l.top) ?? 0)) / o / e.height;
134
- c({
133
+ const r = ((n = C.current) == null ? void 0 : n.instance.transformState.scale) ?? 1, c = (i = p.current) == null ? void 0 : i.getBoundingClientRect(), d = (t.clientX - ((c == null ? void 0 : c.left) ?? 0)) / r / e.width, s = (t.clientY - ((c == null ? void 0 : c.top) ?? 0)) / r / e.height;
134
+ a({
135
135
  ...e,
136
136
  drawingMode: !0,
137
- drawStartX: h,
137
+ drawStartX: d,
138
138
  drawStartY: s,
139
139
  selectedBox: "draft"
140
- }), m((f) => [
141
- ...f,
140
+ }), m((h) => [
141
+ ...h,
142
142
  {
143
143
  id: "draft",
144
- x: h,
144
+ x: d,
145
145
  y: s,
146
146
  w: 0,
147
147
  h: 0
148
148
  }
149
149
  ]);
150
150
  } else
151
- c({ ...e, selectedBox: void 0 });
152
- }, T = (t) => {
151
+ a({ ...e, selectedBox: void 0 });
152
+ }, W = (t) => {
153
153
  if (e.drawingMode) {
154
- const r = Date.now().toString();
155
- c({
154
+ const n = Date.now().toString();
155
+ a({
156
156
  ...e,
157
157
  drawingMode: !1,
158
158
  createMode: !1,
159
- selectedBox: r
159
+ selectedBox: n
160
160
  }), m(
161
- (n) => n.reduce((o, l) => {
162
- var h, s;
163
- if (l.id === "draft") {
164
- const f = ((h = C.current) == null ? void 0 : h.instance.transformState.scale) ?? 1, g = (s = p.current) == null ? void 0 : s.getBoundingClientRect(), K = (t.clientX - ((g == null ? void 0 : g.left) ?? 0)) / f / e.width, R = (t.clientY - ((g == null ? void 0 : g.top) ?? 0)) / f / e.height;
161
+ (i) => i.reduce((r, c) => {
162
+ var d, s;
163
+ if (c.id === "draft") {
164
+ const h = ((d = C.current) == null ? void 0 : d.instance.transformState.scale) ?? 1, g = (s = p.current) == null ? void 0 : s.getBoundingClientRect(), D = (t.clientX - ((g == null ? void 0 : g.left) ?? 0)) / h / e.width, I = (t.clientY - ((g == null ? void 0 : g.top) ?? 0)) / h / e.height;
165
165
  if (Math.min(
166
- Math.abs(e.drawStartX - K),
167
- Math.abs(e.drawStartY - R)
166
+ Math.abs(e.drawStartX - D),
167
+ Math.abs(e.drawStartY - I)
168
168
  ) > 1e-3) {
169
- let F = Math.min(e.drawStartX, K), I = Math.min(e.drawStartY, R), Q = Math.abs(e.drawStartX - K), ee = Math.abs(e.drawStartY - R);
170
- F < 0 && (Q -= Math.abs(F), F = 0), I < 0 && (ee -= Math.abs(I), I = 0), o.push({
171
- ...l,
172
- id: r,
169
+ let T = Math.min(e.drawStartX, D), P = Math.min(e.drawStartY, I), X = Math.abs(e.drawStartX - D), E = Math.abs(e.drawStartY - I);
170
+ T < 0 && (X -= Math.abs(T), T = 0), P < 0 && (E -= Math.abs(P), P = 0), r.push({
171
+ ...c,
172
+ id: n,
173
173
  label: e.selectedLabel,
174
174
  difficult: !1,
175
- x: F,
176
- y: I,
177
- w: Math.min(1 - F, Q),
178
- h: Math.min(1 - I, ee)
175
+ x: T,
176
+ y: P,
177
+ w: Math.min(1 - T, X),
178
+ h: Math.min(1 - P, E)
179
179
  });
180
180
  }
181
181
  } else
182
- o.push(l);
183
- return o;
182
+ r.push(c);
183
+ return r;
184
184
  }, [])
185
185
  );
186
186
  }
187
- }, j = (t) => {
187
+ }, U = (t) => {
188
188
  e.drawingMode && m(
189
- (r) => r.map((n) => {
190
- var o, l;
191
- if (n.id === "draft") {
192
- const h = ((o = C.current) == null ? void 0 : o.instance.transformState.scale) ?? 1, s = (l = p.current) == null ? void 0 : l.getBoundingClientRect(), f = (t.pageX - ((s == null ? void 0 : s.left) ?? 0)) / h / e.width, g = (t.pageY - ((s == null ? void 0 : s.top) ?? 0)) / h / e.height;
189
+ (n) => n.map((i) => {
190
+ var r, c;
191
+ if (i.id === "draft") {
192
+ const d = ((r = C.current) == null ? void 0 : r.instance.transformState.scale) ?? 1, s = (c = p.current) == null ? void 0 : c.getBoundingClientRect(), h = (t.pageX - ((s == null ? void 0 : s.left) ?? 0)) / d / e.width, g = (t.pageY - ((s == null ? void 0 : s.top) ?? 0)) / d / e.height;
193
193
  return {
194
- ...n,
195
- x: Math.min(e.drawStartX, f),
194
+ ...i,
195
+ x: Math.min(e.drawStartX, h),
196
196
  y: Math.min(e.drawStartY, g),
197
- w: Math.abs(e.drawStartX - f),
197
+ w: Math.abs(e.drawStartX - h),
198
198
  h: Math.abs(e.drawStartY - g)
199
199
  };
200
200
  }
201
- return n;
201
+ return i;
202
202
  })
203
203
  );
204
204
  }, Y = () => {
205
- c({ ...e, createMode: !e.createMode });
206
- }, V = (t) => {
207
- const r = d.find((n) => n.id === t);
208
- c({
205
+ a({ ...e, createMode: !e.createMode });
206
+ }, _ = (t) => {
207
+ const n = u.find((i) => i.id === t);
208
+ a({
209
209
  ...e,
210
210
  selectedBox: t,
211
- selectedLabel: (r == null ? void 0 : r.label) ?? e.selectedLabel,
212
- difficult: (r == null ? void 0 : r.difficult) ?? e.difficult
211
+ selectedLabel: (n == null ? void 0 : n.label) ?? e.selectedLabel,
212
+ difficult: (n == null ? void 0 : n.difficult) ?? e.difficult
213
213
  });
214
- }, N = (t, r, n) => {
214
+ }, F = (t, n, i) => {
215
215
  m(
216
- (o) => o.map((l) => l.id === t ? {
217
- ...l,
216
+ (r) => r.map((c) => c.id === t ? {
217
+ ...c,
218
218
  x: Math.min(
219
- 1 - l.w,
220
- Math.max(0, l.x + n / e.width)
219
+ 1 - c.w,
220
+ Math.max(0, c.x + i / e.width)
221
221
  ),
222
222
  y: Math.min(
223
- 1 - l.h,
224
- Math.max(0, l.y + r / e.height)
223
+ 1 - c.h,
224
+ Math.max(0, c.y + n / e.height)
225
225
  )
226
- } : l)
226
+ } : c)
227
227
  );
228
- }, D = (t, r, n) => {
228
+ }, L = (t, n, i) => {
229
229
  m(
230
- (o) => o.map((l) => l.id === t ? {
231
- ...l,
232
- w: Math.min(1 - l.x, l.w + n / e.width),
233
- h: Math.min(1 - l.y, l.h + r / e.height)
234
- } : l)
230
+ (r) => r.map((c) => c.id === t ? {
231
+ ...c,
232
+ w: Math.min(1 - c.x, c.w + i / e.width),
233
+ h: Math.min(1 - c.y, c.h + n / e.height)
234
+ } : c)
235
235
  );
236
- }, U = (t) => {
236
+ }, O = (t) => {
237
237
  m(
238
- (r) => r.map((n) => n.id === t ? {
239
- ...n,
240
- difficult: !n.difficult
241
- } : n)
238
+ (n) => n.map((i) => i.id === t ? {
239
+ ...i,
240
+ difficult: !i.difficult
241
+ } : i)
242
242
  );
243
- }, _ = (t, r = !1) => {
244
- const n = a.labels.findIndex(
243
+ }, $ = (t, n = !1) => {
244
+ const i = o.labels.findIndex(
245
245
  (s) => e.selectedLabel === s
246
- ), o = a.labels.length - 1;
247
- let l = 0;
248
- r ? l = n === 0 ? o : n - 1 : l = n === o ? 0 : n + 1;
249
- const h = a.labels[l];
246
+ ), r = o.labels.length - 1;
247
+ let c = 0;
248
+ n ? c = i === 0 ? r : i - 1 : c = i === r ? 0 : i + 1;
249
+ const d = o.labels[c];
250
250
  m(
251
- (s) => s.map((f) => f.id === t ? {
252
- ...f,
253
- label: h
254
- } : f)
255
- ), c({ ...e, selectedLabel: h });
256
- }, z = (t) => {
257
- m((r) => r.filter((n) => n.id !== t));
258
- }, P = (t) => {
259
- L((r) => r.filter((n) => n.id !== t));
260
- }, u = (t) => {
261
- var r;
262
- return (r = y.find((n) => n.id === t)) == null ? void 0 : r.label;
263
- }, w = (t) => d.find((r) => r.id === t), H = (t) => {
251
+ (s) => s.map((h) => h.id === t ? {
252
+ ...h,
253
+ label: d
254
+ } : h)
255
+ ), a({ ...e, selectedLabel: d });
256
+ }, H = (t) => {
257
+ m((n) => n.filter((i) => i.id !== t));
258
+ }, K = (t) => {
259
+ k((n) => n.filter((i) => i.id !== t));
260
+ }, f = (t) => {
261
+ var n;
262
+ return (n = y.find((i) => i.id === t)) == null ? void 0 : n.label;
263
+ }, w = (t) => u.find((n) => n.id === t), R = (t) => {
264
264
  if (!t)
265
- return d[0].id;
266
- const r = d.findIndex((n) => n.id === t);
267
- return r === d.length - 1 ? d[0].id : d[r + 1].id;
268
- }, S = 5 / (((J = C.current) == null ? void 0 : J.instance.transformState.scale) ?? 1), re = (t) => {
269
- if (t.code === "Escape" && (e.createMode ? c({ ...e, createMode: !1 }) : c({ ...e, selectedBox: void 0 })), t.code === "KeyW" && (e.createMode ? c({ ...e, createMode: !1 }) : c({ ...e, createMode: !0, selectedBox: void 0 })), t.code === "KeyF" && c({ ...e, showBoxes: !e.showBoxes }), t.code === "KeyD" && e.selectedBox && U(e.selectedBox), t.code === "KeyS" && e.selectedBox && _(e.selectedBox, t.shiftKey), t.code === "Delete" && e.selectedBox && (z(e.selectedBox), c({ ...e, selectedBox: void 0 })), t.code === "Tab") {
270
- const r = H(e.selectedBox), n = w(r);
271
- c({
265
+ return u[0].id;
266
+ const n = u.findIndex((i) => i.id === t);
267
+ return n === u.length - 1 ? u[0].id : u[n + 1].id;
268
+ }, S = 5 / (((ee = C.current) == null ? void 0 : ee.instance.transformState.scale) ?? 1), ie = (t) => {
269
+ if (t.code === "Escape" && (e.createMode ? a({ ...e, createMode: !1 }) : a({ ...e, selectedBox: void 0 })), t.code === "KeyW" && (e.createMode ? a({ ...e, createMode: !1 }) : a({ ...e, createMode: !0, selectedBox: void 0 })), t.code === "KeyF" && a({ ...e, showBoxes: !e.showBoxes }), t.code === "KeyD" && e.selectedBox && O(e.selectedBox), t.code === "KeyS" && e.selectedBox && $(e.selectedBox, t.shiftKey), t.code === "Delete" && e.selectedBox && (H(e.selectedBox), a({ ...e, selectedBox: void 0 })), t.code === "Tab") {
270
+ const n = R(e.selectedBox), i = w(n);
271
+ a({
272
272
  ...e,
273
- selectedBox: r,
274
- selectedLabel: (n == null ? void 0 : n.label) ?? e.selectedLabel
273
+ selectedBox: n,
274
+ selectedLabel: (i == null ? void 0 : i.label) ?? e.selectedLabel
275
275
  }), t.preventDefault();
276
276
  }
277
- t.code === "Space" && O(!0), t.code === "Slash" && t.shiftKey && c({ ...e, showHelp: !0 }), e.selectedBox && (t.code === "ArrowLeft" && (t.shiftKey ? D(e.selectedBox, 0, -S) : N(e.selectedBox, 0, -S)), t.code === "ArrowRight" && (t.shiftKey ? D(e.selectedBox, 0, S) : N(e.selectedBox, 0, S)), t.code === "ArrowUp" && (t.shiftKey ? D(e.selectedBox, -S, 0) : N(e.selectedBox, -S, 0)), t.code === "ArrowDown" && (t.shiftKey ? D(e.selectedBox, S, 0) : N(e.selectedBox, S, 0)));
278
- }, ie = (t) => {
279
- k(), m(
280
- a.annotations.concat(a.suggestions).sort((r, n) => n.w * n.h - r.w * r.h)
281
- ), L(a.falsePositives.sort((r, n) => n.w * n.h - r.w * r.h));
282
- }, le = () => {
283
- c({ ...e, showLabeler: !1 }), m(
284
- (t) => t.map((r) => r.id === e.selectedBox ? {
285
- ...r,
277
+ t.code === "Space" && q(!0), t.code === "Slash" && t.shiftKey && a({ ...e, showHelp: !0 }), e.selectedBox && (t.code === "ArrowLeft" && (t.shiftKey ? L(e.selectedBox, 0, -S) : F(e.selectedBox, 0, -S)), t.code === "ArrowRight" && (t.shiftKey ? L(e.selectedBox, 0, S) : F(e.selectedBox, 0, S)), t.code === "ArrowUp" && (t.shiftKey ? L(e.selectedBox, -S, 0) : F(e.selectedBox, -S, 0)), t.code === "ArrowDown" && (t.shiftKey ? L(e.selectedBox, S, 0) : F(e.selectedBox, S, 0)));
278
+ }, le = (t) => {
279
+ const n = N();
280
+ return m(
281
+ o.annotations.concat(o.suggestions).sort((i, r) => r.w * r.h - i.w * i.h)
282
+ ), k(o.falsePositives.sort((i, r) => r.w * r.h - i.w * i.h)), n;
283
+ }, ce = () => {
284
+ a({ ...e, showLabeler: !1 }), m(
285
+ (t) => t.map((n) => n.id === e.selectedBox ? {
286
+ ...n,
286
287
  label: e.selectedLabel,
287
288
  difficult: e.difficult
288
- } : r)
289
+ } : n)
289
290
  );
290
- }, ce = () => {
291
- c({ ...e, showLabeler: !1 }), m((t) => t.filter((r) => r.label));
292
- }, O = (t) => {
293
- a.save(d, a.suggestions.map((r) => r.id), y.length === 0, t ? a.labels : []);
294
- }, G = e.showBoxes ? 0 : -1;
291
+ }, ae = () => {
292
+ a({ ...e, showLabeler: !1 }), m((t) => t.filter((n) => n.label));
293
+ }, q = (t) => {
294
+ o.save(u, o.suggestions.map((n) => n.id), y.length === 0, t ? o.labels : []);
295
+ }, Q = e.showBoxes ? 0 : -1;
295
296
  return /* @__PURE__ */ v(oe, { children: [
296
- /* @__PURE__ */ i(fe, { ref: C, disabled: e.createMode || e.drawingMode, minScale: 0.9, children: ({ zoomIn: t, zoomOut: r }) => /* @__PURE__ */ v(
297
+ /* @__PURE__ */ l(me, { ref: C, disabled: e.createMode || e.drawingMode, minScale: 0.9, children: ({ zoomIn: t, zoomOut: n, setTransform: i }) => /* @__PURE__ */ v(
297
298
  "div",
298
299
  {
299
300
  className: "flex h-screen min-w-[600px] flex-col bg-slate-900",
300
- onKeyDown: re,
301
+ onKeyDown: ie,
301
302
  tabIndex: 0,
302
303
  children: [
303
304
  /* @__PURE__ */ v("div", { className: "flex flex-initial bg-slate-300 p-1", children: [
304
- /* @__PURE__ */ i("div", { className: "flex-initial", children: /* @__PURE__ */ i("button", { type: "button", onClick: a.back, children: /* @__PURE__ */ i(b, { secondary: !0, sm: !0, children: "Back" }) }) }),
305
+ /* @__PURE__ */ l("div", { className: "flex-initial", children: /* @__PURE__ */ l("button", { type: "button", onClick: o.back, children: /* @__PURE__ */ l(b, { secondary: !0, sm: !0, children: "Back" }) }) }),
305
306
  /* @__PURE__ */ v("div", { className: "flex flex-auto justify-center", children: [
306
- /* @__PURE__ */ i(
307
+ /* @__PURE__ */ l(
307
308
  "button",
308
309
  {
309
310
  type: "button",
310
311
  onClick: () => {
311
- r();
312
+ n();
312
313
  },
313
- children: /* @__PURE__ */ i(b, { children: /* @__PURE__ */ i(
314
+ children: /* @__PURE__ */ l(b, { children: /* @__PURE__ */ l(
314
315
  "svg",
315
316
  {
316
317
  xmlns: "http://www.w3.org/2000/svg",
@@ -318,7 +319,7 @@ const Se = (a) => {
318
319
  fill: "none",
319
320
  viewBox: "0 0 24 24",
320
321
  stroke: "currentColor",
321
- children: /* @__PURE__ */ i(
322
+ children: /* @__PURE__ */ l(
322
323
  "path",
323
324
  {
324
325
  strokeLinecap: "round",
@@ -331,14 +332,14 @@ const Se = (a) => {
331
332
  ) })
332
333
  }
333
334
  ),
334
- /* @__PURE__ */ i(
335
+ /* @__PURE__ */ l(
335
336
  "button",
336
337
  {
337
338
  type: "button",
338
339
  onClick: () => {
339
340
  t();
340
341
  },
341
- children: /* @__PURE__ */ i(b, { children: /* @__PURE__ */ i(
342
+ children: /* @__PURE__ */ l(b, { children: /* @__PURE__ */ l(
342
343
  "svg",
343
344
  {
344
345
  xmlns: "http://www.w3.org/2000/svg",
@@ -346,7 +347,7 @@ const Se = (a) => {
346
347
  fill: "none",
347
348
  viewBox: "0 0 24 24",
348
349
  stroke: "currentColor",
349
- children: /* @__PURE__ */ i(
350
+ children: /* @__PURE__ */ l(
350
351
  "path",
351
352
  {
352
353
  strokeLinecap: "round",
@@ -359,137 +360,140 @@ const Se = (a) => {
359
360
  ) })
360
361
  }
361
362
  ),
362
- /* @__PURE__ */ i("button", { type: "button", onClick: Y, children: /* @__PURE__ */ i(b, { secondary: !0, sm: !0, children: "Add (w)" }) })
363
+ /* @__PURE__ */ l("button", { type: "button", onClick: Y, children: /* @__PURE__ */ l(b, { secondary: !0, sm: !0, children: "Add (w)" }) })
363
364
  ] }),
364
365
  /* @__PURE__ */ v("div", { className: "flex-initial", children: [
365
- /* @__PURE__ */ i(
366
+ /* @__PURE__ */ l(
366
367
  "button",
367
368
  {
368
369
  onClick: () => {
369
- c({ ...e, showVerify: !0 });
370
+ a({ ...e, showVerify: !0 });
370
371
  },
371
- children: /* @__PURE__ */ i(b, { sm: !0, children: "Verify & Save" })
372
+ children: /* @__PURE__ */ l(b, { sm: !0, children: "Verify & Save" })
372
373
  }
373
374
  ),
374
- /* @__PURE__ */ i(
375
+ /* @__PURE__ */ l(
375
376
  "button",
376
377
  {
377
378
  onClick: () => {
378
- O(!1);
379
+ q(!1);
379
380
  },
380
- children: /* @__PURE__ */ i(b, { green: !0, sm: !0, children: "Save" })
381
+ children: /* @__PURE__ */ l(b, { green: !0, sm: !0, children: "Save" })
381
382
  }
382
383
  ),
383
- /* @__PURE__ */ i(
384
+ /* @__PURE__ */ l(
384
385
  "button",
385
386
  {
386
387
  onClick: () => {
387
- c({ ...e, showDelete: !0 });
388
+ a({ ...e, showDelete: !0 });
388
389
  },
389
- children: /* @__PURE__ */ i(b, { red: !0, sm: !0, children: "Delete" })
390
+ children: /* @__PURE__ */ l(b, { red: !0, sm: !0, children: "Delete" })
390
391
  }
391
392
  ),
392
- /* @__PURE__ */ i(
393
+ /* @__PURE__ */ l(
393
394
  "button",
394
395
  {
395
396
  onClick: () => {
396
- c({ ...e, showHelp: !0 });
397
+ a({ ...e, showHelp: !0 });
397
398
  },
398
- children: /* @__PURE__ */ i(b, { sm: !0, secondary: !0, children: "?" })
399
+ children: /* @__PURE__ */ l(b, { sm: !0, secondary: !0, children: "?" })
399
400
  }
400
401
  )
401
402
  ] })
402
403
  ] }),
403
- /* @__PURE__ */ i(
404
+ /* @__PURE__ */ l(
404
405
  "div",
405
406
  {
406
- ref: M,
407
+ ref: B,
407
408
  className: "grid flex-auto place-content-center",
408
- children: /* @__PURE__ */ i(me, { children: /* @__PURE__ */ v(
409
+ children: /* @__PURE__ */ l(we, { children: /* @__PURE__ */ v(
409
410
  "div",
410
411
  {
411
412
  className: "grid place-content-center",
412
- onMouseDown: E,
413
- onMouseUp: T,
414
- onMouseMove: j,
413
+ onMouseDown: V,
414
+ onMouseUp: W,
415
+ onMouseMove: U,
415
416
  children: [
416
- /* @__PURE__ */ i(
417
+ /* @__PURE__ */ l(
417
418
  "img",
418
419
  {
419
420
  ref: p,
420
421
  className: "col-start-1 row-start-1 h-full w-full",
421
422
  alt: "annotate",
422
- src: a.imageUrl,
423
- onLoad: ie,
423
+ src: o.imageUrl,
424
+ onLoad: (r) => {
425
+ const c = le();
426
+ i(c.leftPad, c.topPad, 0.9, 0);
427
+ },
424
428
  style: {
425
429
  width: e.width,
426
430
  height: e.height
427
431
  }
428
432
  }
429
433
  ),
430
- y.map((n) => {
431
- var o;
432
- return /* @__PURE__ */ i(
433
- te,
434
+ y.map((r) => {
435
+ var c;
436
+ return /* @__PURE__ */ l(
437
+ ne,
434
438
  {
435
- type: Z.falsePositive,
436
- label: n.label ?? "",
437
- zIndex: n.id === e.selectedBox ? 1 : G,
438
- x: n.x * e.width,
439
- y: n.y * e.height,
440
- w: n.w * e.width,
441
- h: n.h * e.height,
442
- initialScale: (o = C.current) == null ? void 0 : o.instance.transformState.scale,
443
- selected: n.id === e.selectedBox,
444
- onMouseDown: (l) => {
445
- e.createMode || (V(n.id), l.stopPropagation());
439
+ type: J.falsePositive,
440
+ label: r.label ?? "",
441
+ zIndex: r.id === e.selectedBox ? 1 : Q,
442
+ x: r.x * e.width,
443
+ y: r.y * e.height,
444
+ w: r.w * e.width,
445
+ h: r.h * e.height,
446
+ initialScale: (c = C.current) == null ? void 0 : c.instance.transformState.scale,
447
+ selected: r.id === e.selectedBox,
448
+ onMouseDown: (d) => {
449
+ e.createMode || (_(r.id), d.stopPropagation());
446
450
  },
447
451
  onClickDelete: () => {
448
- c({
452
+ a({
449
453
  ...e,
450
454
  showConfirmDeleteFalsePositive: !0
451
455
  });
452
456
  }
453
457
  },
454
- n.id
458
+ r.id
455
459
  );
456
460
  }),
457
- d.map((n) => {
458
- var o;
459
- return /* @__PURE__ */ i(
460
- te,
461
+ u.map((r) => {
462
+ var c;
463
+ return /* @__PURE__ */ l(
464
+ ne,
461
465
  {
462
- type: n.suggestion ? Z.suggestion : Z.truePositive,
463
- label: n.label ?? "",
464
- difficult: n.difficult,
465
- zIndex: n.id === e.selectedBox ? 1 : G,
466
- x: n.x * e.width,
467
- y: n.y * e.height,
468
- w: n.w * e.width,
469
- h: n.h * e.height,
470
- initialScale: (o = C.current) == null ? void 0 : o.instance.transformState.scale,
471
- selected: n.id === e.selectedBox,
472
- onMouseDown: (l) => {
473
- e.createMode || (V(n.id), l.stopPropagation());
466
+ type: r.suggestion ? J.suggestion : J.truePositive,
467
+ label: r.label ?? "",
468
+ difficult: r.difficult,
469
+ zIndex: r.id === e.selectedBox ? 1 : Q,
470
+ x: r.x * e.width,
471
+ y: r.y * e.height,
472
+ w: r.w * e.width,
473
+ h: r.h * e.height,
474
+ initialScale: (c = C.current) == null ? void 0 : c.instance.transformState.scale,
475
+ selected: r.id === e.selectedBox,
476
+ onMouseDown: (d) => {
477
+ e.createMode || (_(r.id), d.stopPropagation());
474
478
  },
475
- onDragStop: (l, h) => {
476
- X(h, n.id);
479
+ onDragStop: (d, s) => {
480
+ j(s, r.id);
477
481
  },
478
- onResizeStop: (l, h, s, f, g) => {
479
- W(s, g, n.id);
482
+ onResizeStop: (d, s, h, g, D) => {
483
+ z(h, D, r.id);
480
484
  },
481
485
  onClickDelete: () => {
482
- z(n.id);
486
+ H(r.id);
483
487
  },
484
488
  onClickEdit: () => {
485
- c({ ...e, showLabeler: !0 });
489
+ a({ ...e, showLabeler: !0 });
486
490
  }
487
491
  },
488
- n.id
492
+ r.id
489
493
  );
490
494
  }),
491
- /* @__PURE__ */ i(
492
- de,
495
+ /* @__PURE__ */ l(
496
+ ue,
493
497
  {
494
498
  className: `col-start-1 row-start-1 ${e.createMode && !e.drawingMode ? "z-10" : "-z-10"}`,
495
499
  show: e.createMode && !e.drawingMode
@@ -503,31 +507,31 @@ const Se = (a) => {
503
507
  ]
504
508
  }
505
509
  ) }),
506
- /* @__PURE__ */ i(
507
- he,
510
+ /* @__PURE__ */ l(
511
+ fe,
508
512
  {
509
513
  title: "Annotate",
510
514
  show: e.showLabeler,
511
515
  cancelText: "Cancel",
512
- button: /* @__PURE__ */ i("button", { type: "button", onClick: le, children: /* @__PURE__ */ i(b, { sm: !0, green: !0, children: "Save" }) }),
513
- handleCancel: ce,
516
+ button: /* @__PURE__ */ l("button", { type: "button", onClick: ce, children: /* @__PURE__ */ l(b, { sm: !0, green: !0, children: "Save" }) }),
517
+ handleCancel: ae,
514
518
  children: /* @__PURE__ */ v("div", { className: "my-2 grid grid-cols-1 gap-y-2", children: [
515
519
  /* @__PURE__ */ v("div", { children: [
516
- /* @__PURE__ */ i(
520
+ /* @__PURE__ */ l(
517
521
  "select",
518
522
  {
519
523
  className: "w-full rounded-md border-gray-300 shadow-sm focus:border-primary-300 focus:ring focus:ring-primary-200 focus:ring-opacity-50",
520
524
  value: e.selectedLabel,
521
525
  onChange: (t) => {
522
- c({ ...e, selectedLabel: t.target.value });
526
+ a({ ...e, selectedLabel: t.target.value });
523
527
  },
524
- children: a.labels.map((t) => /* @__PURE__ */ i("option", { value: t, children: t }, t))
528
+ children: o.labels.map((t) => /* @__PURE__ */ l("option", { value: t, children: t }, t))
525
529
  }
526
530
  ),
527
- a.manageLabelUrl && /* @__PURE__ */ i("a", { className: "text-primary-500 hover:text-primary-600 underline text-sm", href: a.manageLabelUrl, target: "_blank", children: "Manage Label Options" })
531
+ o.manageLabelUrl && /* @__PURE__ */ l("a", { className: "text-primary-500 hover:text-primary-600 underline text-sm", href: o.manageLabelUrl, target: "_blank", children: "Manage Label Options" })
528
532
  ] }),
529
533
  /* @__PURE__ */ v("div", { className: "flex items-center", children: [
530
- /* @__PURE__ */ i(
534
+ /* @__PURE__ */ l(
531
535
  "input",
532
536
  {
533
537
  id: "difficult",
@@ -535,100 +539,100 @@ const Se = (a) => {
535
539
  type: "checkbox",
536
540
  checked: e.difficult,
537
541
  onChange: (t) => {
538
- c({ ...e, difficult: t.target.checked });
542
+ a({ ...e, difficult: t.target.checked });
539
543
  }
540
544
  }
541
545
  ),
542
- /* @__PURE__ */ i("label", { htmlFor: "difficult", className: "ml-2", children: "Difficult?" })
546
+ /* @__PURE__ */ l("label", { htmlFor: "difficult", className: "ml-2", children: "Difficult?" })
543
547
  ] })
544
548
  ] })
545
549
  }
546
550
  ),
547
- /* @__PURE__ */ i(
548
- ue,
551
+ /* @__PURE__ */ l(
552
+ he,
549
553
  {
550
554
  title: "Keyboard shortcuts",
551
555
  show: e.showHelp,
552
556
  handleClose: () => {
553
- c({ ...e, showHelp: !1 });
557
+ a({ ...e, showHelp: !1 });
554
558
  },
555
- children: /* @__PURE__ */ i("div", { className: "grid w-full grid-cols-2 place-content-center gap-2 p-5", children: x.map((t) => /* @__PURE__ */ v(se, { children: [
556
- /* @__PURE__ */ i("div", { children: t.action }),
557
- /* @__PURE__ */ i("div", { className: "justify-self-end", children: t.codes.map((r) => /* @__PURE__ */ i(
559
+ children: /* @__PURE__ */ l("div", { className: "grid w-full grid-cols-2 place-content-center gap-2 p-5", children: x.map((t) => /* @__PURE__ */ v(de, { children: [
560
+ /* @__PURE__ */ l("div", { children: t.action }),
561
+ /* @__PURE__ */ l("div", { className: "justify-self-end", children: t.codes.map((n) => /* @__PURE__ */ l(
558
562
  "span",
559
563
  {
560
564
  className: "rounded-md bg-slate-100 p-1 font-mono text-xs shadow-inner",
561
- children: r
565
+ children: n
562
566
  },
563
- r
564
- )).reduce((r, n) => [r, " + ", n]) })
567
+ n
568
+ )).reduce((n, i) => [n, " + ", i]) })
565
569
  ] }, t.action)) })
566
570
  }
567
571
  ),
568
- /* @__PURE__ */ i(
569
- q,
572
+ /* @__PURE__ */ l(
573
+ G,
570
574
  {
571
575
  title: "Are all of the objects in this image labeled?",
572
576
  description: " ",
573
577
  maxWidthClass: "max-w-lg",
574
578
  handleCancel: () => {
575
- c({ ...e, showVerify: !1 });
579
+ a({ ...e, showVerify: !1 });
576
580
  },
577
581
  show: e.showVerify,
578
582
  cancelText: "Cancel",
579
- button: /* @__PURE__ */ i(
583
+ button: /* @__PURE__ */ l(
580
584
  "button",
581
585
  {
582
586
  type: "button",
583
587
  onClick: () => {
584
- O(!0), c({ ...e, showVerify: !1 });
588
+ q(!0), a({ ...e, showVerify: !1 });
585
589
  },
586
- children: /* @__PURE__ */ i(b, { sm: !0, green: !0, children: "Yes, all objects are labeled" })
590
+ children: /* @__PURE__ */ l(b, { sm: !0, green: !0, children: "Yes, all objects are labeled" })
587
591
  }
588
592
  ),
589
- children: /* @__PURE__ */ i("div", { className: "flex flex-wrap", children: a.labels.map((t) => /* @__PURE__ */ i("div", { className: "font-mono m-1 bg-slate-200 p-1 rounded-md", children: t }, t)) })
593
+ children: /* @__PURE__ */ l("div", { className: "flex flex-wrap", children: o.labels.map((t) => /* @__PURE__ */ l("div", { className: "font-mono m-1 bg-slate-200 p-1 rounded-md", children: t }, t)) })
590
594
  }
591
595
  ),
592
- /* @__PURE__ */ i(
593
- q,
596
+ /* @__PURE__ */ l(
597
+ G,
594
598
  {
595
599
  title: "Are you sure you want to delete this image?",
596
600
  description: "",
597
601
  handleCancel: () => {
598
- c({ ...e, showDelete: !1 });
602
+ a({ ...e, showDelete: !1 });
599
603
  },
600
604
  show: e.showDelete,
601
605
  cancelText: "Cancel",
602
- button: /* @__PURE__ */ i(
606
+ button: /* @__PURE__ */ l(
603
607
  "button",
604
608
  {
605
609
  type: "button",
606
610
  onClick: () => {
607
- a.delete(), c({ ...e, showDelete: !1 });
611
+ o.delete(), a({ ...e, showDelete: !1 });
608
612
  },
609
- children: /* @__PURE__ */ i(b, { sm: !0, red: !0, children: "Yes, permanently delete" })
613
+ children: /* @__PURE__ */ l(b, { sm: !0, red: !0, children: "Yes, permanently delete" })
610
614
  }
611
615
  ),
612
616
  children: "This cannot be undone."
613
617
  }
614
618
  ),
615
- /* @__PURE__ */ i(
616
- q,
619
+ /* @__PURE__ */ l(
620
+ G,
617
621
  {
618
622
  title: "Are you sure you want to delete this reported false positive?",
619
623
  description: " ",
620
624
  maxWidthClass: "max-w-xl",
621
625
  handleCancel: () => {
622
- c({ ...e, showConfirmDeleteFalsePositive: !1 });
626
+ a({ ...e, showConfirmDeleteFalsePositive: !1 });
623
627
  },
624
628
  show: e.showConfirmDeleteFalsePositive,
625
629
  cancelText: "Cancel",
626
- button: /* @__PURE__ */ i(
630
+ button: /* @__PURE__ */ l(
627
631
  "button",
628
632
  {
629
633
  type: "button",
630
634
  onClick: () => {
631
- e.selectedBox && P(e.selectedBox), c({
635
+ e.selectedBox && K(e.selectedBox), a({
632
636
  ...e,
633
637
  showConfirmDeleteFalsePositive: !1,
634
638
  selectedBox: void 0
@@ -637,16 +641,16 @@ const Se = (a) => {
637
641
  children: /* @__PURE__ */ v(b, { sm: !0, red: !0, children: [
638
642
  "Do not teach my model that this is not a",
639
643
  " ",
640
- e.selectedBox ? u(e.selectedBox) : " "
644
+ e.selectedBox ? f(e.selectedBox) : " "
641
645
  ] })
642
646
  }
643
647
  ),
644
- children: /* @__PURE__ */ i("p", { children: "False positives submitted from Frigate are used to improve your model and should not be deleted unless you submitted them accidentally." })
648
+ children: /* @__PURE__ */ l("p", { children: "False positives submitted from Frigate are used to improve your model and should not be deleted unless you submitted them accidentally." })
645
649
  }
646
650
  )
647
651
  ] });
648
652
  };
649
653
  export {
650
- Se as ImageAnnotator
654
+ Le as ImageAnnotator
651
655
  };
652
656
  //# sourceMappingURL=ImageAnnotator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImageAnnotator.js","sources":["../../node_modules/use-debounce/dist/index.module.js","../../src/components/ImageAnnotator.tsx"],"sourcesContent":["import{useRef as r,useEffect as n,useMemo as t,useReducer as e,useCallback as u}from\"react\";function c(e,u,c){var i=this,a=r(null),o=r(0),f=r(null),l=r([]),v=r(),m=r(),d=r(e),g=r(!0);d.current=e;var p=\"undefined\"!=typeof window,w=!u&&0!==u&&p;if(\"function\"!=typeof e)throw new TypeError(\"Expected a function\");u=+u||0;var s=!!(c=c||{}).leading,x=!(\"trailing\"in c)||!!c.trailing,h=\"maxWait\"in c,y=\"debounceOnServer\"in c&&!!c.debounceOnServer,F=h?Math.max(+c.maxWait||0,u):null;n(function(){return g.current=!0,function(){g.current=!1}},[]);var A=t(function(){var r=function(r){var n=l.current,t=v.current;return l.current=v.current=null,o.current=r,m.current=d.current.apply(t,n)},n=function(r,n){w&&cancelAnimationFrame(f.current),f.current=w?requestAnimationFrame(r):setTimeout(r,n)},t=function(r){if(!g.current)return!1;var n=r-a.current;return!a.current||n>=u||n<0||h&&r-o.current>=F},e=function(n){return f.current=null,x&&l.current?r(n):(l.current=v.current=null,m.current)},c=function r(){var c=Date.now();if(t(c))return e(c);if(g.current){var i=u-(c-a.current),f=h?Math.min(i,F-(c-o.current)):i;n(r,f)}},A=function(){if(p||y){var e=Date.now(),d=t(e);if(l.current=[].slice.call(arguments),v.current=i,a.current=e,d){if(!f.current&&g.current)return o.current=a.current,n(c,u),s?r(a.current):m.current;if(h)return n(c,u),r(a.current)}return f.current||n(c,u),m.current}};return A.cancel=function(){f.current&&(w?cancelAnimationFrame(f.current):clearTimeout(f.current)),o.current=0,l.current=a.current=v.current=f.current=null},A.isPending=function(){return!!f.current},A.flush=function(){return f.current?e(Date.now()):m.current},A},[s,h,u,F,x,w,p,y]);return A}function i(r,n){return r===n}function a(r,n){return n}function o(n,t,o){var f=o&&o.equalityFn||i,l=e(a,n),v=l[0],m=l[1],d=c(u(function(r){return m(r)},[m]),t,o),g=r(n);return f(g.current,n)||(d(n),g.current=n),[v,d]}function f(r,n,t){var e=void 0===t?{}:t,u=e.leading,i=e.trailing;return c(r,n,{maxWait:n,leading:void 0===u||u,trailing:void 0===i||i})}export{o as useDebounce,c as useDebouncedCallback,f as useThrottledCallback};\n//# sourceMappingURL=index.module.js.map\n","import {\n useState,\n useRef,\n MouseEventHandler,\n KeyboardEventHandler,\n ReactEventHandler,\n Fragment,\n useEffect,\n} from \"react\";\n\nimport { Position, DraggableData } from \"react-rnd\";\n\nimport { Button } from \"./Button\";\nimport { Crosshairs } from \"./Crosshairs\";\nimport { InfoDialog } from \"./InfoDialog\";\nimport { LabelDialog } from \"./LabelDialog\";\nimport { VerifyDialog } from \"./VerifyDialog\";\nimport { BoundingBox, BoundingBoxType } from \"./BoundingBox\";\nimport { Annotation } from \"../types/Annotation\";\nimport { FalsePositive } from \"../types/FalsePositive\";\nimport { ReactZoomPanPinchRef, TransformComponent, TransformWrapper } from \"react-zoom-pan-pinch\";\nimport { useDebouncedCallback } from \"use-debounce\";\n\ninterface EditorState {\n createMode: boolean;\n drawingMode: boolean;\n showBoxes: boolean;\n drawStartX: number;\n drawStartY: number;\n selectedBox?: string;\n showLabeler: boolean;\n selectedLabel: string;\n difficult: boolean;\n height: number;\n width: number;\n showHelp: boolean;\n showVerify: boolean;\n showDelete: boolean;\n showTutorial: boolean;\n showConfirmDeleteFalsePositive: boolean;\n}\n\ninterface IImageAnnotationProps {\n annotations: Annotation[];\n suggestions: Annotation[];\n falsePositives: FalsePositive[];\n nextImage: () => void;\n save: (\n annotations: Annotation[],\n reviewedSuggestions: string[],\n deleteFalsePositive: boolean,\n verified: string[],\n ) => void;\n delete: () => void;\n back: () => void;\n imageUrl: string;\n labels: string[];\n manageLabelUrl?: string;\n verifiedLabels: string[];\n userAnnotationCount: number;\n}\n\n/**\n * A image annotation component.\n * @component\n * @params props - Component props.\n * @param props.annotations - Bounding boxes\n * @param props.save - Callback for the save button.\n */\nconst ImageAnnotator = (props: IImageAnnotationProps) => {\n const shortcuts = [\n { codes: [\"?\"], action: \"Shortcut help\" },\n { codes: [\"w\"], action: \"Add Box\" },\n { codes: [\"d\"], action: \"Mark Difficult\" },\n { codes: [\"s\"], action: \"Cycle Label\" },\n { codes: [\"Tab\"], action: \"Select Next Box\" },\n { codes: [\"Del\"], action: \"Delete Box\" },\n { codes: [\"Esc\"], action: \"Deselect/Cancel\" },\n { codes: [\"← ↑ → ↓\"], action: \"Move Box\" },\n { codes: [\"Shift\", \"← ↑ → ↓\"], action: \"Resize Box\" },\n { codes: [\"f\"], action: \"Toggle Unselected Boxes\" },\n { codes: [\"Spacebar\"], action: \"Verify and Save\" },\n ];\n\n const [bboxes, setBBoxes] = useState<Annotation[]>([]);\n\n const [fpboxes, setFPBoxes] = useState<FalsePositive[]>([]);\n\n const [state, setState] = useState<EditorState>({\n createMode: false,\n drawingMode: false,\n showBoxes: true,\n showLabeler: false,\n showHelp: false,\n showVerify: false,\n showDelete: false,\n showConfirmDeleteFalsePositive: false,\n showTutorial: props.userAnnotationCount === 0,\n drawStartX: 0,\n drawStartY: 0,\n selectedLabel: props.labels.find((l) => !(props.verifiedLabels ?? []).includes(l)) ?? props.labels[0],\n difficult: false,\n width: 1,\n height: 1,\n });\n\n const ref = useRef<HTMLImageElement>(null);\n\n const editorRef = useRef<HTMLDivElement>(null);\n\n const transformRef = useRef<ReactZoomPanPinchRef>(null);\n\n const resize = () => {\n const naturalHeight = ref.current?.naturalHeight ?? 1;\n const naturalWidth = ref.current?.naturalWidth ?? 1;\n const aspectRatio = naturalWidth/naturalHeight;\n\n const editorHeight = editorRef.current?.clientHeight ?? 0;\n const editorWidth = editorRef.current?.clientWidth ?? 0;\n\n const maxHeight = editorHeight - 5;\n const maxWidth = editorWidth - 5;\n const desiredWidth = maxHeight * aspectRatio;\n \n // if too wide when max height, then use maxWidth\n if (desiredWidth > maxWidth) {\n setState({\n ...state,\n width: maxWidth,\n height: Math.round(maxWidth/aspectRatio),\n });\n } else {\n setState({\n ...state,\n width: desiredWidth,\n height: Math.round(desiredWidth/aspectRatio),\n })\n }\n }\n\n const handleResize = useDebouncedCallback(() => {\n resize()\n }, 200);\n\n useEffect(() => {\n window.addEventListener('resize', handleResize);\n editorRef.current?.parentElement?.focus();\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, [handleResize]);\n \n const onResizeStop = (\n elem: HTMLElement,\n position: Position,\n boxId: string,\n ) => {\n setBBoxes((prev) =>\n prev.map((a) => {\n if (a.id === boxId) {\n return {\n ...a,\n x: position.x / state.width,\n y: position.y / state.height,\n w: elem.offsetWidth / state.width,\n h: elem.offsetHeight / state.height,\n };\n }\n return a;\n }),\n );\n };\n const onDragStop = (d: DraggableData, boxId: string) => {\n setBBoxes((prev) =>\n prev.map((a) => {\n if (a.id === boxId) {\n return {\n ...a,\n x: d.x / state.width,\n y: d.y / state.height,\n };\n }\n return a;\n }),\n );\n };\n\n const onMouseDown: MouseEventHandler<HTMLImageElement> = (e) => {\n if (state.createMode) {\n const scale = transformRef.current?.instance.transformState.scale ?? 1;\n const bounds = ref.current?.getBoundingClientRect();\n const x =\n (e.clientX - (bounds?.left ?? 0)) / scale /\n state.width;\n const y =\n (e.clientY - (bounds?.top ?? 0)) / scale /\n state.height;\n\n setState({\n ...state,\n drawingMode: true,\n drawStartX: x,\n drawStartY: y,\n selectedBox: \"draft\",\n });\n setBBoxes((prev) => [\n ...prev,\n {\n id: \"draft\",\n x,\n y,\n w: 0.0,\n h: 0.0,\n },\n ]);\n } else {\n setState({ ...state, selectedBox: undefined });\n }\n };\n\n const onMouseUp: MouseEventHandler<HTMLImageElement> = (e) => {\n if (state.drawingMode) {\n const newId = Date.now().toString();\n setState({\n ...state,\n drawingMode: false,\n createMode: false,\n selectedBox: newId,\n });\n setBBoxes((prev) =>\n prev.reduce<Annotation[]>((out, a) => {\n if (a.id === \"draft\") {\n const scale = transformRef.current?.instance.transformState.scale ?? 1;\n const bounds = ref.current?.getBoundingClientRect();\n const x =\n (e.clientX - (bounds?.left ?? 0)) / scale /\n state.width;\n const y =\n (e.clientY - (bounds?.top ?? 0)) / scale /\n state.height;\n\n if (\n Math.min(\n Math.abs(state.drawStartX - x),\n Math.abs(state.drawStartY - y),\n ) > 0.001\n ) {\n let left = Math.min(state.drawStartX, x);\n let top = Math.min(state.drawStartY, y);\n let width = Math.abs(state.drawStartX - x);\n let height = Math.abs(state.drawStartY - y);\n if (left < 0) {\n width -= Math.abs(left);\n left = 0;\n }\n if (top < 0) {\n height -= Math.abs(top);\n top = 0;\n }\n out.push({\n ...a,\n id: newId,\n label: state.selectedLabel,\n difficult: false,\n x: left,\n y: top,\n w: Math.min(1.0 - left, width),\n h: Math.min(1.0 - top, height),\n });\n }\n } else {\n out.push(a);\n }\n return out;\n }, []),\n );\n }\n };\n\n const onMouseMove: MouseEventHandler<HTMLImageElement> = (e) => {\n if (state.drawingMode) {\n setBBoxes((prev) =>\n prev.map((a) => {\n if (a.id === \"draft\") {\n const scale = transformRef.current?.instance.transformState.scale ?? 1;\n const bounds = ref.current?.getBoundingClientRect();\n const x =\n (e.pageX - (bounds?.left ?? 0)) / scale /\n state.width;\n const y =\n (e.pageY - (bounds?.top ?? 0)) / scale /\n state.height;\n\n return {\n ...a,\n x: Math.min(state.drawStartX, x),\n y: Math.min(state.drawStartY, y),\n w: Math.abs(state.drawStartX - x),\n h: Math.abs(state.drawStartY - y),\n };\n }\n return a;\n }),\n );\n }\n };\n\n const clickCreate: MouseEventHandler<HTMLButtonElement> = () => {\n setState({ ...state, createMode: !state.createMode });\n };\n\n const onClickBBox = (boxId: string) => {\n const selectedBox = bboxes.find((b) => b.id === boxId);\n setState({\n ...state,\n selectedBox: boxId,\n selectedLabel: selectedBox?.label ?? state.selectedLabel,\n difficult: selectedBox?.difficult ?? state.difficult,\n });\n };\n\n const moveBox = (boxId: string, vertical: number, horizontal: number) => {\n setBBoxes((prev) =>\n prev.map((a) => {\n if (a.id === boxId) {\n return {\n ...a,\n x: Math.min(\n 1.0 - a.w,\n Math.max(0.0, a.x + horizontal / state.width),\n ),\n y: Math.min(\n 1.0 - a.h,\n Math.max(0.0, a.y + vertical / state.height),\n ),\n };\n }\n return a;\n }),\n );\n };\n\n const resizeBox = (boxId: string, vertical: number, horizontal: number) => {\n setBBoxes((prev) =>\n prev.map((a) => {\n if (a.id === boxId) {\n return {\n ...a,\n w: Math.min(1.0 - a.x, a.w + horizontal / state.width),\n h: Math.min(1.0 - a.y, a.h + vertical / state.height),\n };\n }\n return a;\n }),\n );\n };\n\n const toggleDifficult = (boxId: string) => {\n setBBoxes((prev) =>\n prev.map((a) => {\n if (a.id === boxId) {\n return {\n ...a,\n difficult: !a.difficult,\n };\n }\n return a;\n }),\n );\n };\n\n const cycleLabel = (boxId: string, reverse = false) => {\n const currentLabelIndex = props.labels.findIndex(\n (label) => state.selectedLabel === label,\n );\n const lastIndex = props.labels.length - 1;\n\n let newIndex = 0;\n if (reverse) {\n newIndex = currentLabelIndex === 0 ? lastIndex : currentLabelIndex - 1;\n } else {\n newIndex = currentLabelIndex === lastIndex ? 0 : currentLabelIndex + 1;\n }\n const newLabel = props.labels[newIndex];\n setBBoxes((prev) =>\n prev.map((a) => {\n if (a.id === boxId) {\n return {\n ...a,\n label: newLabel,\n };\n }\n return a;\n }),\n );\n setState({ ...state, selectedLabel: newLabel });\n };\n\n const deleteBox = (boxId: string) => {\n setBBoxes((prev) => prev.filter((a) => a.id !== boxId));\n };\n\n const deleteFP = (boxId: string) => {\n setFPBoxes((prev) => prev.filter((a) => a.id !== boxId));\n };\n\n const getFPLabel = (boxId: string) => {\n return fpboxes.find((box) => box.id === boxId)?.label;\n };\n\n const getBox = (boxId: string) => {\n return bboxes.find((box) => box.id === boxId);\n };\n\n const nextBox = (boxId?: string) => {\n if (!boxId) {\n return bboxes[0].id;\n }\n const currentIndex = bboxes.findIndex((box) => box.id === boxId);\n if (currentIndex === bboxes.length - 1) {\n return bboxes[0].id;\n } else {\n return bboxes[currentIndex + 1].id;\n }\n };\n\n const stepSize = 5 / (transformRef.current?.instance.transformState.scale ?? 1);\n const onKeyDown: KeyboardEventHandler<HTMLDivElement> = (e) => {\n if (e.code === \"Escape\") {\n if (state.createMode) {\n setState({ ...state, createMode: false });\n } else {\n setState({ ...state, selectedBox: undefined });\n }\n }\n if (e.code === \"KeyW\") {\n if (!state.createMode) {\n setState({ ...state, createMode: true, selectedBox: undefined });\n } else {\n setState({ ...state, createMode: false });\n }\n }\n if (e.code === \"KeyF\") {\n setState({ ...state, showBoxes: !state.showBoxes });\n }\n if (e.code === \"KeyD\") {\n if (state.selectedBox) {\n toggleDifficult(state.selectedBox);\n }\n }\n if (e.code === \"KeyS\") {\n if (state.selectedBox) {\n cycleLabel(state.selectedBox, e.shiftKey);\n }\n }\n if (e.code === \"Delete\" && state.selectedBox) {\n deleteBox(state.selectedBox);\n setState({ ...state, selectedBox: undefined });\n }\n if (e.code === \"Tab\") {\n const next = nextBox(state.selectedBox);\n const box = getBox(next);\n setState({\n ...state,\n selectedBox: next,\n selectedLabel: box?.label ?? state.selectedLabel,\n });\n e.preventDefault();\n }\n if (e.code === \"Space\") {\n save(true);\n }\n if (e.code === \"Slash\" && e.shiftKey) {\n setState({ ...state, showHelp: true });\n }\n if (state.selectedBox) {\n if (e.code === \"ArrowLeft\") {\n if (e.shiftKey) {\n resizeBox(state.selectedBox, 0, -stepSize);\n } else {\n moveBox(state.selectedBox, 0, -stepSize);\n }\n }\n if (e.code === \"ArrowRight\") {\n if (e.shiftKey) {\n resizeBox(state.selectedBox, 0, stepSize);\n } else {\n moveBox(state.selectedBox, 0, stepSize);\n }\n }\n if (e.code === \"ArrowUp\") {\n if (e.shiftKey) {\n resizeBox(state.selectedBox, -stepSize, 0);\n } else {\n moveBox(state.selectedBox, -stepSize, 0);\n }\n }\n if (e.code === \"ArrowDown\") {\n if (e.shiftKey) {\n resizeBox(state.selectedBox, stepSize, 0);\n } else {\n moveBox(state.selectedBox, stepSize, 0);\n }\n }\n }\n };\n\n const onLoad: ReactEventHandler<HTMLImageElement> = (_e) => {\n resize();\n\n setBBoxes(\n props.annotations\n .concat(props.suggestions)\n .sort((a, b) => b.w * b.h - a.w * a.h),\n );\n setFPBoxes(props.falsePositives.sort((a, b) => b.w * b.h - a.w * a.h));\n };\n\n const onSaveLabel: MouseEventHandler<HTMLButtonElement> = () => {\n setState({ ...state, showLabeler: false });\n setBBoxes((prev) =>\n prev.map((a) => {\n if (a.id === state.selectedBox) {\n return {\n ...a,\n label: state.selectedLabel,\n difficult: state.difficult,\n };\n }\n return a;\n }),\n );\n };\n\n const onCancelLabel = () => {\n setState({ ...state, showLabeler: false });\n setBBoxes((prev) => prev.filter((a) => a.label));\n };\n \n const save = (verified: boolean) => {\n props.save(bboxes, props.suggestions.map((s) => s.id), fpboxes.length === 0, verified ? props.labels : []);\n }\n\n const defaultZIndex = state.showBoxes ? 0 : -1;\n\n return (\n <>\n <TransformWrapper ref={transformRef} disabled={state.createMode || state.drawingMode} minScale={0.9}>\n {({ zoomIn, zoomOut }) => (\n <div\n className=\"flex h-screen min-w-[600px] flex-col bg-slate-900\"\n onKeyDown={onKeyDown}\n tabIndex={0}\n >\n <div className=\"flex flex-initial bg-slate-300 p-1\">\n <div className=\"flex-initial\">\n <button type=\"button\" onClick={props.back}>\n <Button secondary sm>\n Back\n </Button>\n </button>\n </div>\n <div className=\"flex flex-auto justify-center\">\n <button\n type=\"button\"\n onClick={() => {\n zoomOut();\n }}\n >\n <Button>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0zM13 10H7\"\n />\n </svg>\n </Button>\n </button>\n <button\n type=\"button\"\n onClick={() => {\n zoomIn();\n }}\n >\n <Button>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0zM10 7v3m0 0v3m0-3h3m-3 0H7\"\n />\n </svg>\n </Button>\n </button>\n <button type=\"button\" onClick={clickCreate}>\n <Button secondary sm>\n Add (w)\n </Button>\n </button>\n </div>\n <div className=\"flex-initial\">\n <button\n onClick={() => {\n setState({ ...state, showVerify: true });\n }}\n >\n <Button sm>Verify &amp; Save</Button>\n </button>\n <button\n onClick={() => {\n save(false);\n }}\n >\n <Button green sm>\n Save\n </Button>\n </button>\n <button\n onClick={() => {\n setState({ ...state, showDelete: true });\n }}\n >\n <Button red sm>\n Delete\n </Button>\n </button>\n <button\n onClick={() => {\n setState({ ...state, showHelp: true });\n }}\n >\n <Button sm secondary>\n ?\n </Button>\n </button>\n </div>\n </div>\n <div\n ref={editorRef}\n className=\"grid flex-auto place-content-center\"\n >\n <TransformComponent>\n <div\n className=\"grid place-content-center\"\n onMouseDown={onMouseDown}\n onMouseUp={onMouseUp}\n onMouseMove={onMouseMove}\n \n >\n <img\n ref={ref}\n className=\"col-start-1 row-start-1 h-full w-full\"\n alt=\"annotate\"\n src={props.imageUrl}\n onLoad={onLoad}\n style={{\n width: state.width,\n height: state.height,\n }}\n />\n {fpboxes.map((box) => (\n <BoundingBox\n type={BoundingBoxType.falsePositive}\n label={box.label ?? \"\"}\n key={box.id}\n zIndex={box.id === state.selectedBox ? 1 : defaultZIndex}\n x={box.x * state.width}\n y={box.y * state.height}\n w={box.w * state.width}\n h={box.h * state.height}\n initialScale={transformRef.current?.instance.transformState.scale}\n selected={box.id === state.selectedBox}\n onMouseDown={(e: { stopPropagation: () => void }) => {\n if (!state.createMode) {\n onClickBBox(box.id);\n e.stopPropagation();\n }\n }}\n onClickDelete={() => {\n setState({\n ...state,\n showConfirmDeleteFalsePositive: true,\n });\n }}\n />\n ))}\n {bboxes.map((box) => (\n <BoundingBox\n type={\n box.suggestion\n ? BoundingBoxType.suggestion\n : BoundingBoxType.truePositive\n }\n label={box.label ?? \"\"}\n difficult={box.difficult}\n key={box.id}\n zIndex={box.id === state.selectedBox ? 1 : defaultZIndex}\n x={box.x * state.width}\n y={box.y * state.height}\n w={box.w * state.width}\n h={box.h * state.height}\n initialScale={transformRef.current?.instance.transformState.scale}\n selected={box.id === state.selectedBox}\n onMouseDown={(e: { stopPropagation: () => void }) => {\n if (!state.createMode) {\n onClickBBox(box.id);\n e.stopPropagation();\n }\n }}\n onDragStop={(_e, d) => {\n onDragStop(d, box.id);\n }}\n onResizeStop={(_e, _d, r: HTMLElement, _delta, p) => {\n onResizeStop(r, p, box.id);\n }}\n onClickDelete={() => {\n deleteBox(box.id);\n }}\n onClickEdit={() => {\n setState({ ...state, showLabeler: true });\n }}\n />\n ))}\n <Crosshairs\n className={`col-start-1 row-start-1 ${(state.createMode && !state.drawingMode) ? 'z-10' : '-z-10'}`}\n show={state.createMode && !state.drawingMode}\n />\n </div>\n </TransformComponent>\n </div>\n </div>\n )}\n </TransformWrapper>\n <LabelDialog\n title=\"Annotate\"\n show={state.showLabeler}\n cancelText=\"Cancel\"\n button={\n <button type=\"button\" onClick={onSaveLabel}>\n <Button sm green>\n Save\n </Button>\n </button>\n }\n handleCancel={onCancelLabel}\n >\n <div className=\"my-2 grid grid-cols-1 gap-y-2\">\n <div>\n <select\n className=\"w-full rounded-md border-gray-300 shadow-sm focus:border-primary-300 focus:ring focus:ring-primary-200 focus:ring-opacity-50\"\n value={state.selectedLabel}\n onChange={(e) => {\n setState({ ...state, selectedLabel: e.target.value });\n }}\n >\n {props.labels.map((o) => (\n <option key={o} value={o}>\n {o}\n </option>\n ))}\n </select>\n\n {props.manageLabelUrl && (\n <a className=\"text-primary-500 hover:text-primary-600 underline text-sm\" href={props.manageLabelUrl} target=\"_blank\">Manage Label Options</a>\n )}\n </div>\n <div className=\"flex items-center\">\n <input\n id=\"difficult\"\n className=\"border-gray-300 text-primary-600 shadow-sm hover:border-gray-300 focus:border-primary-300 focus:ring focus:ring-primary-200 focus:ring-opacity-50 focus:ring-offset-0 rounded\"\n type=\"checkbox\"\n checked={state.difficult}\n onChange={(e) => {\n setState({ ...state, difficult: e.target.checked });\n }}\n />\n <label htmlFor=\"difficult\" className=\"ml-2\">\n Difficult?\n </label>\n </div>\n </div>\n </LabelDialog>\n <InfoDialog\n title=\"Keyboard shortcuts\"\n show={state.showHelp}\n handleClose={() => {\n setState({ ...state, showHelp: false });\n }}\n >\n <div className=\"grid w-full grid-cols-2 place-content-center gap-2 p-5\">\n {shortcuts.map((s) => (\n <Fragment key={s.action}>\n <div>{s.action}</div>\n <div className=\"justify-self-end\">\n {s.codes\n .map<React.ReactNode>((c) => (\n <span\n key={c}\n className=\"rounded-md bg-slate-100 p-1 font-mono text-xs shadow-inner\"\n >\n {c}\n </span>\n ))\n .reduce((prev, curr) => [prev, \" + \", curr])}\n </div>\n </Fragment>\n ))}\n </div>\n </InfoDialog>\n <VerifyDialog\n title=\"Are all of the objects in this image labeled?\"\n description=\" \"\n maxWidthClass=\"max-w-lg\"\n handleCancel={() => {\n setState({ ...state, showVerify: false });\n }}\n show={state.showVerify}\n cancelText=\"Cancel\"\n button={\n <button\n type=\"button\"\n onClick={() => {\n save(true);\n setState({ ...state, showVerify: false });\n }}\n >\n <Button sm green>\n Yes, all objects are labeled\n </Button>\n </button>\n }\n >\n <div className=\"flex flex-wrap\">\n {props.labels.map((o) => (\n <div className=\"font-mono m-1 bg-slate-200 p-1 rounded-md\" key={o}>{o}</div>\n ))}\n </div>\n </VerifyDialog>\n <VerifyDialog\n title=\"Are you sure you want to delete this image?\"\n description=\"\"\n handleCancel={() => {\n setState({ ...state, showDelete: false });\n }}\n show={state.showDelete}\n cancelText=\"Cancel\"\n button={\n <button\n type=\"button\"\n onClick={() => {\n props.delete();\n setState({ ...state, showDelete: false });\n }}\n >\n <Button sm red>\n Yes, permanently delete\n </Button>\n </button>\n }\n >\n This cannot be undone.\n </VerifyDialog>\n <VerifyDialog\n title=\"Are you sure you want to delete this reported false positive?\"\n description=\" \"\n maxWidthClass=\"max-w-xl\"\n handleCancel={() => {\n setState({ ...state, showConfirmDeleteFalsePositive: false });\n }}\n show={state.showConfirmDeleteFalsePositive}\n cancelText=\"Cancel\"\n button={\n <button\n type=\"button\"\n onClick={() => {\n if (state.selectedBox) {\n deleteFP(state.selectedBox);\n }\n setState({\n ...state,\n showConfirmDeleteFalsePositive: false,\n selectedBox: undefined,\n });\n }}\n >\n <Button sm red>\n Do not teach my model that this is not a{\" \"}\n {state.selectedBox ? getFPLabel(state.selectedBox) : \" \"}\n </Button>\n </button>\n }\n >\n <p>\n False positives submitted from Frigate are used to improve your model\n and should not be deleted unless you submitted them accidentally.\n </p>\n </VerifyDialog>\n </>\n );\n};\n\nexport { ImageAnnotator };\n"],"names":["c","e","u","i","a","r","o","f","l","v","m","d","g","p","w","s","x","h","y","F","n","A","t","ImageAnnotator","props","shortcuts","bboxes","setBBoxes","useState","fpboxes","setFPBoxes","state","setState","ref","useRef","editorRef","transformRef","resize","naturalHeight","_a","aspectRatio","_b","editorHeight","_c","editorWidth","_d","maxHeight","maxWidth","desiredWidth","handleResize","useDebouncedCallback","useEffect","onResizeStop","elem","position","boxId","prev","onDragStop","onMouseDown","scale","bounds","onMouseUp","newId","out","left","top","width","height","onMouseMove","clickCreate","onClickBBox","selectedBox","b","moveBox","vertical","horizontal","resizeBox","toggleDifficult","cycleLabel","reverse","currentLabelIndex","label","lastIndex","newIndex","newLabel","deleteBox","deleteFP","getFPLabel","box","getBox","nextBox","currentIndex","stepSize","onKeyDown","next","save","onLoad","_e","onSaveLabel","onCancelLabel","verified","defaultZIndex","jsxs","Fragment","jsx","TransformWrapper","zoomIn","zoomOut","Button","TransformComponent","BoundingBox","BoundingBoxType","_delta","Crosshairs","LabelDialog","InfoDialog","curr","VerifyDialog"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"ImageAnnotator.js","sources":["../../node_modules/use-debounce/dist/index.module.js","../../src/components/ImageAnnotator.tsx"],"sourcesContent":["import{useRef as r,useEffect as n,useMemo as t,useReducer as e,useCallback as u}from\"react\";function c(e,u,c){var i=this,a=r(null),o=r(0),f=r(null),l=r([]),v=r(),m=r(),d=r(e),g=r(!0);d.current=e;var p=\"undefined\"!=typeof window,w=!u&&0!==u&&p;if(\"function\"!=typeof e)throw new TypeError(\"Expected a function\");u=+u||0;var s=!!(c=c||{}).leading,x=!(\"trailing\"in c)||!!c.trailing,h=\"maxWait\"in c,y=\"debounceOnServer\"in c&&!!c.debounceOnServer,F=h?Math.max(+c.maxWait||0,u):null;n(function(){return g.current=!0,function(){g.current=!1}},[]);var A=t(function(){var r=function(r){var n=l.current,t=v.current;return l.current=v.current=null,o.current=r,m.current=d.current.apply(t,n)},n=function(r,n){w&&cancelAnimationFrame(f.current),f.current=w?requestAnimationFrame(r):setTimeout(r,n)},t=function(r){if(!g.current)return!1;var n=r-a.current;return!a.current||n>=u||n<0||h&&r-o.current>=F},e=function(n){return f.current=null,x&&l.current?r(n):(l.current=v.current=null,m.current)},c=function r(){var c=Date.now();if(t(c))return e(c);if(g.current){var i=u-(c-a.current),f=h?Math.min(i,F-(c-o.current)):i;n(r,f)}},A=function(){if(p||y){var e=Date.now(),d=t(e);if(l.current=[].slice.call(arguments),v.current=i,a.current=e,d){if(!f.current&&g.current)return o.current=a.current,n(c,u),s?r(a.current):m.current;if(h)return n(c,u),r(a.current)}return f.current||n(c,u),m.current}};return A.cancel=function(){f.current&&(w?cancelAnimationFrame(f.current):clearTimeout(f.current)),o.current=0,l.current=a.current=v.current=f.current=null},A.isPending=function(){return!!f.current},A.flush=function(){return f.current?e(Date.now()):m.current},A},[s,h,u,F,x,w,p,y]);return A}function i(r,n){return r===n}function a(r,n){return n}function o(n,t,o){var f=o&&o.equalityFn||i,l=e(a,n),v=l[0],m=l[1],d=c(u(function(r){return m(r)},[m]),t,o),g=r(n);return f(g.current,n)||(d(n),g.current=n),[v,d]}function f(r,n,t){var e=void 0===t?{}:t,u=e.leading,i=e.trailing;return c(r,n,{maxWait:n,leading:void 0===u||u,trailing:void 0===i||i})}export{o as useDebounce,c as useDebouncedCallback,f as useThrottledCallback};\n//# sourceMappingURL=index.module.js.map\n","import {\n useState,\n useRef,\n MouseEventHandler,\n KeyboardEventHandler,\n Fragment,\n useEffect,\n} from \"react\";\n\nimport { Position, DraggableData } from \"react-rnd\";\n\nimport { Button } from \"./Button\";\nimport { Crosshairs } from \"./Crosshairs\";\nimport { InfoDialog } from \"./InfoDialog\";\nimport { LabelDialog } from \"./LabelDialog\";\nimport { VerifyDialog } from \"./VerifyDialog\";\nimport { BoundingBox, BoundingBoxType } from \"./BoundingBox\";\nimport { Annotation } from \"../types/Annotation\";\nimport { FalsePositive } from \"../types/FalsePositive\";\nimport { ReactZoomPanPinchRef, TransformComponent, TransformWrapper } from \"react-zoom-pan-pinch\";\nimport { useDebouncedCallback } from \"use-debounce\";\n\ninterface EditorState {\n createMode: boolean;\n drawingMode: boolean;\n showBoxes: boolean;\n drawStartX: number;\n drawStartY: number;\n selectedBox?: string;\n showLabeler: boolean;\n selectedLabel: string;\n difficult: boolean;\n height: number;\n width: number;\n showHelp: boolean;\n showVerify: boolean;\n showDelete: boolean;\n showTutorial: boolean;\n showConfirmDeleteFalsePositive: boolean;\n}\n\ninterface IImageAnnotationProps {\n annotations: Annotation[];\n suggestions: Annotation[];\n falsePositives: FalsePositive[];\n nextImage: () => void;\n save: (\n annotations: Annotation[],\n reviewedSuggestions: string[],\n deleteFalsePositive: boolean,\n verified: string[],\n ) => void;\n delete: () => void;\n back: () => void;\n imageUrl: string;\n labels: string[];\n manageLabelUrl?: string;\n verifiedLabels: string[];\n userAnnotationCount: number;\n}\n\ntype Pad = { leftPad: number; topPad: number };\n\n/**\n * A image annotation component.\n * @component\n * @params props - Component props.\n * @param props.annotations - Bounding boxes\n * @param props.save - Callback for the save button.\n */\nconst ImageAnnotator = (props: IImageAnnotationProps) => {\n const shortcuts = [\n { codes: [\"?\"], action: \"Shortcut help\" },\n { codes: [\"w\"], action: \"Add Box\" },\n { codes: [\"d\"], action: \"Mark Difficult\" },\n { codes: [\"s\"], action: \"Cycle Label\" },\n { codes: [\"Shift\", \"s\"], action: \"Previous Label\" },\n { codes: [\"Tab\"], action: \"Select Next Box\" },\n { codes: [\"Del\"], action: \"Delete Box\" },\n { codes: [\"Esc\"], action: \"Deselect/Cancel\" },\n { codes: [\"← ↑ → ↓\"], action: \"Move Box\" },\n { codes: [\"Shift\", \"← ↑ → ↓\"], action: \"Resize Box\" },\n { codes: [\"f\"], action: \"Toggle Unselected Boxes\" },\n { codes: [\"Spacebar\"], action: \"Verify and Save\" },\n ];\n\n const [bboxes, setBBoxes] = useState<Annotation[]>([]);\n\n const [fpboxes, setFPBoxes] = useState<FalsePositive[]>([]);\n\n const [state, setState] = useState<EditorState>({\n createMode: false,\n drawingMode: false,\n showBoxes: true,\n showLabeler: false,\n showHelp: false,\n showVerify: false,\n showDelete: false,\n showConfirmDeleteFalsePositive: false,\n showTutorial: props.userAnnotationCount === 0,\n drawStartX: 0,\n drawStartY: 0,\n selectedLabel: props.labels.find((l) => !(props.verifiedLabels ?? []).includes(l)) ?? props.labels[0],\n difficult: false,\n width: 1,\n height: 1,\n });\n\n const ref = useRef<HTMLImageElement>(null);\n\n const editorRef = useRef<HTMLDivElement>(null);\n\n const transformRef = useRef<ReactZoomPanPinchRef>(null);\n\n const resize = () => {\n const naturalHeight = ref.current?.naturalHeight ?? 1;\n const naturalWidth = ref.current?.naturalWidth ?? 1;\n const aspectRatio = naturalWidth/naturalHeight;\n\n const editorHeight = editorRef.current?.clientHeight ?? 0;\n const editorWidth = editorRef.current?.clientWidth ?? 0;\n\n const maxHeight = editorHeight - 5;\n const maxWidth = editorWidth - 5;\n const desiredWidth = maxHeight * aspectRatio;\n \n // if too wide when max height, then use maxWidth\n let calculatedWidth;\n let calculatedHeight;\n\n if (desiredWidth > maxWidth) {\n calculatedWidth = maxWidth;\n calculatedHeight = Math.round(maxWidth/aspectRatio);\n } else {\n calculatedWidth = desiredWidth;\n calculatedHeight = Math.round(desiredWidth/aspectRatio);\n }\n\n setState({\n ...state,\n width: calculatedWidth,\n height: calculatedHeight,\n });\n\n const leftPad = Math.max(0, (maxWidth*0.1) / 2);\n const topPad = Math.max(0, (maxHeight*0.1) / 2);\n\n return {leftPad, topPad};\n }\n\n const handleResize = useDebouncedCallback(() => {\n resize()\n }, 200);\n\n useEffect(() => {\n window.addEventListener('resize', handleResize);\n editorRef.current?.parentElement?.focus();\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, [handleResize]);\n \n const onResizeStop = (\n elem: HTMLElement,\n position: Position,\n boxId: string,\n ) => {\n setBBoxes((prev) =>\n prev.map((a) => {\n if (a.id === boxId) {\n return {\n ...a,\n x: position.x / state.width,\n y: position.y / state.height,\n w: elem.offsetWidth / state.width,\n h: elem.offsetHeight / state.height,\n };\n }\n return a;\n }),\n );\n };\n const onDragStop = (d: DraggableData, boxId: string) => {\n setBBoxes((prev) =>\n prev.map((a) => {\n if (a.id === boxId) {\n return {\n ...a,\n x: d.x / state.width,\n y: d.y / state.height,\n };\n }\n return a;\n }),\n );\n };\n\n const onMouseDown: MouseEventHandler<HTMLImageElement> = (e) => {\n if (state.createMode) {\n const scale = transformRef.current?.instance.transformState.scale ?? 1;\n const bounds = ref.current?.getBoundingClientRect();\n const x =\n (e.clientX - (bounds?.left ?? 0)) / scale /\n state.width;\n const y =\n (e.clientY - (bounds?.top ?? 0)) / scale /\n state.height;\n\n setState({\n ...state,\n drawingMode: true,\n drawStartX: x,\n drawStartY: y,\n selectedBox: \"draft\",\n });\n setBBoxes((prev) => [\n ...prev,\n {\n id: \"draft\",\n x,\n y,\n w: 0.0,\n h: 0.0,\n },\n ]);\n } else {\n setState({ ...state, selectedBox: undefined });\n }\n };\n\n const onMouseUp: MouseEventHandler<HTMLImageElement> = (e) => {\n if (state.drawingMode) {\n const newId = Date.now().toString();\n setState({\n ...state,\n drawingMode: false,\n createMode: false,\n selectedBox: newId,\n });\n setBBoxes((prev) =>\n prev.reduce<Annotation[]>((out, a) => {\n if (a.id === \"draft\") {\n const scale = transformRef.current?.instance.transformState.scale ?? 1;\n const bounds = ref.current?.getBoundingClientRect();\n const x =\n (e.clientX - (bounds?.left ?? 0)) / scale /\n state.width;\n const y =\n (e.clientY - (bounds?.top ?? 0)) / scale /\n state.height;\n\n if (\n Math.min(\n Math.abs(state.drawStartX - x),\n Math.abs(state.drawStartY - y),\n ) > 0.001\n ) {\n let left = Math.min(state.drawStartX, x);\n let top = Math.min(state.drawStartY, y);\n let width = Math.abs(state.drawStartX - x);\n let height = Math.abs(state.drawStartY - y);\n if (left < 0) {\n width -= Math.abs(left);\n left = 0;\n }\n if (top < 0) {\n height -= Math.abs(top);\n top = 0;\n }\n out.push({\n ...a,\n id: newId,\n label: state.selectedLabel,\n difficult: false,\n x: left,\n y: top,\n w: Math.min(1.0 - left, width),\n h: Math.min(1.0 - top, height),\n });\n }\n } else {\n out.push(a);\n }\n return out;\n }, []),\n );\n }\n };\n\n const onMouseMove: MouseEventHandler<HTMLImageElement> = (e) => {\n if (state.drawingMode) {\n setBBoxes((prev) =>\n prev.map((a) => {\n if (a.id === \"draft\") {\n const scale = transformRef.current?.instance.transformState.scale ?? 1;\n const bounds = ref.current?.getBoundingClientRect();\n const x =\n (e.pageX - (bounds?.left ?? 0)) / scale /\n state.width;\n const y =\n (e.pageY - (bounds?.top ?? 0)) / scale /\n state.height;\n\n return {\n ...a,\n x: Math.min(state.drawStartX, x),\n y: Math.min(state.drawStartY, y),\n w: Math.abs(state.drawStartX - x),\n h: Math.abs(state.drawStartY - y),\n };\n }\n return a;\n }),\n );\n }\n };\n\n const clickCreate: MouseEventHandler<HTMLButtonElement> = () => {\n setState({ ...state, createMode: !state.createMode });\n };\n\n const onClickBBox = (boxId: string) => {\n const selectedBox = bboxes.find((b) => b.id === boxId);\n setState({\n ...state,\n selectedBox: boxId,\n selectedLabel: selectedBox?.label ?? state.selectedLabel,\n difficult: selectedBox?.difficult ?? state.difficult,\n });\n };\n\n const moveBox = (boxId: string, vertical: number, horizontal: number) => {\n setBBoxes((prev) =>\n prev.map((a) => {\n if (a.id === boxId) {\n return {\n ...a,\n x: Math.min(\n 1.0 - a.w,\n Math.max(0.0, a.x + horizontal / state.width),\n ),\n y: Math.min(\n 1.0 - a.h,\n Math.max(0.0, a.y + vertical / state.height),\n ),\n };\n }\n return a;\n }),\n );\n };\n\n const resizeBox = (boxId: string, vertical: number, horizontal: number) => {\n setBBoxes((prev) =>\n prev.map((a) => {\n if (a.id === boxId) {\n return {\n ...a,\n w: Math.min(1.0 - a.x, a.w + horizontal / state.width),\n h: Math.min(1.0 - a.y, a.h + vertical / state.height),\n };\n }\n return a;\n }),\n );\n };\n\n const toggleDifficult = (boxId: string) => {\n setBBoxes((prev) =>\n prev.map((a) => {\n if (a.id === boxId) {\n return {\n ...a,\n difficult: !a.difficult,\n };\n }\n return a;\n }),\n );\n };\n\n const cycleLabel = (boxId: string, reverse = false) => {\n const currentLabelIndex = props.labels.findIndex(\n (label) => state.selectedLabel === label,\n );\n const lastIndex = props.labels.length - 1;\n\n let newIndex = 0;\n if (reverse) {\n newIndex = currentLabelIndex === 0 ? lastIndex : currentLabelIndex - 1;\n } else {\n newIndex = currentLabelIndex === lastIndex ? 0 : currentLabelIndex + 1;\n }\n const newLabel = props.labels[newIndex];\n setBBoxes((prev) =>\n prev.map((a) => {\n if (a.id === boxId) {\n return {\n ...a,\n label: newLabel,\n };\n }\n return a;\n }),\n );\n setState({ ...state, selectedLabel: newLabel });\n };\n\n const deleteBox = (boxId: string) => {\n setBBoxes((prev) => prev.filter((a) => a.id !== boxId));\n };\n\n const deleteFP = (boxId: string) => {\n setFPBoxes((prev) => prev.filter((a) => a.id !== boxId));\n };\n\n const getFPLabel = (boxId: string) => {\n return fpboxes.find((box) => box.id === boxId)?.label;\n };\n\n const getBox = (boxId: string) => {\n return bboxes.find((box) => box.id === boxId);\n };\n\n const nextBox = (boxId?: string) => {\n if (!boxId) {\n return bboxes[0].id;\n }\n const currentIndex = bboxes.findIndex((box) => box.id === boxId);\n if (currentIndex === bboxes.length - 1) {\n return bboxes[0].id;\n } else {\n return bboxes[currentIndex + 1].id;\n }\n };\n\n const stepSize = 5 / (transformRef.current?.instance.transformState.scale ?? 1);\n const onKeyDown: KeyboardEventHandler<HTMLDivElement> = (e) => {\n if (e.code === \"Escape\") {\n if (state.createMode) {\n setState({ ...state, createMode: false });\n } else {\n setState({ ...state, selectedBox: undefined });\n }\n }\n if (e.code === \"KeyW\") {\n if (!state.createMode) {\n setState({ ...state, createMode: true, selectedBox: undefined });\n } else {\n setState({ ...state, createMode: false });\n }\n }\n if (e.code === \"KeyF\") {\n setState({ ...state, showBoxes: !state.showBoxes });\n }\n if (e.code === \"KeyD\") {\n if (state.selectedBox) {\n toggleDifficult(state.selectedBox);\n }\n }\n if (e.code === \"KeyS\") {\n if (state.selectedBox) {\n cycleLabel(state.selectedBox, e.shiftKey);\n }\n }\n if (e.code === \"Delete\" && state.selectedBox) {\n deleteBox(state.selectedBox);\n setState({ ...state, selectedBox: undefined });\n }\n if (e.code === \"Tab\") {\n const next = nextBox(state.selectedBox);\n const box = getBox(next);\n setState({\n ...state,\n selectedBox: next,\n selectedLabel: box?.label ?? state.selectedLabel,\n });\n e.preventDefault();\n }\n if (e.code === \"Space\") {\n save(true);\n }\n if (e.code === \"Slash\" && e.shiftKey) {\n setState({ ...state, showHelp: true });\n }\n if (state.selectedBox) {\n if (e.code === \"ArrowLeft\") {\n if (e.shiftKey) {\n resizeBox(state.selectedBox, 0, -stepSize);\n } else {\n moveBox(state.selectedBox, 0, -stepSize);\n }\n }\n if (e.code === \"ArrowRight\") {\n if (e.shiftKey) {\n resizeBox(state.selectedBox, 0, stepSize);\n } else {\n moveBox(state.selectedBox, 0, stepSize);\n }\n }\n if (e.code === \"ArrowUp\") {\n if (e.shiftKey) {\n resizeBox(state.selectedBox, -stepSize, 0);\n } else {\n moveBox(state.selectedBox, -stepSize, 0);\n }\n }\n if (e.code === \"ArrowDown\") {\n if (e.shiftKey) {\n resizeBox(state.selectedBox, stepSize, 0);\n } else {\n moveBox(state.selectedBox, stepSize, 0);\n }\n }\n }\n };\n\n const onLoad = (_e: React.SyntheticEvent<HTMLImageElement>): Pad => {\n const pad = resize();\n\n setBBoxes(\n props.annotations\n .concat(props.suggestions)\n .sort((a, b) => b.w * b.h - a.w * a.h),\n );\n setFPBoxes(props.falsePositives.sort((a, b) => b.w * b.h - a.w * a.h));\n\n return pad\n };\n\n const onSaveLabel: MouseEventHandler<HTMLButtonElement> = () => {\n setState({ ...state, showLabeler: false });\n setBBoxes((prev) =>\n prev.map((a) => {\n if (a.id === state.selectedBox) {\n return {\n ...a,\n label: state.selectedLabel,\n difficult: state.difficult,\n };\n }\n return a;\n }),\n );\n };\n\n const onCancelLabel = () => {\n setState({ ...state, showLabeler: false });\n setBBoxes((prev) => prev.filter((a) => a.label));\n };\n \n const save = (verified: boolean) => {\n props.save(bboxes, props.suggestions.map((s) => s.id), fpboxes.length === 0, verified ? props.labels : []);\n }\n\n const defaultZIndex = state.showBoxes ? 0 : -1;\n\n return (\n <>\n <TransformWrapper ref={transformRef} disabled={state.createMode || state.drawingMode} minScale={0.9}>\n {({ zoomIn, zoomOut, setTransform }) => (\n <div\n className=\"flex h-screen min-w-[600px] flex-col bg-slate-900\"\n onKeyDown={onKeyDown}\n tabIndex={0}\n >\n <div className=\"flex flex-initial bg-slate-300 p-1\">\n <div className=\"flex-initial\">\n <button type=\"button\" onClick={props.back}>\n <Button secondary sm>\n Back\n </Button>\n </button>\n </div>\n <div className=\"flex flex-auto justify-center\">\n <button\n type=\"button\"\n onClick={() => {\n zoomOut();\n }}\n >\n <Button>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0zM13 10H7\"\n />\n </svg>\n </Button>\n </button>\n <button\n type=\"button\"\n onClick={() => {\n zoomIn();\n }}\n >\n <Button>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0zM10 7v3m0 0v3m0-3h3m-3 0H7\"\n />\n </svg>\n </Button>\n </button>\n <button type=\"button\" onClick={clickCreate}>\n <Button secondary sm>\n Add (w)\n </Button>\n </button>\n </div>\n <div className=\"flex-initial\">\n <button\n onClick={() => {\n setState({ ...state, showVerify: true });\n }}\n >\n <Button sm>Verify &amp; Save</Button>\n </button>\n <button\n onClick={() => {\n save(false);\n }}\n >\n <Button green sm>\n Save\n </Button>\n </button>\n <button\n onClick={() => {\n setState({ ...state, showDelete: true });\n }}\n >\n <Button red sm>\n Delete\n </Button>\n </button>\n <button\n onClick={() => {\n setState({ ...state, showHelp: true });\n }}\n >\n <Button sm secondary>\n ?\n </Button>\n </button>\n </div>\n </div>\n <div\n ref={editorRef}\n className=\"grid flex-auto place-content-center\"\n >\n <TransformComponent>\n <div\n className=\"grid place-content-center\"\n onMouseDown={onMouseDown}\n onMouseUp={onMouseUp}\n onMouseMove={onMouseMove}\n >\n <img\n ref={ref}\n className=\"col-start-1 row-start-1 h-full w-full\"\n alt=\"annotate\"\n src={props.imageUrl}\n onLoad={(e) => {\n const pad = onLoad(e);\n setTransform(pad.leftPad, pad.topPad, 0.9, 0)\n }}\n style={{\n width: state.width,\n height: state.height,\n }}\n />\n {fpboxes.map((box) => (\n <BoundingBox\n type={BoundingBoxType.falsePositive}\n label={box.label ?? \"\"}\n key={box.id}\n zIndex={box.id === state.selectedBox ? 1 : defaultZIndex}\n x={box.x * state.width}\n y={box.y * state.height}\n w={box.w * state.width}\n h={box.h * state.height}\n initialScale={transformRef.current?.instance.transformState.scale}\n selected={box.id === state.selectedBox}\n onMouseDown={(e: { stopPropagation: () => void }) => {\n if (!state.createMode) {\n onClickBBox(box.id);\n e.stopPropagation();\n }\n }}\n onClickDelete={() => {\n setState({\n ...state,\n showConfirmDeleteFalsePositive: true,\n });\n }}\n />\n ))}\n {bboxes.map((box) => (\n <BoundingBox\n type={\n box.suggestion\n ? BoundingBoxType.suggestion\n : BoundingBoxType.truePositive\n }\n label={box.label ?? \"\"}\n difficult={box.difficult}\n key={box.id}\n zIndex={box.id === state.selectedBox ? 1 : defaultZIndex}\n x={box.x * state.width}\n y={box.y * state.height}\n w={box.w * state.width}\n h={box.h * state.height}\n initialScale={transformRef.current?.instance.transformState.scale}\n selected={box.id === state.selectedBox}\n onMouseDown={(e: { stopPropagation: () => void }) => {\n if (!state.createMode) {\n onClickBBox(box.id);\n e.stopPropagation();\n }\n }}\n onDragStop={(_e, d) => {\n onDragStop(d, box.id);\n }}\n onResizeStop={(_e, _d, r: HTMLElement, _delta, p) => {\n onResizeStop(r, p, box.id);\n }}\n onClickDelete={() => {\n deleteBox(box.id);\n }}\n onClickEdit={() => {\n setState({ ...state, showLabeler: true });\n }}\n />\n ))}\n <Crosshairs\n className={`col-start-1 row-start-1 ${(state.createMode && !state.drawingMode) ? 'z-10' : '-z-10'}`}\n show={state.createMode && !state.drawingMode}\n />\n </div>\n </TransformComponent>\n </div>\n </div>\n )}\n </TransformWrapper>\n <LabelDialog\n title=\"Annotate\"\n show={state.showLabeler}\n cancelText=\"Cancel\"\n button={\n <button type=\"button\" onClick={onSaveLabel}>\n <Button sm green>\n Save\n </Button>\n </button>\n }\n handleCancel={onCancelLabel}\n >\n <div className=\"my-2 grid grid-cols-1 gap-y-2\">\n <div>\n <select\n className=\"w-full rounded-md border-gray-300 shadow-sm focus:border-primary-300 focus:ring focus:ring-primary-200 focus:ring-opacity-50\"\n value={state.selectedLabel}\n onChange={(e) => {\n setState({ ...state, selectedLabel: e.target.value });\n }}\n >\n {props.labels.map((o) => (\n <option key={o} value={o}>\n {o}\n </option>\n ))}\n </select>\n\n {props.manageLabelUrl && (\n <a className=\"text-primary-500 hover:text-primary-600 underline text-sm\" href={props.manageLabelUrl} target=\"_blank\">Manage Label Options</a>\n )}\n </div>\n <div className=\"flex items-center\">\n <input\n id=\"difficult\"\n className=\"border-gray-300 text-primary-600 shadow-sm hover:border-gray-300 focus:border-primary-300 focus:ring focus:ring-primary-200 focus:ring-opacity-50 focus:ring-offset-0 rounded\"\n type=\"checkbox\"\n checked={state.difficult}\n onChange={(e) => {\n setState({ ...state, difficult: e.target.checked });\n }}\n />\n <label htmlFor=\"difficult\" className=\"ml-2\">\n Difficult?\n </label>\n </div>\n </div>\n </LabelDialog>\n <InfoDialog\n title=\"Keyboard shortcuts\"\n show={state.showHelp}\n handleClose={() => {\n setState({ ...state, showHelp: false });\n }}\n >\n <div className=\"grid w-full grid-cols-2 place-content-center gap-2 p-5\">\n {shortcuts.map((s) => (\n <Fragment key={s.action}>\n <div>{s.action}</div>\n <div className=\"justify-self-end\">\n {s.codes\n .map<React.ReactNode>((c) => (\n <span\n key={c}\n className=\"rounded-md bg-slate-100 p-1 font-mono text-xs shadow-inner\"\n >\n {c}\n </span>\n ))\n .reduce((prev, curr) => [prev, \" + \", curr])}\n </div>\n </Fragment>\n ))}\n </div>\n </InfoDialog>\n <VerifyDialog\n title=\"Are all of the objects in this image labeled?\"\n description=\" \"\n maxWidthClass=\"max-w-lg\"\n handleCancel={() => {\n setState({ ...state, showVerify: false });\n }}\n show={state.showVerify}\n cancelText=\"Cancel\"\n button={\n <button\n type=\"button\"\n onClick={() => {\n save(true);\n setState({ ...state, showVerify: false });\n }}\n >\n <Button sm green>\n Yes, all objects are labeled\n </Button>\n </button>\n }\n >\n <div className=\"flex flex-wrap\">\n {props.labels.map((o) => (\n <div className=\"font-mono m-1 bg-slate-200 p-1 rounded-md\" key={o}>{o}</div>\n ))}\n </div>\n </VerifyDialog>\n <VerifyDialog\n title=\"Are you sure you want to delete this image?\"\n description=\"\"\n handleCancel={() => {\n setState({ ...state, showDelete: false });\n }}\n show={state.showDelete}\n cancelText=\"Cancel\"\n button={\n <button\n type=\"button\"\n onClick={() => {\n props.delete();\n setState({ ...state, showDelete: false });\n }}\n >\n <Button sm red>\n Yes, permanently delete\n </Button>\n </button>\n }\n >\n This cannot be undone.\n </VerifyDialog>\n <VerifyDialog\n title=\"Are you sure you want to delete this reported false positive?\"\n description=\" \"\n maxWidthClass=\"max-w-xl\"\n handleCancel={() => {\n setState({ ...state, showConfirmDeleteFalsePositive: false });\n }}\n show={state.showConfirmDeleteFalsePositive}\n cancelText=\"Cancel\"\n button={\n <button\n type=\"button\"\n onClick={() => {\n if (state.selectedBox) {\n deleteFP(state.selectedBox);\n }\n setState({\n ...state,\n showConfirmDeleteFalsePositive: false,\n selectedBox: undefined,\n });\n }}\n >\n <Button sm red>\n Do not teach my model that this is not a{\" \"}\n {state.selectedBox ? getFPLabel(state.selectedBox) : \" \"}\n </Button>\n </button>\n }\n >\n <p>\n False positives submitted from Frigate are used to improve your model\n and should not be deleted unless you submitted them accidentally.\n </p>\n </VerifyDialog>\n </>\n );\n};\n\nexport { ImageAnnotator };\n"],"names":["c","e","u","i","a","r","o","f","l","v","m","d","g","p","w","s","x","h","y","F","n","A","t","ImageAnnotator","props","shortcuts","bboxes","setBBoxes","useState","fpboxes","setFPBoxes","state","setState","ref","useRef","editorRef","transformRef","resize","naturalHeight","_a","aspectRatio","_b","editorHeight","_c","editorWidth","_d","maxHeight","maxWidth","desiredWidth","calculatedWidth","calculatedHeight","leftPad","topPad","handleResize","useDebouncedCallback","useEffect","onResizeStop","elem","position","boxId","prev","onDragStop","onMouseDown","scale","bounds","onMouseUp","newId","out","left","top","width","height","onMouseMove","clickCreate","onClickBBox","selectedBox","b","moveBox","vertical","horizontal","resizeBox","toggleDifficult","cycleLabel","reverse","currentLabelIndex","label","lastIndex","newIndex","newLabel","deleteBox","deleteFP","getFPLabel","box","getBox","nextBox","currentIndex","stepSize","onKeyDown","next","save","onLoad","_e","pad","onSaveLabel","onCancelLabel","verified","defaultZIndex","jsxs","Fragment","jsx","TransformWrapper","zoomIn","zoomOut","setTransform","Button","TransformComponent","BoundingBox","BoundingBoxType","_delta","Crosshairs","LabelDialog","InfoDialog","curr","VerifyDialog"],"mappings":"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","x_google_ignoreList":[0]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frigate-nvr/image-annotator",
3
- "version": "1.0.10",
3
+ "version": "1.0.11",
4
4
  "description": "image annotator designed for frigate nvr",
5
5
  "exports": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -43,6 +43,7 @@
43
43
  "classnames": "^2.5.1",
44
44
  "eslint": "^8.57.0",
45
45
  "eslint-config-prettier": "^9.1.0",
46
+ "eslint-plugin-react-hooks": "^7.0.0",
46
47
  "glob": "^11.0.0",
47
48
  "globals": "^15.8.0",
48
49
  "postcss": "^8.4.40",