@frigate-nvr/image-annotator 1.0.11 → 1.0.13

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,5 +1,5 @@
1
1
  import { jsxs as a, jsx as l } from "react/jsx-runtime";
2
- import { g as x } from "../_commonjsHelpers-DjF3Plf2.js";
2
+ import { g as d } from "../_commonjsHelpers-DjF3Plf2.js";
3
3
  var c = { exports: {} };
4
4
  /*!
5
5
  Copyright (c) 2018 Jed Watson.
@@ -36,8 +36,8 @@ var c = { exports: {} };
36
36
  t.exports ? (i.default = i, t.exports = i) : window.classNames = i;
37
37
  })();
38
38
  })(c);
39
- var d = c.exports;
40
- const m = /* @__PURE__ */ x(d), b = (t) => {
39
+ var x = c.exports;
40
+ const m = /* @__PURE__ */ d(x), b = (t) => {
41
41
  const o = m({
42
42
  "text-sm py-2 px-2": t.xs,
43
43
  "text-base font-medium py-2 px-3": t.sm,
@@ -47,7 +47,8 @@ const m = /* @__PURE__ */ x(d), b = (t) => {
47
47
  "text-white bg-primary-700 border-gray-100 hover:bg-primary-900 active:bg-primary-800": !t.secondary && !t.red && !t.green,
48
48
  "text-white bg-red-500 border-gray-100 hover:bg-red-600 active:bg-red-500": t.red,
49
49
  "text-white bg-green-600 border-gray-100 hover:bg-green-700 active:bg-green-600": t.green,
50
- "w-full": t.full
50
+ "w-full": t.full,
51
+ "opacity-50 cursor-not-allowed pointer-events-none": t.disabled
51
52
  });
52
53
  return (
53
54
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
@@ -1 +1 @@
1
- {"version":3,"file":"Button.js","sources":["../../node_modules/classnames/index.js","../../src/components/Button.tsx"],"sourcesContent":["/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","import { ReactNode } from \"react\";\n\nimport classNames from \"classnames\";\n\ninterface IButtonProps {\n loading?: boolean;\n xs?: boolean;\n sm?: boolean;\n xl?: boolean;\n secondary?: boolean;\n red?: boolean;\n green?: boolean;\n full?: boolean;\n children: ReactNode;\n}\n\n/**\n * @component\n * @params props - Component props.\n * @param props.loading - Display loading indicator.\n * @param props.xs - Button in xs size.\n * @param props.sm - Button in sm size.\n * @param props.xl - Button in xl size.\n * @param props.secondary - Indicates if the button is a secondary button.\n * @param props.red - Indicates if the button is a red button.\n * @param props.green - Indicates if the button is a green button.\n * @param props.full - Indicates if the button takes 100% width.\n * @param props.children - Children components.\n */\nconst Button = (props: IButtonProps) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n const btnClass = classNames({\n \"text-sm py-2 px-2\": props.xs,\n \"text-base font-medium py-2 px-3\": props.sm,\n \"font-extrabold text-xl py-4 px-6\": props.xl,\n \"text-lg font-semibold py-2 px-4\": !props.xl,\n \"bg-white text-gray-700 border-gray-400 hover:bg-gray-100 active:bg-white\": props.secondary,\n \"text-white bg-primary-700 border-gray-100 hover:bg-primary-900 active:bg-primary-800\": !props.secondary && !props.red && !props.green,\n \"text-white bg-red-500 border-gray-100 hover:bg-red-600 active:bg-red-500\": props.red,\n \"text-white bg-green-600 border-gray-100 hover:bg-green-700 active:bg-green-600\": props.green,\n \"w-full\": props.full,\n });\n\n return (\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n <div className={`inline-flex rounded-md border items-center justify-center ${btnClass}`}>\n {props.loading && (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"animate-spin h-5 w-5 text-white mr-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" />\n <path\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n )}\n\n {props.children}\n </div>\n );\n};\n\nexport { Button };\n"],"names":["hasOwn","classNames","classes","i","arg","appendClass","parseValue","key","value","newClass","module","Button","props","btnClass","jsxs","jsx"],"mappings":";;;;;;;;;AAOA,GAAC,WAAY;AAGZ,QAAIA,IAAS,CAAE,EAAC;AAEhB,aAASC,IAAc;AAGtB,eAFIC,IAAU,IAELC,IAAI,GAAGA,IAAI,UAAU,QAAQA,KAAK;AAC1C,YAAIC,IAAM,UAAUD,CAAC;AACrB,QAAIC,MACHF,IAAUG,EAAYH,GAASI,EAAWF,CAAG,CAAC;AAAA,MAE/C;AAED,aAAOF;AAAA,IACP;AAED,aAASI,EAAYF,GAAK;AACzB,UAAI,OAAOA,KAAQ,YAAY,OAAOA,KAAQ;AAC7C,eAAOA;AAGR,UAAI,OAAOA,KAAQ;AAClB,eAAO;AAGR,UAAI,MAAM,QAAQA,CAAG;AACpB,eAAOH,EAAW,MAAM,MAAMG,CAAG;AAGlC,UAAIA,EAAI,aAAa,OAAO,UAAU,YAAY,CAACA,EAAI,SAAS,SAAQ,EAAG,SAAS,eAAe;AAClG,eAAOA,EAAI;AAGZ,UAAIF,IAAU;AAEd,eAASK,KAAOH;AACf,QAAIJ,EAAO,KAAKI,GAAKG,CAAG,KAAKH,EAAIG,CAAG,MACnCL,IAAUG,EAAYH,GAASK,CAAG;AAIpC,aAAOL;AAAA,IACP;AAED,aAASG,EAAaG,GAAOC,GAAU;AACtC,aAAKA,IAIDD,IACIA,IAAQ,MAAMC,IAGfD,IAAQC,IAPPD;AAAA,IAQR;AAED,IAAqCE,EAAO,WAC3CT,EAAW,UAAUA,GACrBS,EAAA,UAAiBT,KAOjB,OAAO,aAAaA;AAAA,EAEtB;;;gCC/CMU,IAAS,CAACC,MAAwB;AAEtC,QAAMC,IAAWZ,EAAW;AAAA,IAC1B,qBAAqBW,EAAM;AAAA,IAC3B,mCAAmCA,EAAM;AAAA,IACzC,oCAAoCA,EAAM;AAAA,IAC1C,mCAAmC,CAACA,EAAM;AAAA,IAC1C,4EAA4EA,EAAM;AAAA,IAClF,wFAAwF,CAACA,EAAM,aAAa,CAACA,EAAM,OAAO,CAACA,EAAM;AAAA,IACjI,4EAA4EA,EAAM;AAAA,IAClF,kFAAkFA,EAAM;AAAA,IACxF,UAAUA,EAAM;AAAA,EAAA,CACjB;AAED;AAAA;AAAA,IAEG,gBAAAE,EAAA,OAAA,EAAI,WAAW,6DAA6DD,CAAQ,IAClF,UAAA;AAAA,MAAAD,EAAM,WACL,gBAAAE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,WAAU;AAAA,UACV,MAAK;AAAA,UACL,SAAQ;AAAA,UAER,UAAA;AAAA,YAAC,gBAAAC,EAAA,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,QAAO,eAAe,CAAA;AAAA,YACrD,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,GAAE;AAAA,cAAA;AAAA,YACJ;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,MAGDH,EAAM;AAAA,IAAA,GACT;AAAA;AAEJ;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"Button.js","sources":["../../node_modules/classnames/index.js","../../src/components/Button.tsx"],"sourcesContent":["/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","import { ReactNode } from \"react\";\n\nimport classNames from \"classnames\";\n\ninterface IButtonProps {\n loading?: boolean;\n xs?: boolean;\n sm?: boolean;\n xl?: boolean;\n secondary?: boolean;\n red?: boolean;\n green?: boolean;\n full?: boolean;\n disabled?: boolean;\n children: ReactNode;\n}\n\n/**\n * @component\n * @params props - Component props.\n * @param props.loading - Display loading indicator.\n * @param props.xs - Button in xs size.\n * @param props.sm - Button in sm size.\n * @param props.xl - Button in xl size.\n * @param props.secondary - Indicates if the button is a secondary button.\n * @param props.red - Indicates if the button is a red button.\n * @param props.green - Indicates if the button is a green button.\n * @param props.full - Indicates if the button takes 100% width.\n * @param props.disabled - Renders the button dimmed and non-interactive.\n * @param props.children - Children components.\n */\nconst Button = (props: IButtonProps) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call\n const btnClass = classNames({\n \"text-sm py-2 px-2\": props.xs,\n \"text-base font-medium py-2 px-3\": props.sm,\n \"font-extrabold text-xl py-4 px-6\": props.xl,\n \"text-lg font-semibold py-2 px-4\": !props.xl,\n \"bg-white text-gray-700 border-gray-400 hover:bg-gray-100 active:bg-white\": props.secondary,\n \"text-white bg-primary-700 border-gray-100 hover:bg-primary-900 active:bg-primary-800\": !props.secondary && !props.red && !props.green,\n \"text-white bg-red-500 border-gray-100 hover:bg-red-600 active:bg-red-500\": props.red,\n \"text-white bg-green-600 border-gray-100 hover:bg-green-700 active:bg-green-600\": props.green,\n \"w-full\": props.full,\n \"opacity-50 cursor-not-allowed pointer-events-none\": props.disabled,\n });\n\n return (\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n <div className={`inline-flex rounded-md border items-center justify-center ${btnClass}`}>\n {props.loading && (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"animate-spin h-5 w-5 text-white mr-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" />\n <path\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n )}\n\n {props.children}\n </div>\n );\n};\n\nexport { Button };\n"],"names":["hasOwn","classNames","classes","i","arg","appendClass","parseValue","key","value","newClass","module","Button","props","btnClass","jsxs","jsx"],"mappings":";;;;;;;;;AAOA,GAAC,WAAY;AAGZ,QAAIA,IAAS,CAAE,EAAC;AAEhB,aAASC,IAAc;AAGtB,eAFIC,IAAU,IAELC,IAAI,GAAGA,IAAI,UAAU,QAAQA,KAAK;AAC1C,YAAIC,IAAM,UAAUD,CAAC;AACrB,QAAIC,MACHF,IAAUG,EAAYH,GAASI,EAAWF,CAAG,CAAC;AAAA,MAE/C;AAED,aAAOF;AAAA,IACP;AAED,aAASI,EAAYF,GAAK;AACzB,UAAI,OAAOA,KAAQ,YAAY,OAAOA,KAAQ;AAC7C,eAAOA;AAGR,UAAI,OAAOA,KAAQ;AAClB,eAAO;AAGR,UAAI,MAAM,QAAQA,CAAG;AACpB,eAAOH,EAAW,MAAM,MAAMG,CAAG;AAGlC,UAAIA,EAAI,aAAa,OAAO,UAAU,YAAY,CAACA,EAAI,SAAS,SAAQ,EAAG,SAAS,eAAe;AAClG,eAAOA,EAAI;AAGZ,UAAIF,IAAU;AAEd,eAASK,KAAOH;AACf,QAAIJ,EAAO,KAAKI,GAAKG,CAAG,KAAKH,EAAIG,CAAG,MACnCL,IAAUG,EAAYH,GAASK,CAAG;AAIpC,aAAOL;AAAA,IACP;AAED,aAASG,EAAaG,GAAOC,GAAU;AACtC,aAAKA,IAIDD,IACIA,IAAQ,MAAMC,IAGfD,IAAQC,IAPPD;AAAA,IAQR;AAED,IAAqCE,EAAO,WAC3CT,EAAW,UAAUA,GACrBS,EAAA,UAAiBT,KAOjB,OAAO,aAAaA;AAAA,EAEtB;;;gCC7CMU,IAAS,CAACC,MAAwB;AAEtC,QAAMC,IAAWZ,EAAW;AAAA,IAC1B,qBAAqBW,EAAM;AAAA,IAC3B,mCAAmCA,EAAM;AAAA,IACzC,oCAAoCA,EAAM;AAAA,IAC1C,mCAAmC,CAACA,EAAM;AAAA,IAC1C,4EAA4EA,EAAM;AAAA,IAClF,wFAAwF,CAACA,EAAM,aAAa,CAACA,EAAM,OAAO,CAACA,EAAM;AAAA,IACjI,4EAA4EA,EAAM;AAAA,IAClF,kFAAkFA,EAAM;AAAA,IACxF,UAAUA,EAAM;AAAA,IAChB,qDAAqDA,EAAM;AAAA,EAAA,CAC5D;AAED;AAAA;AAAA,IAEG,gBAAAE,EAAA,OAAA,EAAI,WAAW,6DAA6DD,CAAQ,IAClF,UAAA;AAAA,MAAAD,EAAM,WACL,gBAAAE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,WAAU;AAAA,UACV,MAAK;AAAA,UACL,SAAQ;AAAA,UAER,UAAA;AAAA,YAAC,gBAAAC,EAAA,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,QAAO,eAAe,CAAA;AAAA,YACrD,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,GAAE;AAAA,cAAA;AAAA,YACJ;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,MAGDH,EAAM;AAAA,IAAA,GACT;AAAA;AAEJ;","x_google_ignoreList":[0]}
@@ -1,66 +1,66 @@
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
- import { Button as b } from "./Button.js";
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
- x = +x || 0;
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;
1
+ import { jsxs as B, Fragment as de, jsx as l } from "react/jsx-runtime";
2
+ import { useRef as M, useEffect as ee, useMemo as ue, useState as $, Fragment as he } from "react";
3
+ import { Button as p } from "./Button.js";
4
+ import { Crosshairs as fe } from "./Crosshairs.js";
5
+ import { InfoDialog as me } from "./InfoDialog.js";
6
+ import { LabelDialog as we } from "./LabelDialog.js";
7
+ import { VerifyDialog as J } from "./VerifyDialog.js";
8
+ import { BoundingBox as ie, BoundingBoxType as Q } from "./BoundingBox.js";
9
+ import { T as ge, a as xe } from "../index.esm-FeyXGhGs.js";
10
+ function ye(c, y, h) {
11
+ var w = this, b = M(null), k = M(0), d = M(null), L = M([]), e = M(), o = M(), D = M(c), C = M(!0);
12
+ D.current = c;
13
+ var v = typeof window < "u", P = !y && y !== 0 && v;
14
+ if (typeof c != "function") throw new TypeError("Expected a function");
15
+ y = +y || 0;
16
+ var I = !!(h = h || {}).leading, _ = !("trailing" in h) || !!h.trailing, W = "maxWait" in h, O = "debounceOnServer" in h && !!h.debounceOnServer, Y = W ? Math.max(+h.maxWait || 0, y) : null;
17
+ ee(function() {
18
+ return C.current = !0, function() {
19
+ C.current = !1;
20
20
  };
21
21
  }, []);
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
- var w = Date.now();
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);
22
+ var q = ue(function() {
23
+ var X = function(f) {
24
+ var g = L.current, R = e.current;
25
+ return L.current = e.current = null, k.current = f, o.current = D.current.apply(R, g);
26
+ }, A = function(f, g) {
27
+ P && cancelAnimationFrame(d.current), d.current = P ? requestAnimationFrame(f) : setTimeout(f, g);
28
+ }, T = function(f) {
29
+ if (!C.current) return !1;
30
+ var g = f - b.current;
31
+ return !b.current || g >= y || g < 0 || W && f - k.current >= Y;
32
+ }, z = function(f) {
33
+ return d.current = null, _ && L.current ? X(f) : (L.current = e.current = null, o.current);
34
+ }, E = function f() {
35
+ var g = Date.now();
36
+ if (T(g)) return z(g);
37
+ if (C.current) {
38
+ var R = y - (g - b.current), Z = W ? Math.min(R, Y - (g - k.current)) : R;
39
+ A(f, Z);
40
40
  }
41
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);
42
+ if (v || O) {
43
+ var f = Date.now(), g = T(f);
44
+ if (L.current = [].slice.call(arguments), e.current = w, b.current = f, g) {
45
+ if (!d.current && C.current) return k.current = b.current, A(E, y), I ? X(b.current) : o.current;
46
+ if (W) return A(E, y), X(b.current);
47
47
  }
48
- return e.current || L(H, x), B.current;
48
+ return d.current || A(E, y), o.current;
49
49
  }
50
50
  };
51
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;
52
+ d.current && (P ? cancelAnimationFrame(d.current) : clearTimeout(d.current)), k.current = 0, L.current = b.current = e.current = d.current = null;
53
53
  }, K.isPending = function() {
54
- return !!e.current;
54
+ return !!d.current;
55
55
  }, K.flush = function() {
56
- return e.current ? $(Date.now()) : B.current;
56
+ return d.current ? z(Date.now()) : o.current;
57
57
  }, K;
58
- }, [j, W, x, Y, V, z, A, U]);
59
- return _;
58
+ }, [I, W, y, Y, _, P, v, O]);
59
+ return q;
60
60
  }
61
- const Le = (o) => {
62
- var ee;
63
- const x = [
61
+ const ke = (c) => {
62
+ var ne;
63
+ const y = [
64
64
  { codes: ["?"], action: "Shortcut help" },
65
65
  { codes: ["w"], action: "Add Box" },
66
66
  { codes: ["d"], action: "Mark Difficult" },
@@ -73,7 +73,7 @@ const Le = (o) => {
73
73
  { codes: ["Shift", "← ↑ → ↓"], action: "Resize Box" },
74
74
  { codes: ["f"], action: "Toggle Unselected Boxes" },
75
75
  { codes: ["Spacebar"], action: "Verify and Save" }
76
- ], [u, m] = Z([]), [y, k] = Z([]), [e, a] = Z({
76
+ ], [h, w] = $([]), [b, k] = $([]), [d, L] = $(!1), [e, o] = $({
77
77
  createMode: !1,
78
78
  drawingMode: !1,
79
79
  showBoxes: !0,
@@ -82,228 +82,230 @@ const Le = (o) => {
82
82
  showVerify: !1,
83
83
  showDelete: !1,
84
84
  showConfirmDeleteFalsePositive: !1,
85
- showTutorial: o.userAnnotationCount === 0,
85
+ showTutorial: c.userAnnotationCount === 0,
86
86
  drawStartX: 0,
87
87
  drawStartY: 0,
88
- selectedLabel: o.labels.find((t) => !(o.verifiedLabels ?? []).includes(t)) ?? o.labels[0],
88
+ selectedLabel: c.labels.find((t) => !(c.verifiedLabels ?? []).includes(t)) ?? c.labels[0],
89
89
  difficult: !1,
90
90
  width: 1,
91
91
  height: 1
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({
92
+ }), D = M(null), C = M(null), v = M(null), P = () => {
93
+ var F, V, U, re;
94
+ const t = ((F = D.current) == null ? void 0 : F.naturalHeight) ?? 1, i = (((V = D.current) == null ? void 0 : V.naturalWidth) ?? 1) / t, r = ((U = C.current) == null ? void 0 : U.clientHeight) ?? 0, a = ((re = C.current) == null ? void 0 : re.clientWidth) ?? 0, u = r - 5, s = a - 5, m = u * i;
95
+ let x, S;
96
+ m > s ? (x = s, S = Math.round(s / i)) : (x = m, S = Math.round(m / i)), o({
97
97
  ...e,
98
- width: g,
99
- height: D
98
+ width: x,
99
+ height: S
100
100
  });
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();
101
+ const j = x * 0.1 / 2, H = S * 0.1 / 2;
102
+ return { leftPad: j, topPad: H };
103
+ }, I = ye(() => {
104
+ P();
105
105
  }, 200);
106
- re(() => {
106
+ ee(() => {
107
107
  var t, n;
108
- return window.addEventListener("resize", A), (n = (t = B.current) == null ? void 0 : t.parentElement) == null || n.focus(), () => {
109
- window.removeEventListener("resize", A);
108
+ return window.addEventListener("resize", I), (n = (t = C.current) == null ? void 0 : t.parentElement) == null || n.focus(), () => {
109
+ window.removeEventListener("resize", I);
110
110
  };
111
- }, [A]);
112
- const z = (t, n, i) => {
113
- m(
114
- (r) => r.map((c) => c.id === i ? {
115
- ...c,
111
+ }, [I]), ee(() => {
112
+ L(!1);
113
+ }, [c.imageUrl]);
114
+ const _ = (t, n, i) => {
115
+ w(
116
+ (r) => r.map((a) => a.id === i ? {
117
+ ...a,
116
118
  x: n.x / e.width,
117
119
  y: n.y / e.height,
118
120
  w: t.offsetWidth / e.width,
119
121
  h: t.offsetHeight / e.height
120
- } : c)
122
+ } : a)
121
123
  );
122
- }, j = (t, n) => {
123
- m(
124
+ }, W = (t, n) => {
125
+ w(
124
126
  (i) => i.map((r) => r.id === n ? {
125
127
  ...r,
126
128
  x: t.x / e.width,
127
129
  y: t.y / e.height
128
130
  } : r)
129
131
  );
130
- }, V = (t) => {
132
+ }, O = (t) => {
131
133
  var n, i;
132
134
  if (e.createMode) {
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
+ const r = ((n = v.current) == null ? void 0 : n.instance.transformState.scale) ?? 1, a = (i = D.current) == null ? void 0 : i.getBoundingClientRect(), u = (t.clientX - ((a == null ? void 0 : a.left) ?? 0)) / r / e.width, s = (t.clientY - ((a == null ? void 0 : a.top) ?? 0)) / r / e.height;
136
+ o({
135
137
  ...e,
136
138
  drawingMode: !0,
137
- drawStartX: d,
139
+ drawStartX: u,
138
140
  drawStartY: s,
139
141
  selectedBox: "draft"
140
- }), m((h) => [
141
- ...h,
142
+ }), w((m) => [
143
+ ...m,
142
144
  {
143
145
  id: "draft",
144
- x: d,
146
+ x: u,
145
147
  y: s,
146
148
  w: 0,
147
149
  h: 0
148
150
  }
149
151
  ]);
150
152
  } else
151
- a({ ...e, selectedBox: void 0 });
152
- }, W = (t) => {
153
+ o({ ...e, selectedBox: void 0 });
154
+ }, Y = (t) => {
153
155
  if (e.drawingMode) {
154
156
  const n = Date.now().toString();
155
- a({
157
+ o({
156
158
  ...e,
157
159
  drawingMode: !1,
158
160
  createMode: !1,
159
161
  selectedBox: n
160
- }), m(
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;
162
+ }), w(
163
+ (i) => i.reduce((r, a) => {
164
+ var u, s;
165
+ if (a.id === "draft") {
166
+ const m = ((u = v.current) == null ? void 0 : u.instance.transformState.scale) ?? 1, x = (s = D.current) == null ? void 0 : s.getBoundingClientRect(), S = (t.clientX - ((x == null ? void 0 : x.left) ?? 0)) / m / e.width, j = (t.clientY - ((x == null ? void 0 : x.top) ?? 0)) / m / e.height;
165
167
  if (Math.min(
166
- Math.abs(e.drawStartX - D),
167
- Math.abs(e.drawStartY - I)
168
+ Math.abs(e.drawStartX - S),
169
+ Math.abs(e.drawStartY - j)
168
170
  ) > 1e-3) {
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,
171
+ let H = Math.min(e.drawStartX, S), F = Math.min(e.drawStartY, j), V = Math.abs(e.drawStartX - S), U = Math.abs(e.drawStartY - j);
172
+ H < 0 && (V -= Math.abs(H), H = 0), F < 0 && (U -= Math.abs(F), F = 0), r.push({
173
+ ...a,
172
174
  id: n,
173
175
  label: e.selectedLabel,
174
176
  difficult: !1,
175
- x: T,
176
- y: P,
177
- w: Math.min(1 - T, X),
178
- h: Math.min(1 - P, E)
177
+ x: H,
178
+ y: F,
179
+ w: Math.min(1 - H, V),
180
+ h: Math.min(1 - F, U)
179
181
  });
180
182
  }
181
183
  } else
182
- r.push(c);
184
+ r.push(a);
183
185
  return r;
184
186
  }, [])
185
187
  );
186
188
  }
187
- }, U = (t) => {
188
- e.drawingMode && m(
189
+ }, q = (t) => {
190
+ e.drawingMode && w(
189
191
  (n) => n.map((i) => {
190
- var r, c;
192
+ var r, a;
191
193
  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;
194
+ const u = ((r = v.current) == null ? void 0 : r.instance.transformState.scale) ?? 1, s = (a = D.current) == null ? void 0 : a.getBoundingClientRect(), m = (t.pageX - ((s == null ? void 0 : s.left) ?? 0)) / u / e.width, x = (t.pageY - ((s == null ? void 0 : s.top) ?? 0)) / u / e.height;
193
195
  return {
194
196
  ...i,
195
- x: Math.min(e.drawStartX, h),
196
- y: Math.min(e.drawStartY, g),
197
- w: Math.abs(e.drawStartX - h),
198
- h: Math.abs(e.drawStartY - g)
197
+ x: Math.min(e.drawStartX, m),
198
+ y: Math.min(e.drawStartY, x),
199
+ w: Math.abs(e.drawStartX - m),
200
+ h: Math.abs(e.drawStartY - x)
199
201
  };
200
202
  }
201
203
  return i;
202
204
  })
203
205
  );
204
- }, Y = () => {
205
- a({ ...e, createMode: !e.createMode });
206
- }, _ = (t) => {
207
- const n = u.find((i) => i.id === t);
208
- a({
206
+ }, X = () => {
207
+ o({ ...e, createMode: !e.createMode });
208
+ }, A = (t) => {
209
+ const n = h.find((i) => i.id === t);
210
+ o({
209
211
  ...e,
210
212
  selectedBox: t,
211
213
  selectedLabel: (n == null ? void 0 : n.label) ?? e.selectedLabel,
212
214
  difficult: (n == null ? void 0 : n.difficult) ?? e.difficult
213
215
  });
214
- }, F = (t, n, i) => {
215
- m(
216
- (r) => r.map((c) => c.id === t ? {
217
- ...c,
216
+ }, T = (t, n, i) => {
217
+ w(
218
+ (r) => r.map((a) => a.id === t ? {
219
+ ...a,
218
220
  x: Math.min(
219
- 1 - c.w,
220
- Math.max(0, c.x + i / e.width)
221
+ 1 - a.w,
222
+ Math.max(0, a.x + i / e.width)
221
223
  ),
222
224
  y: Math.min(
223
- 1 - c.h,
224
- Math.max(0, c.y + n / e.height)
225
+ 1 - a.h,
226
+ Math.max(0, a.y + n / e.height)
225
227
  )
226
- } : c)
228
+ } : a)
227
229
  );
228
- }, L = (t, n, i) => {
229
- m(
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)
230
+ }, z = (t, n, i) => {
231
+ w(
232
+ (r) => r.map((a) => a.id === t ? {
233
+ ...a,
234
+ w: Math.min(1 - a.x, a.w + i / e.width),
235
+ h: Math.min(1 - a.y, a.h + n / e.height)
236
+ } : a)
235
237
  );
236
- }, O = (t) => {
237
- m(
238
+ }, E = (t) => {
239
+ w(
238
240
  (n) => n.map((i) => i.id === t ? {
239
241
  ...i,
240
242
  difficult: !i.difficult
241
243
  } : i)
242
244
  );
243
- }, $ = (t, n = !1) => {
244
- const i = o.labels.findIndex(
245
+ }, K = (t, n = !1) => {
246
+ const i = c.labels.findIndex(
245
247
  (s) => e.selectedLabel === s
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
- m(
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));
248
+ ), r = c.labels.length - 1;
249
+ let a = 0;
250
+ n ? a = i === 0 ? r : i - 1 : a = i === r ? 0 : i + 1;
251
+ const u = c.labels[a];
252
+ w(
253
+ (s) => s.map((m) => m.id === t ? {
254
+ ...m,
255
+ label: u
256
+ } : m)
257
+ ), o({ ...e, selectedLabel: u });
260
258
  }, f = (t) => {
259
+ w((n) => n.filter((i) => i.id !== t));
260
+ }, g = (t) => {
261
+ k((n) => n.filter((i) => i.id !== t));
262
+ }, R = (t) => {
261
263
  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
+ return (n = b.find((i) => i.id === t)) == null ? void 0 : n.label;
265
+ }, Z = (t) => h.find((n) => n.id === t), le = (t) => {
264
266
  if (!t)
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({
267
+ return h[0].id;
268
+ const n = h.findIndex((i) => i.id === t);
269
+ return n === h.length - 1 ? h[0].id : h[n + 1].id;
270
+ }, N = 5 / (((ne = v.current) == null ? void 0 : ne.instance.transformState.scale) ?? 1), ae = (t) => {
271
+ if (t.code === "Escape" && (e.createMode ? o({ ...e, createMode: !1 }) : o({ ...e, selectedBox: void 0 })), t.code === "KeyW" && (e.createMode ? o({ ...e, createMode: !1 }) : o({ ...e, createMode: !0, selectedBox: void 0 })), t.code === "KeyF" && o({ ...e, showBoxes: !e.showBoxes }), t.code === "KeyD" && e.selectedBox && E(e.selectedBox), t.code === "KeyS" && e.selectedBox && K(e.selectedBox, t.shiftKey), t.code === "Delete" && e.selectedBox && (f(e.selectedBox), o({ ...e, selectedBox: void 0 })), t.code === "Tab") {
272
+ const n = le(e.selectedBox), i = Z(n);
273
+ o({
272
274
  ...e,
273
275
  selectedBox: n,
274
276
  selectedLabel: (i == null ? void 0 : i.label) ?? e.selectedLabel
275
277
  }), t.preventDefault();
276
278
  }
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;
279
+ t.code === "Space" && G(!0), t.code === "Slash" && t.shiftKey && o({ ...e, showHelp: !0 }), e.selectedBox && (t.code === "ArrowLeft" && (t.shiftKey ? z(e.selectedBox, 0, -N) : T(e.selectedBox, 0, -N)), t.code === "ArrowRight" && (t.shiftKey ? z(e.selectedBox, 0, N) : T(e.selectedBox, 0, N)), t.code === "ArrowUp" && (t.shiftKey ? z(e.selectedBox, -N, 0) : T(e.selectedBox, -N, 0)), t.code === "ArrowDown" && (t.shiftKey ? z(e.selectedBox, N, 0) : T(e.selectedBox, N, 0)));
280
+ }, oe = (t) => {
281
+ const n = P();
282
+ return w(
283
+ c.annotations.concat(c.suggestions).sort((i, r) => r.w * r.h - i.w * i.h)
284
+ ), k(c.falsePositives.sort((i, r) => r.w * r.h - i.w * i.h)), L(!0), n;
283
285
  }, ce = () => {
284
- a({ ...e, showLabeler: !1 }), m(
286
+ o({ ...e, showLabeler: !1 }), w(
285
287
  (t) => t.map((n) => n.id === e.selectedBox ? {
286
288
  ...n,
287
289
  label: e.selectedLabel,
288
290
  difficult: e.difficult
289
291
  } : n)
290
292
  );
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;
296
- return /* @__PURE__ */ v(oe, { children: [
297
- /* @__PURE__ */ l(me, { ref: C, disabled: e.createMode || e.drawingMode, minScale: 0.9, children: ({ zoomIn: t, zoomOut: n, setTransform: i }) => /* @__PURE__ */ v(
293
+ }, se = () => {
294
+ o({ ...e, showLabeler: !1 }), w((t) => t.filter((n) => n.label));
295
+ }, G = (t) => {
296
+ d && c.save(h, c.suggestions.map((n) => n.id), b.length === 0, t ? c.labels : []);
297
+ }, te = e.showBoxes ? 0 : -1;
298
+ return /* @__PURE__ */ B(de, { children: [
299
+ /* @__PURE__ */ l(ge, { ref: v, disabled: e.createMode || e.drawingMode, minScale: 0.9, children: ({ zoomIn: t, zoomOut: n, setTransform: i }) => /* @__PURE__ */ B(
298
300
  "div",
299
301
  {
300
302
  className: "flex h-screen min-w-[600px] flex-col bg-slate-900",
301
- onKeyDown: ie,
303
+ onKeyDown: ae,
302
304
  tabIndex: 0,
303
305
  children: [
304
- /* @__PURE__ */ v("div", { className: "flex flex-initial bg-slate-300 p-1", children: [
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" }) }) }),
306
- /* @__PURE__ */ v("div", { className: "flex flex-auto justify-center", children: [
306
+ /* @__PURE__ */ B("div", { className: "flex flex-initial bg-slate-300 p-1", children: [
307
+ /* @__PURE__ */ l("div", { className: "flex-initial", children: /* @__PURE__ */ l("button", { type: "button", onClick: c.back, children: /* @__PURE__ */ l(p, { secondary: !0, sm: !0, children: "Back" }) }) }),
308
+ /* @__PURE__ */ B("div", { className: "flex flex-auto justify-center", children: [
307
309
  /* @__PURE__ */ l(
308
310
  "button",
309
311
  {
@@ -311,7 +313,7 @@ const Le = (o) => {
311
313
  onClick: () => {
312
314
  n();
313
315
  },
314
- children: /* @__PURE__ */ l(b, { children: /* @__PURE__ */ l(
316
+ children: /* @__PURE__ */ l(p, { children: /* @__PURE__ */ l(
315
317
  "svg",
316
318
  {
317
319
  xmlns: "http://www.w3.org/2000/svg",
@@ -339,7 +341,7 @@ const Le = (o) => {
339
341
  onClick: () => {
340
342
  t();
341
343
  },
342
- children: /* @__PURE__ */ l(b, { children: /* @__PURE__ */ l(
344
+ children: /* @__PURE__ */ l(p, { children: /* @__PURE__ */ l(
343
345
  "svg",
344
346
  {
345
347
  xmlns: "http://www.w3.org/2000/svg",
@@ -360,43 +362,47 @@ const Le = (o) => {
360
362
  ) })
361
363
  }
362
364
  ),
363
- /* @__PURE__ */ l("button", { type: "button", onClick: Y, children: /* @__PURE__ */ l(b, { secondary: !0, sm: !0, children: "Add (w)" }) })
365
+ /* @__PURE__ */ l("button", { type: "button", onClick: X, children: /* @__PURE__ */ l(p, { secondary: !0, sm: !0, children: "Add (w)" }) })
364
366
  ] }),
365
- /* @__PURE__ */ v("div", { className: "flex-initial", children: [
367
+ /* @__PURE__ */ B("div", { className: "flex-initial", children: [
366
368
  /* @__PURE__ */ l(
367
369
  "button",
368
370
  {
371
+ disabled: !d,
372
+ title: d ? void 0 : "Waiting for the image to load",
369
373
  onClick: () => {
370
- a({ ...e, showVerify: !0 });
374
+ o({ ...e, showVerify: !0 });
371
375
  },
372
- children: /* @__PURE__ */ l(b, { sm: !0, children: "Verify & Save" })
376
+ children: /* @__PURE__ */ l(p, { sm: !0, disabled: !d, children: "Verify & Save" })
373
377
  }
374
378
  ),
375
379
  /* @__PURE__ */ l(
376
380
  "button",
377
381
  {
382
+ disabled: !d,
383
+ title: d ? void 0 : "Waiting for the image to load",
378
384
  onClick: () => {
379
- q(!1);
385
+ G(!1);
380
386
  },
381
- children: /* @__PURE__ */ l(b, { green: !0, sm: !0, children: "Save" })
387
+ children: /* @__PURE__ */ l(p, { green: !0, sm: !0, disabled: !d, children: "Save" })
382
388
  }
383
389
  ),
384
390
  /* @__PURE__ */ l(
385
391
  "button",
386
392
  {
387
393
  onClick: () => {
388
- a({ ...e, showDelete: !0 });
394
+ o({ ...e, showDelete: !0 });
389
395
  },
390
- children: /* @__PURE__ */ l(b, { red: !0, sm: !0, children: "Delete" })
396
+ children: /* @__PURE__ */ l(p, { red: !0, sm: !0, children: "Delete" })
391
397
  }
392
398
  ),
393
399
  /* @__PURE__ */ l(
394
400
  "button",
395
401
  {
396
402
  onClick: () => {
397
- a({ ...e, showHelp: !0 });
403
+ o({ ...e, showHelp: !0 });
398
404
  },
399
- children: /* @__PURE__ */ l(b, { sm: !0, secondary: !0, children: "?" })
405
+ children: /* @__PURE__ */ l(p, { sm: !0, secondary: !0, children: "?" })
400
406
  }
401
407
  )
402
408
  ] })
@@ -404,26 +410,26 @@ const Le = (o) => {
404
410
  /* @__PURE__ */ l(
405
411
  "div",
406
412
  {
407
- ref: B,
413
+ ref: C,
408
414
  className: "grid flex-auto place-content-center",
409
- children: /* @__PURE__ */ l(we, { children: /* @__PURE__ */ v(
415
+ children: /* @__PURE__ */ l(xe, { children: /* @__PURE__ */ B(
410
416
  "div",
411
417
  {
412
418
  className: "grid place-content-center",
413
- onMouseDown: V,
414
- onMouseUp: W,
415
- onMouseMove: U,
419
+ onMouseDown: O,
420
+ onMouseUp: Y,
421
+ onMouseMove: q,
416
422
  children: [
417
423
  /* @__PURE__ */ l(
418
424
  "img",
419
425
  {
420
- ref: p,
426
+ ref: D,
421
427
  className: "col-start-1 row-start-1 h-full w-full",
422
428
  alt: "annotate",
423
- src: o.imageUrl,
429
+ src: c.imageUrl,
424
430
  onLoad: (r) => {
425
- const c = le();
426
- i(c.leftPad, c.topPad, 0.9, 0);
431
+ const a = oe();
432
+ i(a.leftPad, a.topPad, 0.9, 0);
427
433
  },
428
434
  style: {
429
435
  width: e.width,
@@ -431,25 +437,25 @@ const Le = (o) => {
431
437
  }
432
438
  }
433
439
  ),
434
- y.map((r) => {
435
- var c;
440
+ b.map((r) => {
441
+ var a;
436
442
  return /* @__PURE__ */ l(
437
- ne,
443
+ ie,
438
444
  {
439
- type: J.falsePositive,
445
+ type: Q.falsePositive,
440
446
  label: r.label ?? "",
441
- zIndex: r.id === e.selectedBox ? 1 : Q,
447
+ zIndex: r.id === e.selectedBox ? 1 : te,
442
448
  x: r.x * e.width,
443
449
  y: r.y * e.height,
444
450
  w: r.w * e.width,
445
451
  h: r.h * e.height,
446
- initialScale: (c = C.current) == null ? void 0 : c.instance.transformState.scale,
452
+ initialScale: (a = v.current) == null ? void 0 : a.instance.transformState.scale,
447
453
  selected: r.id === e.selectedBox,
448
- onMouseDown: (d) => {
449
- e.createMode || (_(r.id), d.stopPropagation());
454
+ onMouseDown: (u) => {
455
+ e.createMode || (A(r.id), u.stopPropagation());
450
456
  },
451
457
  onClickDelete: () => {
452
- a({
458
+ o({
453
459
  ...e,
454
460
  showConfirmDeleteFalsePositive: !0
455
461
  });
@@ -458,42 +464,42 @@ const Le = (o) => {
458
464
  r.id
459
465
  );
460
466
  }),
461
- u.map((r) => {
462
- var c;
467
+ h.map((r) => {
468
+ var a;
463
469
  return /* @__PURE__ */ l(
464
- ne,
470
+ ie,
465
471
  {
466
- type: r.suggestion ? J.suggestion : J.truePositive,
472
+ type: r.suggestion ? Q.suggestion : Q.truePositive,
467
473
  label: r.label ?? "",
468
474
  difficult: r.difficult,
469
- zIndex: r.id === e.selectedBox ? 1 : Q,
475
+ zIndex: r.id === e.selectedBox ? 1 : te,
470
476
  x: r.x * e.width,
471
477
  y: r.y * e.height,
472
478
  w: r.w * e.width,
473
479
  h: r.h * e.height,
474
- initialScale: (c = C.current) == null ? void 0 : c.instance.transformState.scale,
480
+ initialScale: (a = v.current) == null ? void 0 : a.instance.transformState.scale,
475
481
  selected: r.id === e.selectedBox,
476
- onMouseDown: (d) => {
477
- e.createMode || (_(r.id), d.stopPropagation());
482
+ onMouseDown: (u) => {
483
+ e.createMode || (A(r.id), u.stopPropagation());
478
484
  },
479
- onDragStop: (d, s) => {
480
- j(s, r.id);
485
+ onDragStop: (u, s) => {
486
+ W(s, r.id);
481
487
  },
482
- onResizeStop: (d, s, h, g, D) => {
483
- z(h, D, r.id);
488
+ onResizeStop: (u, s, m, x, S) => {
489
+ _(m, S, r.id);
484
490
  },
485
491
  onClickDelete: () => {
486
- H(r.id);
492
+ f(r.id);
487
493
  },
488
494
  onClickEdit: () => {
489
- a({ ...e, showLabeler: !0 });
495
+ o({ ...e, showLabeler: !0 });
490
496
  }
491
497
  },
492
498
  r.id
493
499
  );
494
500
  }),
495
501
  /* @__PURE__ */ l(
496
- ue,
502
+ fe,
497
503
  {
498
504
  className: `col-start-1 row-start-1 ${e.createMode && !e.drawingMode ? "z-10" : "-z-10"}`,
499
505
  show: e.createMode && !e.drawingMode
@@ -508,29 +514,29 @@ const Le = (o) => {
508
514
  }
509
515
  ) }),
510
516
  /* @__PURE__ */ l(
511
- fe,
517
+ we,
512
518
  {
513
519
  title: "Annotate",
514
520
  show: e.showLabeler,
515
521
  cancelText: "Cancel",
516
- button: /* @__PURE__ */ l("button", { type: "button", onClick: ce, children: /* @__PURE__ */ l(b, { sm: !0, green: !0, children: "Save" }) }),
517
- handleCancel: ae,
518
- children: /* @__PURE__ */ v("div", { className: "my-2 grid grid-cols-1 gap-y-2", children: [
519
- /* @__PURE__ */ v("div", { children: [
522
+ button: /* @__PURE__ */ l("button", { type: "button", onClick: ce, children: /* @__PURE__ */ l(p, { sm: !0, green: !0, children: "Save" }) }),
523
+ handleCancel: se,
524
+ children: /* @__PURE__ */ B("div", { className: "my-2 grid grid-cols-1 gap-y-2", children: [
525
+ /* @__PURE__ */ B("div", { children: [
520
526
  /* @__PURE__ */ l(
521
527
  "select",
522
528
  {
523
529
  className: "w-full rounded-md border-gray-300 shadow-sm focus:border-primary-300 focus:ring focus:ring-primary-200 focus:ring-opacity-50",
524
530
  value: e.selectedLabel,
525
531
  onChange: (t) => {
526
- a({ ...e, selectedLabel: t.target.value });
532
+ o({ ...e, selectedLabel: t.target.value });
527
533
  },
528
- children: o.labels.map((t) => /* @__PURE__ */ l("option", { value: t, children: t }, t))
534
+ children: c.labels.map((t) => /* @__PURE__ */ l("option", { value: t, children: t }, t))
529
535
  }
530
536
  ),
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" })
537
+ c.manageLabelUrl && /* @__PURE__ */ l("a", { className: "text-primary-500 hover:text-primary-600 underline text-sm", href: c.manageLabelUrl, target: "_blank", children: "Manage Label Options" })
532
538
  ] }),
533
- /* @__PURE__ */ v("div", { className: "flex items-center", children: [
539
+ /* @__PURE__ */ B("div", { className: "flex items-center", children: [
534
540
  /* @__PURE__ */ l(
535
541
  "input",
536
542
  {
@@ -539,7 +545,7 @@ const Le = (o) => {
539
545
  type: "checkbox",
540
546
  checked: e.difficult,
541
547
  onChange: (t) => {
542
- a({ ...e, difficult: t.target.checked });
548
+ o({ ...e, difficult: t.target.checked });
543
549
  }
544
550
  }
545
551
  ),
@@ -549,14 +555,14 @@ const Le = (o) => {
549
555
  }
550
556
  ),
551
557
  /* @__PURE__ */ l(
552
- he,
558
+ me,
553
559
  {
554
560
  title: "Keyboard shortcuts",
555
561
  show: e.showHelp,
556
562
  handleClose: () => {
557
- a({ ...e, showHelp: !1 });
563
+ o({ ...e, showHelp: !1 });
558
564
  },
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: [
565
+ children: /* @__PURE__ */ l("div", { className: "grid w-full grid-cols-2 place-content-center gap-2 p-5", children: y.map((t) => /* @__PURE__ */ B(he, { children: [
560
566
  /* @__PURE__ */ l("div", { children: t.action }),
561
567
  /* @__PURE__ */ l("div", { className: "justify-self-end", children: t.codes.map((n) => /* @__PURE__ */ l(
562
568
  "span",
@@ -570,13 +576,13 @@ const Le = (o) => {
570
576
  }
571
577
  ),
572
578
  /* @__PURE__ */ l(
573
- G,
579
+ J,
574
580
  {
575
581
  title: "Are all of the objects in this image labeled?",
576
582
  description: " ",
577
583
  maxWidthClass: "max-w-lg",
578
584
  handleCancel: () => {
579
- a({ ...e, showVerify: !1 });
585
+ o({ ...e, showVerify: !1 });
580
586
  },
581
587
  show: e.showVerify,
582
588
  cancelText: "Cancel",
@@ -584,22 +590,23 @@ const Le = (o) => {
584
590
  "button",
585
591
  {
586
592
  type: "button",
593
+ disabled: !d,
587
594
  onClick: () => {
588
- q(!0), a({ ...e, showVerify: !1 });
595
+ G(!0), o({ ...e, showVerify: !1 });
589
596
  },
590
- children: /* @__PURE__ */ l(b, { sm: !0, green: !0, children: "Yes, all objects are labeled" })
597
+ children: /* @__PURE__ */ l(p, { sm: !0, green: !0, disabled: !d, children: "Yes, all objects are labeled" })
591
598
  }
592
599
  ),
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)) })
600
+ children: /* @__PURE__ */ l("div", { className: "flex flex-wrap", children: c.labels.map((t) => /* @__PURE__ */ l("div", { className: "font-mono m-1 bg-slate-200 p-1 rounded-md", children: t }, t)) })
594
601
  }
595
602
  ),
596
603
  /* @__PURE__ */ l(
597
- G,
604
+ J,
598
605
  {
599
606
  title: "Are you sure you want to delete this image?",
600
607
  description: "",
601
608
  handleCancel: () => {
602
- a({ ...e, showDelete: !1 });
609
+ o({ ...e, showDelete: !1 });
603
610
  },
604
611
  show: e.showDelete,
605
612
  cancelText: "Cancel",
@@ -608,22 +615,22 @@ const Le = (o) => {
608
615
  {
609
616
  type: "button",
610
617
  onClick: () => {
611
- o.delete(), a({ ...e, showDelete: !1 });
618
+ c.delete(), o({ ...e, showDelete: !1 });
612
619
  },
613
- children: /* @__PURE__ */ l(b, { sm: !0, red: !0, children: "Yes, permanently delete" })
620
+ children: /* @__PURE__ */ l(p, { sm: !0, red: !0, children: "Yes, permanently delete" })
614
621
  }
615
622
  ),
616
623
  children: "This cannot be undone."
617
624
  }
618
625
  ),
619
626
  /* @__PURE__ */ l(
620
- G,
627
+ J,
621
628
  {
622
629
  title: "Are you sure you want to delete this reported false positive?",
623
630
  description: " ",
624
631
  maxWidthClass: "max-w-xl",
625
632
  handleCancel: () => {
626
- a({ ...e, showConfirmDeleteFalsePositive: !1 });
633
+ o({ ...e, showConfirmDeleteFalsePositive: !1 });
627
634
  },
628
635
  show: e.showConfirmDeleteFalsePositive,
629
636
  cancelText: "Cancel",
@@ -632,16 +639,16 @@ const Le = (o) => {
632
639
  {
633
640
  type: "button",
634
641
  onClick: () => {
635
- e.selectedBox && K(e.selectedBox), a({
642
+ e.selectedBox && g(e.selectedBox), o({
636
643
  ...e,
637
644
  showConfirmDeleteFalsePositive: !1,
638
645
  selectedBox: void 0
639
646
  });
640
647
  },
641
- children: /* @__PURE__ */ v(b, { sm: !0, red: !0, children: [
648
+ children: /* @__PURE__ */ B(p, { sm: !0, red: !0, children: [
642
649
  "Do not teach my model that this is not a",
643
650
  " ",
644
- e.selectedBox ? f(e.selectedBox) : " "
651
+ e.selectedBox ? R(e.selectedBox) : " "
645
652
  ] })
646
653
  }
647
654
  ),
@@ -651,6 +658,6 @@ const Le = (o) => {
651
658
  ] });
652
659
  };
653
660
  export {
654
- Le as ImageAnnotator
661
+ ke as ImageAnnotator
655
662
  };
656
663
  //# 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 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]}
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 // bboxes and fpboxes are only copied from props once the image fires onLoad.\n // Saving before that sends empty lists, which wipes the image's annotations\n // and false positives, so saves are refused until the image has loaded.\n const [imageLoaded, setImageLoaded] = useState(false);\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\n const leftPad = (calculatedWidth * 0.1) / 2;\n const topPad = (calculatedHeight * 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 useEffect(() => {\n setImageLoaded(false);\n }, [props.imageUrl]);\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 setImageLoaded(true);\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 if (!imageLoaded) {\n return;\n }\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 disabled={!imageLoaded}\n title={imageLoaded ? undefined : 'Waiting for the image to load'}\n onClick={() => {\n setState({ ...state, showVerify: true });\n }}\n >\n <Button sm disabled={!imageLoaded}>\n Verify &amp; Save\n </Button>\n </button>\n <button\n disabled={!imageLoaded}\n title={imageLoaded ? undefined : 'Waiting for the image to load'}\n onClick={() => {\n save(false);\n }}\n >\n <Button green sm disabled={!imageLoaded}>\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 disabled={!imageLoaded}\n onClick={() => {\n save(true);\n setState({ ...state, showVerify: false });\n }}\n >\n <Button sm green disabled={!imageLoaded}>\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","imageLoaded","setImageLoaded","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/dist/index.d.ts CHANGED
@@ -34,6 +34,7 @@ export declare enum BoundingBoxType {
34
34
  * @param props.red - Indicates if the button is a red button.
35
35
  * @param props.green - Indicates if the button is a green button.
36
36
  * @param props.full - Indicates if the button takes 100% width.
37
+ * @param props.disabled - Renders the button dimmed and non-interactive.
37
38
  * @param props.children - Children components.
38
39
  */
39
40
  export declare const Button: (props: IButtonProps) => JSX_2.Element;
@@ -77,6 +78,7 @@ declare interface IButtonProps {
77
78
  red?: boolean;
78
79
  green?: boolean;
79
80
  full?: boolean;
81
+ disabled?: boolean;
80
82
  children: ReactNode;
81
83
  }
82
84
 
package/package.json CHANGED
@@ -1,7 +1,11 @@
1
1
  {
2
2
  "name": "@frigate-nvr/image-annotator",
3
- "version": "1.0.11",
3
+ "version": "1.0.13",
4
4
  "description": "image annotator designed for frigate nvr",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/frigate-nvr/image-annotator.git"
8
+ },
5
9
  "exports": "./dist/index.js",
6
10
  "module": "./dist/index.js",
7
11
  "types": "./dist/index.d.ts",