lost-sia 2.0.1-alpha8 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/README.md +4 -0
  2. package/dist/Annotation/logic/Annotation.d.ts +17 -0
  3. package/dist/Annotation/logic/Annotation.js +1 -0
  4. package/dist/Annotation/ui/AnnotationComponent.d.ts +24 -0
  5. package/dist/Annotation/ui/AnnotationComponent.js +1 -0
  6. package/dist/Annotation/ui/atoms/AnnoBar.d.ts +15 -0
  7. package/dist/Annotation/ui/atoms/AnnoBar.js +1 -0
  8. package/dist/Annotation/ui/atoms/DaviIcon.d.ts +9 -0
  9. package/dist/Annotation/ui/atoms/DaviIcon.js +19 -0
  10. package/dist/Annotation/ui/atoms/Edge.d.ts +17 -0
  11. package/dist/Annotation/ui/atoms/Edge.js +1 -0
  12. package/dist/Annotation/ui/atoms/Node.d.ts +17 -0
  13. package/dist/Annotation/ui/atoms/Node.js +1 -0
  14. package/dist/Annotation/ui/atoms/PolygonArea.d.ts +16 -0
  15. package/dist/Annotation/ui/atoms/PolygonArea.js +1 -0
  16. package/dist/Annotation/ui/tools/BBox.d.ts +21 -0
  17. package/dist/Annotation/ui/tools/BBox.js +1 -0
  18. package/dist/Annotation/ui/tools/Line.d.ts +21 -0
  19. package/dist/Annotation/ui/tools/Line.js +1 -0
  20. package/dist/Annotation/ui/tools/Point.d.ts +16 -0
  21. package/dist/Annotation/ui/tools/Point.js +1 -0
  22. package/dist/Annotation/ui/tools/Polygon.d.ts +23 -0
  23. package/dist/Annotation/ui/tools/Polygon.js +1 -0
  24. package/dist/Canvas/Canvas.d.ts +31 -0
  25. package/dist/Canvas/Canvas.js +1 -0
  26. package/dist/Canvas/LabelInput.d.ts +11 -0
  27. package/dist/Canvas/LabelInput.js +1 -0
  28. package/dist/IconButton.d.ts +25 -0
  29. package/dist/IconButton.js +1 -0
  30. package/dist/Sia.d.ts +33 -0
  31. package/dist/Sia.js +1 -0
  32. package/dist/Toolbar/Toolbar.d.ts +21 -0
  33. package/dist/Toolbar/Toolbar.js +1 -0
  34. package/dist/Toolbar/ToolbarItems/AccessibilityTools.d.ts +7 -0
  35. package/dist/Toolbar/ToolbarItems/AccessibilityTools.js +1 -0
  36. package/dist/Toolbar/ToolbarItems/AnnoToolSelector.d.ts +11 -0
  37. package/dist/Toolbar/ToolbarItems/AnnoToolSelector.js +1 -0
  38. package/dist/Toolbar/ToolbarItems/ImageToolItems/ImageLabelInput.d.ts +11 -0
  39. package/dist/Toolbar/ToolbarItems/ImageToolItems/ImageLabelInput.js +1 -0
  40. package/dist/Toolbar/ToolbarItems/ImageToolItems/TagLabel.d.ts +11 -0
  41. package/dist/Toolbar/ToolbarItems/ImageToolItems/TagLabel.js +1 -0
  42. package/dist/Toolbar/ToolbarItems/ImageTools.d.ts +13 -0
  43. package/dist/Toolbar/ToolbarItems/ImageTools.js +1 -0
  44. package/dist/Toolbar/ToolbarItems/Instructions.d.ts +2 -0
  45. package/dist/Toolbar/ToolbarItems/Instructions.js +1 -0
  46. package/dist/Toolbar/ToolbarItems/InstructionsModal.d.ts +6 -0
  47. package/dist/Toolbar/ToolbarItems/InstructionsModal.js +1 -0
  48. package/dist/assets/SIA-BV1tYu3P.css +1 -0
  49. package/dist/assets/brand-icons-Cu_C0hZ4.svg +1008 -0
  50. package/dist/assets/brand-icons-F3SPCeH1.woff +0 -0
  51. package/dist/assets/brand-icons-XL9sxUpA.woff2 +0 -0
  52. package/dist/assets/brand-icons-sqJ2Pg7a.eot +0 -0
  53. package/dist/assets/brand-icons-ubhWoxly.ttf +0 -0
  54. package/dist/assets/flags-DOLqOU7Y.png +0 -0
  55. package/dist/assets/icons-BOCtAERH.woff +0 -0
  56. package/dist/assets/icons-CHzK1VD9.eot +0 -0
  57. package/dist/assets/icons-D29ZQHHw.ttf +0 -0
  58. package/dist/assets/icons-Du6TOHnR.woff2 +0 -0
  59. package/dist/assets/icons-RwhydX30.svg +1518 -0
  60. package/dist/assets/node_modules/semantic-ui-css/semantic.min-Bvulf91l.css +346 -0
  61. package/dist/assets/outline-icons-BfdLr8tr.svg +366 -0
  62. package/dist/assets/outline-icons-DD8jm0uy.ttf +0 -0
  63. package/dist/assets/outline-icons-DInHoiqI.woff2 +0 -0
  64. package/dist/assets/outline-icons-LX8adJ4n.eot +0 -0
  65. package/dist/assets/outline-icons-aQ88nltS.woff +0 -0
  66. package/dist/index.d.ts +5 -0
  67. package/dist/index.js +1 -0
  68. package/dist/models/AnnotationMode.d.ts +11 -0
  69. package/dist/models/AnnotationMode.js +1 -0
  70. package/dist/models/AnnotationStatus.d.ts +8 -0
  71. package/dist/models/AnnotationStatus.js +1 -0
  72. package/dist/models/AnnotationTool.d.ts +7 -0
  73. package/dist/models/AnnotationTool.js +1 -0
  74. package/dist/models/CanvasAction.d.ts +28 -0
  75. package/dist/models/CanvasAction.js +1 -0
  76. package/dist/models/Direction.d.ts +7 -0
  77. package/dist/models/Direction.js +1 -0
  78. package/dist/models/EditorModes.d.ts +11 -0
  79. package/dist/models/EditorModes.js +1 -0
  80. package/dist/models/KeyAction.d.ts +22 -0
  81. package/dist/models/KeyAction.js +1 -0
  82. package/dist/models/NotificationType.d.ts +7 -0
  83. package/dist/models/NotificationType.js +1 -0
  84. package/dist/models/index.d.ts +6 -0
  85. package/dist/models/index.js +1 -0
  86. package/dist/stories/AnnotationTools.stories.d.ts +40 -0
  87. package/dist/stories/Canvas/Canvas.stories.d.ts +50 -0
  88. package/dist/stories/Canvas/CanvasOffset.d.ts +13 -0
  89. package/dist/stories/Canvas/CanvasWithOffset.stories.d.ts +36 -0
  90. package/dist/stories/FilterDropdown.stories.d.ts +19 -0
  91. package/dist/stories/MinimalSia.stories.d.ts +66 -0
  92. package/dist/stories/SIA/DemoWrapper.d.ts +8 -0
  93. package/dist/stories/SIA/DemoWrapper.stories.d.ts +27 -0
  94. package/dist/stories/SIA/SIA.stories.d.ts +72 -0
  95. package/dist/stories/Toolbar/ImageTools/TagLabel.stories.d.ts +21 -0
  96. package/dist/stories/Toolbar/Instructions.stories.d.ts +11 -0
  97. package/dist/stories/Toolbar/Toolbar.stories.d.ts +37 -0
  98. package/dist/stories/exampleData/exampleAnnotations.d.ts +8 -0
  99. package/dist/stories/exampleData/exampleExternalAnnotations.d.ts +8 -0
  100. package/dist/stories/exampleData/exampleImage.d.ts +2 -0
  101. package/dist/stories/exampleData/exampleLabels.d.ts +6 -0
  102. package/dist/types.d.ts +57 -0
  103. package/dist/types.js +1 -0
  104. package/dist/utils/KeyMapper.d.ts +9 -0
  105. package/dist/utils/KeyMapper.js +1 -0
  106. package/dist/utils/TimeUtils.d.ts +4 -0
  107. package/dist/utils/TimeUtils.js +1 -0
  108. package/dist/utils/color.d.ts +2 -0
  109. package/dist/utils/color.js +1 -0
  110. package/dist/utils/index.d.ts +2 -0
  111. package/dist/utils/index.js +1 -0
  112. package/dist/utils/mouse.d.ts +6 -0
  113. package/dist/utils/mouse.js +1 -0
  114. package/dist/utils/siaIcons.js +12 -0
  115. package/dist/utils/transform.d.ts +28 -0
  116. package/dist/utils/transform.js +1 -0
  117. package/dist/utils/uiConfig.js +1 -0
  118. package/dist/utils/windowViewport.d.ts +22 -0
  119. package/dist/utils/windowViewport.js +1 -0
  120. package/package.json +19 -16
  121. package/src/AnnoExampleViewer.jsx +18 -18
  122. package/src/Annotation/logic/Annotation.ts +24 -26
  123. package/src/Annotation/ui/AnnotationComponent.tsx +115 -86
  124. package/src/Annotation/ui/atoms/AnnoBar.tsx +51 -53
  125. package/src/Annotation/ui/atoms/DaviIcon.tsx +12 -22
  126. package/src/Annotation/ui/atoms/Edge.tsx +25 -22
  127. package/src/Annotation/ui/atoms/Node.tsx +56 -50
  128. package/src/Annotation/ui/atoms/PolygonArea.tsx +30 -35
  129. package/src/Annotation/ui/tools/BBox.tsx +136 -150
  130. package/src/Annotation/ui/tools/Line.tsx +94 -91
  131. package/src/Annotation/ui/tools/Point.tsx +19 -17
  132. package/src/Annotation/ui/tools/Polygon.tsx +126 -95
  133. package/src/Canvas/Canvas.tsx +748 -594
  134. package/src/Canvas/LabelInput.tsx +68 -45
  135. package/src/IconButton.tsx +119 -0
  136. package/src/InfoBoxes/AnnoDetails.jsx +53 -53
  137. package/src/InfoBoxes/AnnoStats.jsx +41 -41
  138. package/src/InfoBoxes/InfoBox.jsx +16 -16
  139. package/src/InfoBoxes/InfoBoxArea.jsx +32 -34
  140. package/src/InfoBoxes/LabelInfo.jsx +30 -30
  141. package/src/SIASettingButton.jsx +25 -25
  142. package/src/Sia.tsx +484 -0
  143. package/src/Toolbar/Toolbar.tsx +38 -31
  144. package/src/Toolbar/ToolbarItems/AccessibilityTools.tsx +26 -46
  145. package/src/Toolbar/ToolbarItems/AnnoToolSelector.tsx +53 -46
  146. package/src/Toolbar/ToolbarItems/ImageToolItems/ImageLabelInput.tsx +127 -0
  147. package/src/Toolbar/ToolbarItems/ImageToolItems/TagLabel.tsx +29 -28
  148. package/src/Toolbar/ToolbarItems/ImageTools.tsx +43 -40
  149. package/src/Toolbar/ToolbarItems/Instructions.tsx +47 -50
  150. package/src/Toolbar/ToolbarItems/InstructionsModal.tsx +8 -8
  151. package/src/index.ts +9 -13
  152. package/src/models/{AnnotationMode.tsx → AnnotationMode.ts} +1 -1
  153. package/src/models/{AnnotationStatus.tsx → AnnotationStatus.ts} +1 -1
  154. package/src/models/{AnnotationTool.tsx → AnnotationTool.ts} +1 -1
  155. package/src/models/{CanvasAction.tsx → CanvasAction.ts} +1 -1
  156. package/src/models/{Direction.tsx → Direction.ts} +1 -1
  157. package/src/models/{EditorModes.tsx → EditorModes.ts} +1 -1
  158. package/src/models/{KeyAction.tsx → KeyAction.ts} +3 -1
  159. package/src/models/NotificationType.ts +8 -0
  160. package/src/models/index.ts +6 -7
  161. package/src/siaDummyData.js +71 -71
  162. package/src/stories/AnnotationTools.mdx +27 -0
  163. package/src/stories/AnnotationTools.stories.tsx +104 -0
  164. package/src/stories/Canvas/Canvas.stories.tsx +59 -113
  165. package/src/stories/Canvas/CanvasOffset.tsx +54 -38
  166. package/src/stories/Canvas/CanvasWithOffset.stories.tsx +42 -113
  167. package/src/stories/FilterDropdown.stories.ts +13 -11
  168. package/src/stories/MinimalSIA.mdx +20 -0
  169. package/src/stories/MinimalSia.stories.tsx +90 -0
  170. package/src/stories/SIA/DemoWrapper.stories.tsx +71 -0
  171. package/src/stories/SIA/DemoWrapper.tsx +55 -0
  172. package/src/stories/SIA/SIA.stories.tsx +79 -45
  173. package/src/stories/Toolbar/ImageTools/TagLabel.stories.tsx +11 -12
  174. package/src/stories/Toolbar/Instructions.stories.tsx +11 -11
  175. package/src/stories/Toolbar/Toolbar.stories.tsx +32 -47
  176. package/src/stories/Welcome.mdx +5 -0
  177. package/src/stories/development/CoordinateSystems.mdx +25 -0
  178. package/src/stories/exampleData/exampleAnnotations.ts +65 -0
  179. package/src/stories/exampleData/exampleExternalAnnotations.ts +115 -0
  180. package/src/stories/{siaDummyData2.ts → exampleData/exampleImage.ts} +3 -264
  181. package/src/stories/exampleData/exampleLabels.ts +146 -0
  182. package/src/stories/main.scss +6 -0
  183. package/src/styles/style.scss +1 -26
  184. package/src/types.ts +67 -0
  185. package/src/utils/KeyMapper.ts +76 -74
  186. package/src/utils/TimeUtils.ts +11 -0
  187. package/src/utils/color.ts +25 -25
  188. package/src/utils/hist.js +22 -22
  189. package/src/utils/index.ts +2 -3
  190. package/src/utils/mouse.ts +45 -0
  191. package/src/utils/siaIcons.jsx +5 -7
  192. package/src/utils/transform.ts +186 -0
  193. package/src/utils/uiConfig.js +19 -22
  194. package/src/utils/windowViewport.ts +34 -0
  195. package/src/AnnoLabelInput.jsx +0 -109
  196. package/src/AnnoToolBar.jsx +0 -153
  197. package/src/Annotation/AnnoBar.jsx +0 -154
  198. package/src/Annotation/Annotation.jsx +0 -395
  199. package/src/Annotation/Annotation.scss +0 -47
  200. package/src/Annotation/BBox.jsx +0 -299
  201. package/src/Annotation/Edge.jsx +0 -92
  202. package/src/Annotation/InfSelectionArea.jsx +0 -72
  203. package/src/Annotation/Line.jsx +0 -68
  204. package/src/Annotation/Node.jsx +0 -282
  205. package/src/Annotation/Point.jsx +0 -200
  206. package/src/Annotation/Polygon.jsx +0 -404
  207. package/src/Annotation/logic/AnnotationUtils.ts +0 -30
  208. package/src/Canvas.jsx +0 -2194
  209. package/src/ImgBar.jsx +0 -131
  210. package/src/LabelInput.jsx +0 -238
  211. package/src/Prompt.jsx +0 -45
  212. package/src/SIAFilterButton.jsx +0 -186
  213. package/src/Sia.jsx +0 -478
  214. package/src/Sia2.tsx +0 -392
  215. package/src/SiaPopup.jsx +0 -15
  216. package/src/ToolBar.jsx +0 -463
  217. package/src/Toolbar/NavigationButtons.tsx +0 -21
  218. package/src/Toolbar/ToolbarItem.jsx +0 -30
  219. package/src/Toolbar/ToolbarItems/ImageToolItems/ImageLabel.tsx +0 -62
  220. package/src/Toolbar.css +0 -13
  221. package/src/ToolbarItem.jsx +0 -31
  222. package/src/filterTools.js +0 -5
  223. package/src/models/AllowedTools.tsx +0 -9
  224. package/src/models/AnnotationSettings.tsx +0 -9
  225. package/src/models/ExternalAnnotation.ts +0 -15
  226. package/src/models/Label.tsx +0 -8
  227. package/src/models/UiConfig.tsx +0 -6
  228. package/src/stories/Button.jsx +0 -54
  229. package/src/stories/Button.stories.js +0 -48
  230. package/src/stories/Header.jsx +0 -69
  231. package/src/stories/Header.stories.js +0 -28
  232. package/src/stories/Page.jsx +0 -87
  233. package/src/stories/Page.stories.js +0 -28
  234. package/src/stories/SIA2/DemoWrapper.stories.tsx +0 -167
  235. package/src/stories/SIA2/DemoWrapper.tsx +0 -54
  236. package/src/stories/SIA2/Sia2.stories.tsx +0 -62
  237. package/src/stories/Toolbar/ImageTools/ImageLabel.stories.tsx +0 -32
  238. package/src/stories/assets/accessibility.png +0 -0
  239. package/src/stories/assets/accessibility.svg +0 -5
  240. package/src/stories/assets/addon-library.png +0 -0
  241. package/src/stories/assets/assets.png +0 -0
  242. package/src/stories/assets/avif-test-image.avif +0 -0
  243. package/src/stories/assets/context.png +0 -0
  244. package/src/stories/assets/discord.svg +0 -15
  245. package/src/stories/assets/docs.png +0 -0
  246. package/src/stories/assets/figma-plugin.png +0 -0
  247. package/src/stories/assets/github.svg +0 -3
  248. package/src/stories/assets/share.png +0 -0
  249. package/src/stories/assets/styling.png +0 -0
  250. package/src/stories/assets/testing.png +0 -0
  251. package/src/stories/assets/theming.png +0 -0
  252. package/src/stories/assets/tutorials.svg +0 -12
  253. package/src/stories/assets/youtube.svg +0 -4
  254. package/src/stories/button.css +0 -30
  255. package/src/stories/header.css +0 -32
  256. package/src/stories/lost.js +0 -54
  257. package/src/stories/page.css +0 -69
  258. package/src/stories/siaDummyData.js +0 -263
  259. package/src/stories/store.js +0 -18
  260. package/src/test.js +0 -7
  261. package/src/types/annoStatus.js +0 -4
  262. package/src/types/canvasActions.js +0 -58
  263. package/src/types/cursorstyles.js +0 -3
  264. package/src/types/modes.js +0 -9
  265. package/src/types/notificationType.js +0 -11
  266. package/src/types/toolbarEvents.js +0 -35
  267. package/src/types/tools.js +0 -17
  268. package/src/types.tsx +0 -11
  269. package/src/utils/annoConversion.js +0 -145
  270. package/src/utils/annoConversion2.ts +0 -145
  271. package/src/utils/colorlut.js +0 -68
  272. package/src/utils/constraints.js +0 -81
  273. package/src/utils/index.js +0 -1
  274. package/src/utils/keyActions.js +0 -113
  275. package/src/utils/mouse.js +0 -14
  276. package/src/utils/mouse2.ts +0 -35
  277. package/src/utils/transform.js +0 -336
  278. package/src/utils/transform2.ts +0 -343
  279. package/src/utils/windowViewport.js +0 -34
  280. package/src/utils/windowViewport2.ts +0 -50
package/README.md CHANGED
@@ -0,0 +1,4 @@
1
+ # SIA - Single Image Annotation
2
+
3
+ A react library for generating annotations on images.
4
+ Supported annotation types: Point, Line, Bounding Box, Polygon
@@ -0,0 +1,17 @@
1
+ import { AnnotationMode } from '../../models';
2
+ import { default as AnnotationStatus } from '../../models/AnnotationStatus';
3
+ import { default as AnnotationTool } from '../../models/AnnotationTool';
4
+ import { Point } from '../../types';
5
+ declare class Annotation {
6
+ internalId: number;
7
+ externalId?: string;
8
+ annoTime: number;
9
+ coordinates: Point[];
10
+ labelIds?: number[];
11
+ mode: AnnotationMode;
12
+ selectedNode: number;
13
+ status: AnnotationStatus;
14
+ type: AnnotationTool;
15
+ constructor(internalId: number, type: AnnotationTool, coordinates: Point[], mode?: AnnotationMode, status?: AnnotationStatus, externalId?: string);
16
+ }
17
+ export default Annotation;
@@ -0,0 +1 @@
1
+ var r=Object.defineProperty;var l=(o,e,s)=>e in o?r(o,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):o[e]=s;var t=(o,e,s)=>l(o,typeof e!="symbol"?e+"":e,s);import h from"../../models/AnnotationMode.js";import m from"../../models/AnnotationStatus.js";class u{constructor(e,s,n,i=h.CREATE,a=m.CREATING,d=""){t(this,"internalId");t(this,"externalId");t(this,"annoTime");t(this,"coordinates");t(this,"labelIds");t(this,"mode");t(this,"selectedNode");t(this,"status");t(this,"type");this.internalId=e,this.externalId=d,this.labelIds=[],this.type=s,this.mode=i,this.status=a,this.coordinates=n,this.selectedNode=1,this.annoTime=0}}export{u as default};
@@ -0,0 +1,24 @@
1
+ import { default as Annotation } from '../logic/Annotation';
2
+ import { default as CanvasAction } from '../../models/CanvasAction';
3
+ import { AnnotationSettings, Label, Point, SIANotification } from '../../types';
4
+ import { default as AnnotationMode } from '../../models/AnnotationMode';
5
+ type AnnotationComponentProps = {
6
+ scaledAnnotation: Annotation;
7
+ annotationSettings: AnnotationSettings;
8
+ possibleLabels: Label[];
9
+ svgScale: number;
10
+ svgTranslation: Point;
11
+ pageToStageOffset: Point;
12
+ strokeWidth: number;
13
+ nodeRadius: number;
14
+ isSelected: boolean;
15
+ isDisabled?: boolean;
16
+ onFinishAnnoCreate: (fullyCreatedAnnotation: Annotation) => void;
17
+ onLabelIconClicked: (markerPosition: Point) => void;
18
+ onAction?: (annotation: Annotation, canvasAction: CanvasAction) => void;
19
+ onAnnoChanged?: (annotation: Annotation) => void;
20
+ onAnnotationModeChange?: (annotationMode: AnnotationMode) => void;
21
+ onNotification?: (notification: SIANotification) => void;
22
+ };
23
+ declare const AnnotationComponent: ({ scaledAnnotation, annotationSettings, possibleLabels, svgScale, svgTranslation, pageToStageOffset, strokeWidth, nodeRadius, isSelected, isDisabled, onFinishAnnoCreate, onLabelIconClicked, onAction, onAnnoChanged, onAnnotationModeChange, onNotification, }: AnnotationComponentProps) => import("react/jsx-runtime").JSX.Element;
24
+ export default AnnotationComponent;
@@ -0,0 +1 @@
1
+ import{jsxs as G,jsx as d}from"react/jsx-runtime";import E from"../../models/AnnotationTool.js";import{getDefaultColor as L}from"../../utils/color.js";import H from"./tools/Point.js";import J from"./tools/Line.js";import K from"./atoms/AnnoBar.js";import Q from"../../models/CanvasAction.js";import X from"./tools/BBox.js";import Y from"./tools/Polygon.js";import{useState as h,useRef as x,useEffect as I}from"react";import e from"../../models/AnnotationMode.js";import Z from"../../utils/TimeUtils.js";const fo=({scaledAnnotation:r,annotationSettings:m,possibleLabels:A,svgScale:i,svgTranslation:f,pageToStageOffset:a,strokeWidth:B,nodeRadius:P,isSelected:c,isDisabled:V=!1,onFinishAnnoCreate:w,onLabelIconClicked:W,onAction:k=(n,l)=>{},onAnnoChanged:b=n=>{},onAnnotationModeChange:F=n=>{},onNotification:O=n=>{}})=>{const[n,l]=h(r.coordinates),[t,M]=h(r.mode),[j,C]=h(!1),R=x(void 0),[_,U]=h();I(()=>{R.current=_},[_]);const N=x(n);I(()=>{N.current=n},[n]);const y=()=>{M(e.VIEW);const o={...r,coordinates:N.current};w(o)},q=o=>A.find(s=>s.id===o),T=(()=>{if(!r.labelIds||r.labelIds.length==0)return L();const o=q(r.labelIds[0]);return(o==null?void 0:o.color)===void 0||o.color===null?L():o.color})(),u={stroke:T,fill:T,strokeWidth:B/i,r:P/i},D=o=>{l(o);let s=o;[e.ADD,e.MOVE].includes(t)&&(s=o.slice(0,-1)),b({...r,coordinates:s})},p=o=>{[e.ADD,e.CREATE,e.MOVE].includes(t)||(M(e.MOVE),U(performance.now())),l(o)},g=()=>{M(e.VIEW);const o=Z.getRoundedDuration(R.current,performance.now()),s=Number.isNaN(r.annoTime)||r.annoTime===null?o:r.annoTime+o;b({...r,coordinates:N.current,annoTime:s})};I(()=>{F(t)},[t]),I(()=>{t===e.CREATE||t===e.ADD||l(r.coordinates)},[r]);const z=()=>{switch(r.type){case E.Point:return d(H,{isSelected:c,annotationSettings:m,coordinates:n[0],pageToStageOffset:a,svgScale:i,svgTranslation:f,style:u,onMoving:o=>p([o]),onMoved:g,onIsDraggingStateChanged:C});case E.Line:return d(J,{annotationSettings:m,coordinates:n,isSelected:c,pageToStageOffset:a,annotationMode:t,svgScale:i,svgTranslation:f,style:u,onAddNode:D,onDeleteNode:D,onMoving:p,onMoved:g,onIsDraggingStateChanged:C,onFinishAnnoCreate:y});case E.BBox:return d(X,{annotationMode:t,annotationSettings:m,startCoords:n[0],endCoords:n[1],isSelected:c,pageToStageOffset:a,style:u,svgScale:i,svgTranslation:f,onDeleteNode:()=>{console.log("TODO")},onIsDraggingStateChanged:C,onFinishAnnoCreate:y,onMoving:p,onMoved:g});case E.Polygon:return d(Y,{annotationSettings:m,coordinates:n,isSelected:c,isDisabled:V,pageToStageOffset:a,annotationMode:t,svgScale:i,svgTranslation:f,style:u,onAddNode:D,onDeleteNode:D,onMoving:p,onMoved:g,onNotification:O,onIsDraggingStateChanged:C,onFinishAnnoCreate:y})}};return G("g",{onClick:o=>{o.stopPropagation(),k(r,Q.ANNO_SELECTED)},children:[!j&&t!==e.CREATE&&d(K,{annotationCoordinates:n,canLabel:m.canLabel,labels:A,color:T,isSelected:c,selectedLabelIds:r.labelIds,style:u,svgScale:i,onLabelIconClicked:W}),z()]})};export{fo as default};
@@ -0,0 +1,15 @@
1
+ import { CSSProperties } from 'react';
2
+ import { Label, Point } from '../../../types';
3
+ type AnnoBarProps = {
4
+ annotationCoordinates: Point[];
5
+ canLabel: boolean;
6
+ color: string;
7
+ labels: Label[];
8
+ selectedLabelIds: number[];
9
+ isSelected: boolean;
10
+ svgScale: number;
11
+ style: CSSProperties;
12
+ onLabelIconClicked: (markerPosition: Point) => void;
13
+ };
14
+ declare const AnnoBar: ({ annotationCoordinates, canLabel, color, labels, selectedLabelIds, isSelected, svgScale, style, onLabelIconClicked, }: AnnoBarProps) => import("react/jsx-runtime").JSX.Element;
15
+ export default AnnoBar;
@@ -0,0 +1 @@
1
+ import{jsxs as _,jsx as x}from"react/jsx-runtime";import{useState as r,useRef as C,useEffect as f}from"react";import T from"../../../utils/transform.js";import H from"./DaviIcon.js";const R=10,a=15,j=3,U=({annotationCoordinates:u,canLabel:y,color:b,labels:E,selectedLabelIds:h=[],isSelected:L,svgScale:t,style:d,onLabelIconClicked:P})=>{const[c,w]=r({x:0,y:0}),e={x:c.x+7/t,y:c.y-10/t},[p,D]=r(0),[z,A]=r(0),[l,B]=r(0),[m,F]=r(""),s=C(null);f(()=>{F(W())},[h]),f(()=>{const o=T.getTopPoint(u),i=T.getMostLeftPoints(o)[0];w(i);const n=Math.ceil(R/t);B(n),A(a/t)},[t]),f(()=>{if(s===void 0)return;const n=(s.current.getBoundingClientRect().width+j)/t;D(n)},[s,m,l]);const W=()=>{const i=E.filter(n=>h.includes(n.id)).map(n=>n.name).join(", ");return i.length?i:"no label"};return _("g",{children:[L&&y&&x(H,{x:e.x-33/t,y:e.y-30/t,color:b,size:60/t,onClick:()=>P(c)}),x("rect",{x:e.x,y:e.y-6/(t*1.2),width:p,height:z,rx:5/t,opacity:"0.5",style:d}),x("text",{x:e.x+1/t,y:e.y+6/t,fill:"white",textAnchor:"start",alignmentBaseline:"central",ref:s,fontSize:`${l}pt`,children:m}),x("rect",{x:e.x,y:e.y-6/(t*1.2),width:p,height:a,rx:5/t,opacity:"0.01",style:d,onContextMenu:o=>o.preventDefault()})]})};export{U as default};
@@ -0,0 +1,9 @@
1
+ type DaviIconProps = {
2
+ x: number;
3
+ y: number;
4
+ color: string;
5
+ size: number;
6
+ onClick?: () => void;
7
+ };
8
+ declare const DaviIcon: ({ x, y, color, size, onClick }: DaviIconProps) => import("react/jsx-runtime").JSX.Element;
9
+ export default DaviIcon;
@@ -0,0 +1,19 @@
1
+ import{jsxs as d,jsx as c}from"react/jsx-runtime";const o=({x:n,y:e,color:l,size:s=60,onClick:t=()=>{}})=>{const a=s/1400;return d("g",{transform:`translate(${n} ${e}) scale(${a})`,fill:l,onClick:t,children:[c("path",{id:"Maps",d:`M620.561,817.217c-1.568-3.62-3.771-7.101-4.611-10.885
2
+ c-24.452-109.811-74.341-207.569-139.215-298.675c-27.507-38.628-55.814-77.404-77.438-119.371
3
+ C324.363,242.85,402.696,58.71,574.209,26.508c145.509-27.32,282.953,75.871,296.543,222.773
4
+ c4.659,50.356-7.471,97.96-32.152,141.022c-27.812,48.526-58.75,95.364-90.073,141.758
5
+ c-50.917,75.411-91.062,155.558-113.421,244.091c-2.438,9.652-3.936,19.543-6.271,29.227c-0.992,4.104-3.023,7.961-4.584,11.93
6
+ C623.021,817.277,621.789,817.247,620.561,817.217z`}),c("path",{id:"Text",fillRule:"evenodd",clipRule:"evenodd",fill:"#FFFFFF",d:`M724.709,250.898
7
+ c-0.055-3.974,0.047-7.949,0.033-11.923c-0.007-1.228-1.54-2.767-2.76-2.777c-2.428-0.021-4.862-0.015-7.29-0.015
8
+ c-22.466,0.001-44.934,0.005-67.404,0.009c-2.475,0.001-3.658,1.154-3.658,3.588c-0.001,47.365-0.001,94.73-0.001,142.096
9
+ c0,13.526,0,27.05,0.001,40.577c0,2.305,1.274,3.584,3.562,3.59c6.623,0.004,9.256-0.07,19.873,0.004
10
+ c10.618,0.072,14.146,8.543,14.146,14.189c-0.002,5.645-4.233,13.055-14.299,13.367c-13.135,0.061-26.277-0.02-39.414-0.014
11
+ c-14.575,0.004-29.146,0.004-43.722,0.02c-4.191-0.084-13.717-2.789-13.717-13.492s6.233-13.643,13.132-14.117
12
+ c4.979,0.037,13.802,0.057,20.701,0.049c1.695,0,3.11-1.537,3.11-3.361c0.003-13.912-0.004-27.823-0.004-41.736
13
+ c0-30.252,0-60.503,0.002-90.754c0.002-17.03,0.005-33.649,0.002-50.678c0-1.991-1.38-3.336-3.396-3.336
14
+ c-24.79,0-49.577,0-74.362,0c-2.133,0-3.38,1.22-3.383,3.308c-0.006,3.754-0.011,7.509,0.005,11.262
15
+ c-0.023,6.339-3.067,13.143-12.456,13.143c-9.389,0-14.337-4.647-14.915-13.23c-0.128-4.305,0.004-8.612,0.004-12.918
16
+ c0-8.392,0-16.781,0-25.173c0-0.321,0.228-5.156,4.091-9.277c3.864-4.122,8.014-3.822,8.445-3.822
17
+ c25.835,0.003,51.672,0.002,77.507,0.002c46.813,0.001,140.443,0.001,140.443,0.001s6.153-0.088,10.926-0.052
18
+ c0.3-0.008,5.713,0.363,9.178,3.994c3.46,3.631,3.046,8.407,3.046,8.635c-0.007,12.862,0.079,25.725-0.003,38.587
19
+ c-0.074,8.051-6.938,12.819-13.703,12.847C731.482,263.519,724.956,259.059,724.709,250.898z`})]})};export{o as default};
@@ -0,0 +1,17 @@
1
+ import { CSSProperties, MouseEvent } from 'react';
2
+ import { Point, Vector2 } from '../../../types';
3
+ type EdgeProps = {
4
+ startCoordinate: Point;
5
+ endCoordinate: Point;
6
+ isDisabled?: boolean;
7
+ pageToStageOffset: Point;
8
+ svgScale: number;
9
+ svgTranslation: Vector2;
10
+ style: CSSProperties;
11
+ onAddNode?: (coordinate: Point) => void;
12
+ onDoubleClick?: (e: MouseEvent) => void;
13
+ onMouseDown: (e: MouseEvent) => void;
14
+ onMouseMove: (e: MouseEvent) => void;
15
+ };
16
+ declare const Edge: ({ startCoordinate, endCoordinate, isDisabled, pageToStageOffset, style, svgScale, svgTranslation, onAddNode, onDoubleClick, onMouseDown, onMouseMove, }: EdgeProps) => import("react/jsx-runtime").JSX.Element;
17
+ export default Edge;
@@ -0,0 +1 @@
1
+ import{jsx as i}from"react/jsx-runtime";import d from"../../../utils/mouse.js";const S=({startCoordinate:o,endCoordinate:t,isDisabled:s=!1,pageToStageOffset:r,style:n,svgScale:a,svgTranslation:l,onAddNode:u=()=>{},onDoubleClick:x=()=>{},onMouseDown:c,onMouseMove:m})=>{const y=e=>{const f=d.getAntiScaledMouseStagePosition(e,r,a,l);u(f)};return i("line",{x1:o.x,y1:o.y,x2:t.x,y2:t.y,style:n,onClick:e=>e.ctrlKey&&y(e),onDoubleClick:x,onMouseDown:c,onMouseMove:m,onContextMenu:e=>e.preventDefault(),strokeDasharray:s?"10,5":"0"})};export{S as default};
@@ -0,0 +1,17 @@
1
+ import { CSSProperties } from 'react';
2
+ import { AnnotationSettings, Point } from '../../../types';
3
+ type NodeProps = {
4
+ index: number;
5
+ coordinates: Point;
6
+ annotationSettings: AnnotationSettings;
7
+ pageToStageOffset: Point;
8
+ svgScale: number;
9
+ svgTranslation: Point;
10
+ style: CSSProperties;
11
+ onDeleteNode: () => void;
12
+ onMoving: (index: number, coordinates: Point) => void;
13
+ onMoved: () => void;
14
+ onIsDraggingStateChanged: (bool: any) => void;
15
+ };
16
+ declare const Node: ({ index, coordinates, annotationSettings, pageToStageOffset, svgScale, svgTranslation, style, onDeleteNode, onMoving, onMoved, onIsDraggingStateChanged, }: NodeProps) => import("react/jsx-runtime").JSX.Element;
17
+ export default Node;
@@ -0,0 +1 @@
1
+ import{jsxs as H,jsx as u}from"react/jsx-runtime";import{useState as l,useRef as L,useEffect as m}from"react";import S from"../../../utils/mouse.js";const T=({index:v,coordinates:t,annotationSettings:o,pageToStageOffset:x,svgScale:r,svgTranslation:y,style:p,onDeleteNode:g,onMoving:D,onMoved:I,onIsDraggingStateChanged:A})=>{const[E,c]=l(!1),[n,i]=l(!1),[s,a]=l(!1),f=L(s);m(()=>{f.current=s},[s]);const M=e=>{if(!n)return;const C=S.getAntiScaledMouseStagePosition(e,x,r,y);(e.movementX!==0||e.movementY!==0)&&(a(!0),D(v,C))};m(()=>{if(A(n),!n)return;const e=()=>{i(!1),f.current&&I(),a(!1)};return globalThis.addEventListener("mouseup",e),()=>{globalThis.removeEventListener("mouseup",e)}},[n]);const d=e=>{o.canEdit&&(e.ctrlKey?g():i(!0))},h=()=>u("circle",{cx:t.x,cy:t.y,r:12/r,onMouseLeave:e=>o.canEdit&&c(!1),onMouseDown:d,onContextMenu:e=>e.preventDefault()});return H("g",{children:[n&&u("circle",{cx:t.x,cy:t.y,r:"100%",style:{opacity:0},onMouseMove:e=>M(e),onContextMenu:e=>e.preventDefault()}),E&&h(),u("circle",{cx:t.x,cy:t.y,r:10/r,style:p,onMouseOver:()=>{o.canEdit&&c(!0)},onMouseDown:d,onMouseMove:e=>M(e),onContextMenu:e=>e.preventDefault()})]})};export{T as default};
@@ -0,0 +1,16 @@
1
+ import { CSSProperties } from 'react';
2
+ import { Point } from '../../../types';
3
+ import { default as AnnotationMode } from '../../../models/AnnotationMode';
4
+ type PolygonAreaProps = {
5
+ coordinates: Point[];
6
+ isSelected: boolean;
7
+ isDisabled?: boolean;
8
+ annotationMode: AnnotationMode;
9
+ style: CSSProperties;
10
+ onFinishAnnoCreate?: () => void;
11
+ onMouseDown: (e: React.MouseEvent<SVGPolygonElement, MouseEvent>) => void;
12
+ onMouseUp?: (e: React.MouseEvent<SVGPolygonElement, MouseEvent>) => void;
13
+ onMouseMove: (e: React.MouseEvent<SVGPolygonElement, MouseEvent>) => void;
14
+ };
15
+ declare const PolygonArea: ({ coordinates, isSelected, isDisabled, annotationMode, style, onFinishAnnoCreate, onMouseDown, onMouseUp, onMouseMove, }: PolygonAreaProps) => import("react/jsx-runtime").JSX.Element;
16
+ export default PolygonArea;
@@ -0,0 +1 @@
1
+ import{jsx as m}from"react/jsx-runtime";import{useState as c,useEffect as C}from"react";import x from"../../../models/AnnotationMode.js";const E=({coordinates:f,isSelected:n,isDisabled:e=!1,annotationMode:s,style:u,onFinishAnnoCreate:p=()=>{},onMouseDown:a,onMouseUp:l=()=>{},onMouseMove:i})=>{const y=f.map(o=>`${o.x},${o.y}`).join(" "),[g,r]=c("pointer");C(()=>{if(e)return r("not-allowed");r(n?"grab":"pointer")},[n,e]);const t={...u};return t.cursor=g,t.fillOpacity=n?0:.3,n&&e&&(t.stroke="none"),m("polygon",{points:y,style:t,onMouseDown:o=>{n&&r("grabbing"),a(o)},onMouseUp:o=>{r("grab"),l(o)},onDoubleClick:()=>s===x.CREATE&&p(),onMouseMove:i,onContextMenu:o=>o.preventDefault()})};export{E as default};
@@ -0,0 +1,21 @@
1
+ import { CSSProperties } from 'react';
2
+ import { AnnotationSettings, Point } from '../../../types';
3
+ import { default as AnnotationMode } from '../../../models/AnnotationMode';
4
+ type BBoxProps = {
5
+ annotationMode: AnnotationMode;
6
+ annotationSettings: AnnotationSettings;
7
+ pageToStageOffset: Point;
8
+ startCoords: Point;
9
+ endCoords: Point;
10
+ svgScale: number;
11
+ svgTranslation: Point;
12
+ isSelected: boolean;
13
+ style: CSSProperties;
14
+ onDeleteNode: (coordinates: Point[]) => void;
15
+ onFinishAnnoCreate: () => void;
16
+ onIsDraggingStateChanged: (newDraggingState: boolean) => void;
17
+ onMoving: (coordinates: Point[]) => void;
18
+ onMoved: () => void;
19
+ };
20
+ declare const BBox: ({ annotationMode, annotationSettings, pageToStageOffset, startCoords, endCoords, svgScale, svgTranslation, isSelected, style, onDeleteNode, onFinishAnnoCreate, onIsDraggingStateChanged, onMoving, onMoved, }: BBoxProps) => import("react/jsx-runtime").JSX.Element;
21
+ export default BBox;
@@ -0,0 +1 @@
1
+ import{jsxs as H,jsx as A}from"react/jsx-runtime";import{useState as E,useRef as J,useEffect as v}from"react";import K from"../atoms/Node.js";import i from"../../../models/AnnotationMode.js";import Q from"../../../utils/mouse.js";import V from"../atoms/PolygonArea.js";import W from"../atoms/Edge.js";const se=({annotationMode:m,annotationSettings:d,pageToStageOffset:y,startCoords:b,endCoords:x,svgScale:c,svgTranslation:R,isSelected:a,style:h,onDeleteNode:U,onFinishAnnoCreate:j,onIsDraggingStateChanged:w,onMoving:p,onMoved:C})=>{const t=[b,{x:b.x,y:x.y},x,{x:x.x,y:b.y}],[k,z]=E(m===i.CREATE),[l,T]=E(!1),[f,L]=E(!1),[B,_]=E(0),[D,g]=E(!1),M=J(D);v(()=>{M.current=D},[D]);const X=e=>{d.canEdit!==!1&&a&&m!==i.CREATE&&e.button===0&&T(!0)},$=e=>{d.canEdit!==!1&&a&&m!==i.CREATE&&e.button===0&&L(!0)},Y=e=>{if(l){const s=[{...t[0]},{...t[2]}].map(n=>{const u=n.x+=e.movementX/c,r=n.y+=e.movementY/c;return{x:u,y:r}});(e.movementX!==0||e.movementY!==0)&&(g(!0),p(s))}if(m===i.CREATE){const o=Q.getAntiScaledMouseStagePosition(e,y,c,R),n=[[...t][0],o];p(n)}};v(()=>{if(!k)return;const e=o=>{o.button===2&&(j(),z(!1))};return globalThis.addEventListener("mouseup",e),()=>{globalThis.removeEventListener("mouseup",e)}},[k]),v(()=>{if(w(l),!l)return;const e=()=>{T(!1),M.current&&C(),g(!1)};return globalThis.addEventListener("mouseup",e),()=>{globalThis.removeEventListener("mouseup",e)}},[l]),v(()=>{if(w(f),!f)return;const e=()=>{L(!1),M.current&&C(),g(!1)};return globalThis.addEventListener("mouseup",e),()=>{globalThis.removeEventListener("mouseup",e)}},[f]);const q=()=>t.map((o,s)=>A(K,{index:s,annotationSettings:d,coordinates:o,pageToStageOffset:y,svgScale:c,svgTranslation:R,style:h,onDeleteNode:()=>{const n=[...t];n.splice(s,1),U(n)},onMoving:(n,u)=>{const r=[t[0],t[2]];switch(n){case 0:r[0]=u;break;case 1:r[0].x=u.x,r[1].y=u.y;break;case 2:r[1]=u;break;case 3:r[1].x=u.x,r[0].y=u.y;break}p(r)},onMoved:()=>C(),onIsDraggingStateChanged:w},`node_${s}`)),I=(e,o)=>{const s=[t[0],t[2]];switch(e){case 0:s[0].x+=o.movementX/c;break;case 1:s[1].y+=o.movementY/c;break;case 2:s[1].x+=o.movementX/c;break;case 3:s[0].y+=o.movementY/c;break}(o.movementX!==0||o.movementY!==0)&&(g(!0),p(s))},G=()=>t.map((o,s)=>{const n=s+1<t.length?t[s+1]:t[0],u=s%2===0?"ew-resize":"ns-resize";return A(W,{startCoordinate:o,endCoordinate:n,pageToStageOffset:y,svgScale:c,svgTranslation:R,style:{...h,cursor:u},onMouseDown:$,onMouseMove:r=>{_(s),f&&I(s,r)}},`edge_${s}`)}),N=e=>A("circle",{cx:t[0].x,cy:t[0].y,r:"100%",style:{opacity:0},onMouseDown:X,onMouseMove:o=>{e&&f&&I(B,o),e||Y(o)},onContextMenu:o=>o.preventDefault()});return H("g",{children:[(l||m===i.CREATE)&&N(!1),A(V,{coordinates:t,isSelected:a,annotationMode:m,style:h,onMouseDown:X,onMouseMove:Y}),f&&N(!0),a&&d.canEdit&&G(),a&&m!==i.CREATE&&q()]})};export{se as default};
@@ -0,0 +1,21 @@
1
+ import { CSSProperties } from 'react';
2
+ import { AnnotationSettings, Point } from '../../../types';
3
+ import { default as AnnotationMode } from '../../../models/AnnotationMode';
4
+ type LineProps = {
5
+ annotationSettings: AnnotationSettings;
6
+ coordinates: Point[];
7
+ isSelected: boolean;
8
+ annotationMode: AnnotationMode;
9
+ pageToStageOffset: Point;
10
+ svgScale: number;
11
+ svgTranslation: Point;
12
+ style: CSSProperties;
13
+ onAddNode: (coordinates: Point[]) => void;
14
+ onDeleteNode: (coordinates: Point[]) => void;
15
+ onFinishAnnoCreate: () => void;
16
+ onIsDraggingStateChanged: (newDraggingState: boolean) => void;
17
+ onMoving: (coordinates: Point[]) => void;
18
+ onMoved: () => void;
19
+ };
20
+ declare const Line: ({ annotationSettings, coordinates, isSelected, annotationMode, pageToStageOffset, svgScale, svgTranslation, style, onAddNode, onDeleteNode, onFinishAnnoCreate, onMoving, onMoved, onIsDraggingStateChanged, }: LineProps) => import("react/jsx-runtime").JSX.Element;
21
+ export default Line;
@@ -0,0 +1 @@
1
+ import{jsxs as $,jsx as d}from"react/jsx-runtime";import{useState as P,useRef as k,useEffect as x}from"react";import U from"../atoms/Node.js";import i from"../../../models/AnnotationMode.js";import q from"../atoms/Edge.js";import I from"../../../utils/mouse.js";const K=({annotationSettings:p,coordinates:n,isSelected:C,annotationMode:r,pageToStageOffset:l,svgScale:u,svgTranslation:f,style:R,onAddNode:v,onDeleteNode:L,onFinishAnnoCreate:X,onMoving:E,onMoved:w,onIsDraggingStateChanged:y})=>{const[c,h]=P(!1),[A,g]=P(!1),D=k(A);x(()=>{D.current=A},[A]);const M=t=>{if(p.canEdit!==!1&&(C&&r!==i.CREATE&&t.button===0&&h(!0),t.button===2&&r==i.CREATE)){const o=I.getAntiScaledMouseStagePosition(t,l,u,f),e=[...n];e.push(o),v(e)}},N=t=>{if(c){const o=n.map(e=>{const s=e.x+=t.movementX/u,m=e.y+=t.movementY/u;return{x:s,y:m}});(t.movementX!==0||t.movementY!==0)&&(g(!0),E(o))}if(r===i.CREATE){const o=I.getAntiScaledMouseStagePosition(t,l,u,f);let e=[...n];n.length>1&&(e=n.slice(0,-1)),e.push(o),E(e)}};x(()=>{if(y(c),!c)return;const t=()=>{h(!1),D.current&&w(),g(!1)};return globalThis.addEventListener("mouseup",t),()=>{globalThis.removeEventListener("mouseup",t)}},[c]);const Y=()=>d("circle",{cx:n[0].x,cy:n[0].y,r:"100%",style:{opacity:0},onMouseDown:M,onMouseMove:N,onContextMenu:t=>t.preventDefault()}),j=()=>n.map((o,e)=>d(U,{index:e,annotationSettings:p,coordinates:o,pageToStageOffset:l,svgScale:u,svgTranslation:f,style:R,onDeleteNode:()=>{const s=[...n];s.splice(e,1),L(s)},onMoving:(s,m)=>{const b=[...n];b[s]=m,E(b)},onMoved:()=>w(),onIsDraggingStateChanged:y},`node_${e}`)),T=()=>n.map((o,e)=>{if(!(e+1>=n.length))return d(q,{startCoordinate:o,endCoordinate:n[e+1],pageToStageOffset:l,svgScale:u,svgTranslation:f,style:R,onAddNode:s=>{const m=[...n];m.splice(e+1,0,s),v(m)},onDoubleClick:()=>r===i.CREATE&&X(),onMouseDown:M,onMouseMove:N},`edge_${e}`)}),_=C&&r!==i.CREATE;return $("g",{children:[(c||r===i.CREATE)&&Y(),T(),_&&j()]})};export{K as default};
@@ -0,0 +1,16 @@
1
+ import { CSSProperties } from 'react';
2
+ import { AnnotationSettings, Point as TPoint } from '../../../types';
3
+ type PointProps = {
4
+ annotationSettings: AnnotationSettings;
5
+ coordinates: TPoint;
6
+ isSelected: boolean;
7
+ pageToStageOffset: TPoint;
8
+ svgScale: number;
9
+ svgTranslation: TPoint;
10
+ style: CSSProperties;
11
+ onIsDraggingStateChanged: (bool: any) => void;
12
+ onMoving: (coordinates: TPoint) => void;
13
+ onMoved: (coordinates: TPoint[]) => void;
14
+ };
15
+ declare const Point: ({ annotationSettings, coordinates, isSelected, pageToStageOffset, svgScale, svgTranslation, style, onMoving, onMoved, onIsDraggingStateChanged, }: PointProps) => import("react/jsx-runtime").JSX.Element;
16
+ export default Point;
@@ -0,0 +1 @@
1
+ import{jsx as l}from"react/jsx-runtime";import s from"../atoms/Node.js";const N=({annotationSettings:e,coordinates:o,isSelected:n,pageToStageOffset:t,svgScale:r,svgTranslation:d,style:i,onMoving:m,onMoved:f,onIsDraggingStateChanged:p})=>l(s,{index:0,annotationSettings:e,coordinates:o,pageToStageOffset:t,svgScale:r,svgTranslation:d,style:i,onDeleteNode:()=>{},onMoving:(u,x)=>n&&m(x),onMoved:()=>f([o]),onIsDraggingStateChanged:p});export{N as default};
@@ -0,0 +1,23 @@
1
+ import { CSSProperties } from 'react';
2
+ import { AnnotationSettings, Point, SIANotification } from '../../../types';
3
+ import { default as AnnotationMode } from '../../../models/AnnotationMode';
4
+ type PolygonProps = {
5
+ annotationSettings: AnnotationSettings;
6
+ coordinates: Point[];
7
+ isSelected: boolean;
8
+ isDisabled?: boolean;
9
+ annotationMode: AnnotationMode;
10
+ pageToStageOffset: Point;
11
+ svgScale: number;
12
+ svgTranslation: Point;
13
+ style: CSSProperties;
14
+ onAddNode: (coordinates: Point[]) => void;
15
+ onDeleteNode: (coordinates: Point[]) => void;
16
+ onFinishAnnoCreate: () => void;
17
+ onIsDraggingStateChanged: (newDraggingState: boolean) => void;
18
+ onMoving: (coordinates: Point[]) => void;
19
+ onMoved: () => void;
20
+ onNotification?: (notification: SIANotification) => void;
21
+ };
22
+ declare const Polygon: ({ annotationSettings, coordinates, isSelected, isDisabled, annotationMode, pageToStageOffset, svgScale, svgTranslation, style, onAddNode, onDeleteNode, onFinishAnnoCreate, onIsDraggingStateChanged, onMoving, onMoved, onNotification, }: PolygonProps) => import("react/jsx-runtime").JSX.Element;
23
+ export default Polygon;
@@ -0,0 +1 @@
1
+ import{jsxs as U,jsx as c}from"react/jsx-runtime";import{useState as T,useRef as a,useEffect as X}from"react";import q from"../atoms/Node.js";import z from"../atoms/PolygonArea.js";import s from"../../../models/AnnotationMode.js";import B from"../atoms/Edge.js";import Y from"../../../utils/mouse.js";import _ from"../../../models/NotificationType.js";const O=({annotationSettings:C,coordinates:e,isSelected:f,isDisabled:D=!1,annotationMode:o,pageToStageOffset:A,svgScale:m,svgTranslation:p,style:y,onAddNode:v,onDeleteNode:j,onFinishAnnoCreate:F,onIsDraggingStateChanged:P,onMoving:g,onMoved:w,onNotification:b=l=>{}})=>{const[l,N]=T(!1),[h,x]=T(!1),I=a(h),M=()=>{if(e.length<3)return b({message:"Polygons must have at least 3 nodes",title:"Polygon Error",type:_.ERROR});F()};X(()=>{I.current=h},[h]);const R=n=>{if(C.canEdit!==!1&&(f&&o!==s.CREATE&&o!==s.ADD&&n.button===0&&N(!0),n.button===2&&[s.CREATE,s.ADD].includes(o))){const r=Y.getAntiScaledMouseStagePosition(n,A,m,p),t=[...e];t.push(r),v(t)}},d=n=>{if(l){const r=e.map(t=>{const u=t.x+=n.movementX/m,i=t.y+=n.movementY/m;return{x:u,y:i}});(n.movementX!==0||n.movementY!==0)&&(x(!0),g(r))}if(o===s.CREATE){const r=Y.getAntiScaledMouseStagePosition(n,A,m,p);let t=[...e];e.length>1&&(t=e.slice(0,-1)),t.push(r),g(t)}};X(()=>{if(P(l),!l)return;const n=()=>{N(!1),I.current&&w(),x(!1)};return globalThis.addEventListener("mouseup",n),()=>{globalThis.removeEventListener("mouseup",n)}},[l]);const L=()=>e.map((r,t)=>c(q,{index:t,annotationSettings:C,coordinates:r,pageToStageOffset:A,svgScale:m,svgTranslation:p,style:y,onDeleteNode:()=>{if(e.length<4)return b({message:"Polygons must have at least 3 nodes",title:"Polygon Error",type:_.ERROR});const u=[...e];u.splice(t,1),j(u)},onMoving:(u,i)=>{const E=[...e];E[u]=i,g(E)},onMoved:()=>w(),onIsDraggingStateChanged:P},`node_${t}`)),$=()=>e.map((r,t)=>{const u=t+1<e.length?e[t+1]:e[0];return c(B,{startCoordinate:r,endCoordinate:u,isDisabled:D&&f,pageToStageOffset:A,svgScale:m,svgTranslation:p,style:y,onAddNode:i=>{const E=[...e];E.splice(t+1,0,i),v(E)},onDoubleClick:()=>o===s.CREATE&&M(),onMouseDown:R,onMouseMove:d},`edge_${t}`)}),k=()=>c("circle",{cx:e[0].x,cy:e[0].y,r:"100%",style:{opacity:0},onMouseDown:R,onMouseMove:d,onContextMenu:n=>n.preventDefault()});return U("g",{children:[(l||o===s.CREATE||o===s.ADD)&&k(),c(z,{coordinates:e,isSelected:f,isDisabled:D,annotationMode:o,style:y,onFinishAnnoCreate:M,onMouseDown:R,onMouseMove:d}),f&&C.canEdit&&$(),f&&o!==s.CREATE&&L()]})};export{O as default};
@@ -0,0 +1,31 @@
1
+ import { default as AnnotationTool } from '../models/AnnotationTool';
2
+ import { default as Annotation } from '../Annotation/logic/Annotation';
3
+ import { AnnotationSettings, Label, PolygonOperationResult, SIANotification, UiConfig } from '../types';
4
+ type CanvasProps = {
5
+ annotations?: Annotation[];
6
+ annotationSettings: AnnotationSettings;
7
+ defaultLabelId?: number;
8
+ image: string;
9
+ isFullscreen?: boolean;
10
+ isImageJunk?: boolean;
11
+ isPolygonSelectionMode?: boolean;
12
+ selectedAnnotation: Annotation | undefined;
13
+ selectedAnnoTool: AnnotationTool;
14
+ toolbarHeight?: number;
15
+ polygonOperationResult?: PolygonOperationResult;
16
+ possibleLabels: Label[];
17
+ preventScrolling?: boolean;
18
+ uiConfig: UiConfig;
19
+ onAnnoCreated: (createdAnno: Annotation) => void;
20
+ onAnnoCreationFinished: (createdAnno: Annotation, hasAnnotationExisted: boolean) => void;
21
+ onAnnoChanged: (changedAnno: Annotation) => void;
22
+ onAnnoEditing: (annoToEdit: Annotation) => void;
23
+ onNotification?: (notification: SIANotification) => void;
24
+ onRequestNewAnnoId: () => number;
25
+ onSelectAnnotation: (annotation?: Annotation) => void;
26
+ onSetIsImageJunk: (newJunkState: boolean) => void;
27
+ onSetSelectedTool: (tool: AnnotationTool) => void;
28
+ onShouldDeleteAnno: (internalAnnoId: number) => void;
29
+ };
30
+ declare const Canvas: ({ annotations, annotationSettings, defaultLabelId, image, isFullscreen, isImageJunk, isPolygonSelectionMode, polygonOperationResult, possibleLabels, preventScrolling, selectedAnnotation, selectedAnnoTool, toolbarHeight, uiConfig, onAnnoCreated, onAnnoCreationFinished, onAnnoChanged, onAnnoEditing, onNotification, onRequestNewAnnoId, onSelectAnnotation, onSetIsImageJunk, onSetSelectedTool, onShouldDeleteAnno, }: CanvasProps) => import("react/jsx-runtime").JSX.Element;
31
+ export default Canvas;
@@ -0,0 +1 @@
1
+ import{jsxs as K,jsx as h,Fragment as Qe}from"react/jsx-runtime";import{useState as E,useRef as Z,useEffect as M}from"react";import D from"../models/AnnotationTool.js";import i from"../models/EditorModes.js";import Ze from"../utils/KeyMapper.js";import a from"../models/KeyAction.js";import pe from"../Annotation/logic/Annotation.js";import qe from"../models/CanvasAction.js";import et from"../Annotation/ui/AnnotationComponent.js";import he from"../utils/mouse.js";import N from"../models/AnnotationMode.js";import tt from"./LabelInput.js";import{FontAwesomeIcon as nt}from"@fortawesome/react-fontawesome";import{faBan as ot}from"@fortawesome/free-solid-svg-icons";import w from"../models/AnnotationStatus.js";import x from"../utils/transform.js";import rt from"../models/NotificationType.js";import st from"../utils/TimeUtils.js";import xe from"../utils/windowViewport.js";const Dt=({annotations:A=[],annotationSettings:W,defaultLabelId:q,image:ee,isFullscreen:Ce=!1,isImageJunk:B=!1,isPolygonSelectionMode:F=!1,polygonOperationResult:X={annotationsToDelete:[],polygonsToCreate:[]},possibleLabels:te,preventScrolling:ne=!0,selectedAnnotation:r,selectedAnnoTool:R,toolbarHeight:U=0,uiConfig:z,onAnnoCreated:Oe,onAnnoCreationFinished:oe,onAnnoChanged:re,onAnnoEditing:Te=g=>{},onNotification:se=g=>{},onRequestNewAnnoId:V,onSelectAnnotation:v,onSetIsImageJunk:Ae,onSetSelectedTool:ve=g=>{},onShouldDeleteAnno:ie})=>{const[g,C]=E(i.VIEW),[Me,Ie]=E(),[ce,De]=E(q),[k,we]=E({x:-1,y:-1}),[ae,le]=E(0),L={x:k.x,y:k.y},[u,Y]=E({x:-1,y:-1}),[d,G]=E({x:-1,y:-1}),[m,de]=E({x:-1,y:-1}),[l,P]=E(1),[c,S]=E({x:0,y:0}),H={x:c.x+ae,y:c.y},[O,$]=E(),[j,_]=E(!1),fe=Z(null),p=Z(null),y=Z(null),T=((e,t)=>{if(e.x===0||e.y===0||t.x===0||t.y===0)return 0;const n=t.x/e.x,o=t.y/e.y;return Math.min(n,o)})(u,d),Se=()=>{if((y==null?void 0:y.current)===null)return{x:0,y:0};const e=u.x*T;if(z.imageCentered&&d.x>e){const f=(d.x-e)/2;le(f)}else le(0);const{top:t,left:n}=p.current.getBoundingClientRect(),o={x:n+window.scrollX,y:t+window.scrollY};we(o)},_e=new Ze(e=>Pe(e)),be=e=>{C(i.CREATE);const t=x.convertStageCoordinatesToPercentaged([e],T,u);R===D.BBox&&t.push(t[0]);const n=V(),o=new pe(n,R,t);if(Ie(performance.now()),ce!==void 0&&(o.labelIds=[ce]),Oe(o),R===D.Point){const s={...o,coordinates:[e],annoTime:0};Q(s)}},Ne=()=>{if(r&&![D.Line,D.Polygon].includes(r.type))return;const e=A.find(n=>n.internalId===(r==null?void 0:r.internalId));if(e===void 0)return;C(i.CREATE),ve(e.type);const t={...e,mode:N.CREATE,status:w.CREATING,internalId:V(),selectedNode:e.coordinates.length-1};Te(t)},Re=()=>{const e=r?r.internalId:0,t=A.find(n=>n.internalId>e);if(t)return v(t);if(A.length>0)return v(A[0])},Ve=()=>{const e=r?r.internalId:0,t=[...A];t.sort((o,s)=>s.internalId-o.internalId);const n=t.find(o=>o.internalId<e);if(n)return v(n);if(A.length>0)return v(A.at(-1))},ke=()=>{if(r){const e=JSON.stringify(r);localStorage.setItem("lostAnnotationClipboard",e);const t={title:"Success",message:"Annotation copied",type:rt.SUCCESS};se(t)}},Le=()=>{const e=localStorage.getItem("lostAnnotationClipboard");if(e==null)return;const t=JSON.parse(e);t.internalId=V(),t.externalId="",oe(t,!0),v(t)},Pe=e=>{switch(e){case a.EDIT_LABEL:r&&_(!0);break;case a.DELETE_ANNO:r&&ie(r.internalId);break;case a.DELETE_ANNO_IN_CREATION:g===i.CREATE&&(ie(r.internalId),C(i.VIEW));break;case a.ENTER_ANNO_ADD_MODE:console.log("KeyAction TODO: ENTER_ANNO_ADD_MODE");break;case a.LEAVE_ANNO_ADD_MODE:console.log("KeyAction TODO: LEAVE_ANNO_ADD_MODE");break;case a.UNDO:console.log("KeyAction TODO: UNDO");break;case a.REDO:console.log("KeyAction TODO: REDO");break;case a.TRAVERSE_ANNOS:Re();break;case a.TRAVERSE_ANNOS_BACKWARDS:Ve();break;case a.CAM_MOVE_LEFT:b(20*l,0);break;case a.CAM_MOVE_RIGHT:b(-20*l,0);break;case a.CAM_MOVE_UP:b(0,20*l);break;case a.CAM_MOVE_DOWN:b(0,-20*l);break;case a.CAM_MOVE_STOP:console.log("KeyAction TODO: CAM_MOVE_STOP");break;case a.COPY_ANNOTATION:ke();break;case a.PASTE_ANNOTATION:Le();break;case a.RECREATE_ANNO:console.log("KeyAction TODO: RECREATE_ANNO"),Ne();break;case a.TOGGLE_IMAGE_JUNK:if(g===i.ADD||g===i.CREATE)return;Ae(!B);break;default:console.log("Unknown KeyAction",e);break}},b=(e,t)=>{let n=c.x+e/l,o=c.y+t/l;const s=d.x*.45,f=d.x*.55,I=d.y*.45,je=d.y*.55,Je={x:0,y:0},Ee=xe.getViewportCoordinates(c,d,l,Je),me=xe.getViewportCoordinates(c,d,l,d);Ee.vX>=s?n=c.x-5:me.vX<=f?n=c.x+5:Ee.vY>=I?o=c.y-5:me.vY<=je&&(o=c.y+5),S({x:n,y:o})},J=(e=>m.x<=0||m.y<=0||u.x<=0||u.y<=0?[]:A.map(n=>({...n,coordinates:x.convertPercentagedCoordinatesToStage(n.coordinates,u,m)})))(),Ke=()=>{if(C(i.VIEW),de({x:-1,y:-1}),y.current!==null){const{width:e,height:t}=y.current.getBoundingClientRect();Y({x:e,y:t})}P(1),S({x:0,y:0}),$(void 0),_(!1)};M(()=>{var e;(e=fe.current)==null||e.focus()},[]),M(()=>{if((p==null?void 0:p.current)!==void 0){const{width:e,height:t}=p.current.getBoundingClientRect(),n=t-U;G({x:e,y:n});const o=new ResizeObserver(()=>{const{width:s,height:f}=p.current.getBoundingClientRect(),I=f-U;G({x:s,y:I})});return o.observe(p.current),()=>o.disconnect()}Ke()},[ee,Ce]),M(()=>{Se()},[y,c,d]),M(()=>{if(p.current===null)return;const{width:e,height:t}=p.current.getBoundingClientRect(),n=t-U;G({x:e,y:n})},[p]),M(()=>{if(y.current===null)return;const{width:e,height:t}=y.current.getBoundingClientRect();Y({x:e,y:t});const n=new ResizeObserver(()=>{const{width:o,height:s}=y.current.getBoundingClientRect();Y({x:o,y:s})});return n.observe(y.current),()=>n.disconnect()},[y]),M(()=>{if(T===0)return;const e={x:u.x*T,y:u.y*T};de(e)},[T,u]),M(()=>{F&&X.polygonsToCreate!==void 0&&X.polygonsToCreate.forEach(e=>{const t=V(),n=new pe(t,e.type,x.convertPercentagedCoordinatesToStage(e.coordinates,u,m),N.VIEW,w.CREATED);Q(n)})},[X]);const Q=e=>{C(i.VIEW);const t={...e,mode:N.VIEW};if(e.type!==D.Point){const s=st.getRoundedDuration(Me,performance.now());t.annoTime=s}const n=x.convertStageCoordinatesToPercentaged(e.coordinates,T,u);t.coordinates=n,re(t);const o=R===D.Point||F;oe(t,o)},We=e=>{_e.keyDown(e.key,e.shiftKey,e.ctrlKey)&&e.preventDefault()},Be=e=>{e.preventDefault()},Fe=e=>{if(e.button!==0){if(e.button===1)C(i.CAMERA_MOVE);else if(e.button===2){if(!W.canCreate||g===i.ADD||g===i.CREATE)return;const t=he.getAntiScaledMouseStagePosition(e,L,l,c),n={x:t.x-ae,y:t.y};be(n)}}},Xe=()=>{ne&&(document.body.style.overflow="hidden")},Ue=e=>{e.button===1&&C(i.VIEW)},ue=(e,t)=>{g===i.CAMERA_MOVE&&b(e,t)},ze=()=>{ne&&(document.body.style.overflow="")},Ye=e=>{const o=(e.deltaY<0?1:-1)>0?l*1.25:l/1.25,s=he.getAntiScaledMouseStagePosition(e,L,l,c),f=l/o,I={x:f*(s.x+c.x)-s.x,y:f*(s.y+c.y)-s.y};o<1?(P(1),(c.x!=0||c.y!=0)&&S({x:0,y:0})):o>200?(P(200),S(I)):(P(o),S(I))},Ge=(e,t)=>{if(t!==qe.ANNO_SELECTED){console.log("Unknown Canvas Action:",t);return}const n={...e,coordinates:x.convertStageCoordinatesToPercentaged([...e.coordinates],T,u)};v(n);const o=x.getMostLeftPoints(e.coordinates),s=x.getTopPoint(o)[0],f=x.convertStageToPage(s,L,l,c);$(f)},ge=e=>{const t=x.convertStageCoordinatesToPercentaged(e.coordinates,T,u),n={...e,coordinates:t};n.status===w.LOADED&&(n.status=w.CHANGED),re(n)},He=()=>{if(g===i.CAMERA_MOVE)return h(Qe,{});const t=[i.CREATE,i.ADD,i.MOVE].includes(g),n=J.map(o=>{const s=o.internalId===(r==null?void 0:r.internalId);return t&&!s?h("g",{},`annotationComponent_${o.internalId}`):h(et,{scaledAnnotation:o,annotationSettings:W,possibleLabels:te,svgScale:l,svgTranslation:H,pageToStageOffset:L,nodeRadius:z.nodeRadius,strokeWidth:z.strokeWidth,isSelected:s,isDisabled:F&&s,onFinishAnnoCreate:Q,onLabelIconClicked:()=>_(!0),onAction:Ge,onAnnoChanged:ge,onAnnotationModeChange:f=>{f===N.MOVE&&C(i.MOVE),g===i.MOVE&&f===N.VIEW&&C(i.VIEW)},onNotification:se},`annotationComponent_${o.internalId}`)});if(r){const o=J.find(f=>f.internalId===(r==null?void 0:r.internalId)),s=J.indexOf(o);n.push(n.splice(s,1)[0])}return h("g",{children:n})},$e=()=>h("circle",{cx:m.x/2,cy:m.y/2,r:"100%",style:{opacity:0},onContextMenu:e=>e.preventDefault(),onClick:()=>{_(!1)}}),ye={x:k.x+d.x/2,y:k.y+d.y/2};return K("div",{ref:p,style:{flex:"1 1 auto",minHeight:0,display:"flex",flexDirection:"column"},children:[h("div",{style:{position:"absolute",left:(O==null?void 0:O.x)??0,top:(O==null?void 0:O.y)??0,display:(O==null?void 0:O.y)===void 0?"none":"inherit",zIndex:j?7e3:-1},children:h(tt,{defaultLabelId:q,isVisible:j,selectedLabelsIds:r==null?void 0:r.labelIds,possibleLabels:te,isMultilabel:W.canHaveMultipleLabels,onLabelSelect:e=>{if(_(!1),e.length>0){const o=e.filter(s=>!r.labelIds.includes(s));o.length>0&&De(o[0])}const t=r.status===w.LOADED?w.CHANGED:r.status,n={...r,coordinates:x.convertPercentagedCoordinatesToStage(r.coordinates,u,m),labelIds:[...e],status:t};ge(n)}})}),B&&K("div",{style:{position:"absolute",left:ye.x,top:ye.y,transform:"translate(-50%, -50%)",textAlign:"center",color:"white"},children:[h(nt,{icon:ot,size:"5x",style:{marginBottom:15}}),h("h2",{children:"Marked as Junk"})]}),K("svg",{ref:fe,style:{flex:"1 1 auto",minHeight:0},onKeyDown:We,onKeyUp:Be,onMouseMove:e=>ue(e.movementX,e.movementY),tabIndex:0,onMouseDown:e=>Fe(e),children:[K("g",{transform:`scale(${l}) translate(${H.x}, ${H.y})`,onMouseOver:Xe,onMouseLeave:ze,onMouseUp:Ue,onWheel:Ye,onMouseMove:e=>ue(e.movementX,e.movementY),onClick:()=>{v(void 0)},children:[h("image",{onContextMenu:e=>e.preventDefault(),href:ee,ref:y,width:m.x>0?m.x:void 0,height:m.y>0?m.y:void 0}),He()]}),j&&$e(),B&&h("rect",{x:"0",y:"0",width:d.x,height:d.y,style:{opacity:.8},onContextMenu:e=>e.preventDefault(),onClick:()=>{$(void 0)}})]})]})};export{Dt as default};
@@ -0,0 +1,11 @@
1
+ import { Label } from '../types';
2
+ type LabelInputProps = {
3
+ defaultLabelId?: number;
4
+ isVisible: boolean;
5
+ selectedLabelsIds: number[];
6
+ possibleLabels: Label[];
7
+ isMultilabel?: boolean;
8
+ onLabelSelect: (selectedLabelIds: number[]) => void;
9
+ };
10
+ declare const LabelInput: ({ defaultLabelId, isVisible, selectedLabelsIds, possibleLabels, isMultilabel, onLabelSelect, }: LabelInputProps) => import("react/jsx-runtime").JSX.Element;
11
+ export default LabelInput;
@@ -0,0 +1 @@
1
+ import{jsxs as r,Fragment as v,jsx as o}from"react/jsx-runtime";import{useState as g}from"react";import{CPopover as w,CDropdown as D,CDropdownToggle as x,CDropdownMenu as y,CFormInput as F,CDropdownDivider as I,CDropdownItem as c}from"@coreui/react";const S=({defaultLabelId:i,isVisible:d,selectedLabelsIds:l,possibleLabels:s,isMultilabel:m=!1,onLabelSelect:f})=>{const[a,C]=g(""),p=s.filter(e=>e.name.toLowerCase().includes(a.toLowerCase())),h=e=>{let n=[];if(m){n=[...l];const u=l.indexOf(e.id);u===-1?n.push(e.id):n.splice(u,1)}else n=[e.id];f(n)},t=i?s.find(e=>e.id===i):void 0;return r(v,{children:[o(w,{content:`Default Label: ${t==null?void 0:t.name}`,visible:d&&t!==void 0,children:o("div",{style:{marginLeft:80}})}),r(D,{visible:d,autoClose:!1,style:{marginTop:-25},children:[o(x,{style:{display:"none"}}),r(y,{children:[o("div",{className:"px-3 py-2",children:o(F,{placeholder:"Filter label...",value:a,onChange:e=>C(e.target.value),autoFocus:!0})}),o(I,{}),p.length>0?p.map(e=>o(c,{onClick:()=>h(e),children:e.name},e.id)):o(c,{disabled:!0,children:"No results"})]})]})]})};export{S as default};
@@ -0,0 +1,25 @@
1
+ import { IconDefinition } from '@fortawesome/free-solid-svg-icons';
2
+ import { CSSProperties } from 'react';
3
+ import { SizeProp } from '@fortawesome/fontawesome-svg-core';
4
+ type IconButtonProps = {
5
+ loadingSize?: SizeProp;
6
+ isLoading?: boolean;
7
+ margin?: number;
8
+ icon?: IconDefinition;
9
+ text?: string;
10
+ size?: 'sm' | 'lg';
11
+ isTextLeft?: boolean;
12
+ style?: CSSProperties;
13
+ id?: string;
14
+ type?: 'button' | 'submit' | 'reset';
15
+ disabled?: boolean;
16
+ onClick?: () => void;
17
+ className?: string;
18
+ color?: string;
19
+ isOutline?: boolean;
20
+ tooltip?: string;
21
+ ttipPlacement?: 'top' | 'left' | 'right' | 'auto' | 'bottom';
22
+ shape?: string;
23
+ };
24
+ declare const IconButton: ({ loadingSize, isLoading, margin, icon, text, size, isTextLeft, style, id, type, disabled, onClick, className, color, isOutline, tooltip, ttipPlacement, shape, }: IconButtonProps) => import("react/jsx-runtime").JSX.Element;
25
+ export default IconButton;
@@ -0,0 +1 @@
1
+ import{jsx as t,jsxs as A}from"react/jsx-runtime";import{faSync as F}from"@fortawesome/free-solid-svg-icons";import{FontAwesomeIcon as v}from"@fortawesome/react-fontawesome";import{CTooltip as I,CButton as y}from"@coreui/react";const D=({loadingSize:o="1x",isLoading:n=!1,margin:c=5,icon:j,text:i="",size:s,isTextLeft:N=!1,style:a={},id:B=void 0,type:C="button",disabled:r=!1,onClick:l,className:m="",color:f="primary",isOutline:T=!0,tooltip:u="",ttipPlacement:b="top",shape:w=""})=>{const e=j,p=T?"outline":void 0,x=()=>{if(n)return A("div",{className:"flex justify-center items-center",children:[t(v,{className:"mr-3",size:o||"2x",icon:F,spin:!0}),t("span",{className:"text-center",children:"Loading"})]});const d=e!=null&&e.iconName&&e.prefix?t(v,{icon:e,size:o||"2x"},"icon"):null,h=i?t("span",{style:{marginLeft:c,marginRight:c},children:i},"text"):null;return N?[h,d]:[d,h]};return u!=""?t(I,{content:u,placement:b,children:t(y,{id:B,size:s,className:m,style:a,variant:p,disabled:r||n,onClick:l,color:r||n?"secondary":f,shape:w,children:x()})}):t(y,{size:s,type:C,className:m,style:a,variant:p,disabled:r||n,onClick:l,color:r||n?"secondary":f,children:x()})};export{D as default};
package/dist/Sia.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ import { ReactElement } from 'react';
2
+ import { default as AnnotationTool } from './models/AnnotationTool';
3
+ import { default as Annotation } from './Annotation/logic/Annotation';
4
+ import { AllowedTools, AnnotationSettings, ExternalAnnotation, Label, PolygonOperationResult, SIANotification, UiConfig } from './types';
5
+ type SiaProps = {
6
+ additionalButtons?: ReactElement;
7
+ allowedTools?: AllowedTools;
8
+ polygonOperationResult?: PolygonOperationResult;
9
+ annotationSettings?: AnnotationSettings;
10
+ defaultAnnotationTool?: AnnotationTool;
11
+ defaultLabelId?: number;
12
+ image?: string;
13
+ isLoading?: boolean;
14
+ isPolygonSelectionMode?: boolean;
15
+ initialAnnotations?: ExternalAnnotation[];
16
+ initialImageLabelIds?: number[];
17
+ initialIsImageJunk?: boolean;
18
+ possibleLabels: Label[];
19
+ uiConfig?: UiConfig;
20
+ onAnnoCreated?: (createdAnno: Annotation, allAnnos: Annotation[]) => void;
21
+ onAnnoCreationFinished?: (createdAnno: Annotation, allAnnos: Annotation[]) => void;
22
+ onAnnoChanged?: (changedAnno: Annotation, allAnnos: Annotation[]) => void;
23
+ onAnnoDeleted?: (deletedAnno: Annotation, allAnnos: Annotation[]) => void;
24
+ onImageLabelsChanged?: (selectedImageIds: number[]) => void;
25
+ onIsImageJunk?: (isJunk: boolean) => void;
26
+ onNotification?: (notification: SIANotification) => void;
27
+ onSelectAnnotation?: (annotation: Annotation) => void;
28
+ };
29
+ /**
30
+ * Main SIA component
31
+ */
32
+ declare const Sia2: ({ additionalButtons, allowedTools: propAllowedTools, polygonOperationResult, annotationSettings: propAnnotationSettings, uiConfig: propUiConfig, defaultAnnotationTool, defaultLabelId, image, isLoading, isPolygonSelectionMode, initialAnnotations, initialImageLabelIds, initialIsImageJunk, possibleLabels, onAnnoCreated, onAnnoCreationFinished, onAnnoChanged, onAnnoDeleted, onImageLabelsChanged, onIsImageJunk, onNotification, onSelectAnnotation, }: SiaProps) => import("react/jsx-runtime").JSX.Element;
33
+ export default Sia2;
package/dist/Sia.js ADDED
@@ -0,0 +1 @@
1
+ import{jsx as r,jsxs as P}from"react/jsx-runtime";import{useRef as cn,useState as i,useEffect as u}from"react";import{CSpinner as W}from"@coreui/react";import fn from"./Canvas/Canvas.js";import un from"./models/AnnotationTool.js";import In from"./Toolbar/Toolbar.js";import mn from"./models/AnnotationMode.js";import hn from"./models/AnnotationStatus.js";const wn=({additionalButtons:q,allowedTools:S,polygonOperationResult:c={annotationsToDelete:[],polygonsToCreate:[]},annotationSettings:T,uiConfig:g,defaultAnnotationTool:z,defaultLabelId:M,image:I,isLoading:w=!1,isPolygonSelectionMode:y=!1,initialAnnotations:x=void 0,initialImageLabelIds:_=void 0,initialIsImageJunk:V=!1,possibleLabels:D,onAnnoCreated:G=(f,m)=>{},onAnnoCreationFinished:K=(f,m)=>{},onAnnoChanged:Q=(f,m)=>{},onAnnoDeleted:b=(f,m)=>{},onImageLabelsChanged:X=()=>{},onIsImageJunk:Y=()=>{},onNotification:Z=f=>{},onSelectAnnotation:$=f=>{}})=>{const m=cn(null),[k,p]=i(),[s,d]=i([]),[E,R]=i(),[O,nn]=i(),[l,h]=i(),[j,N]=i(z??un.Point),[en,B]=i(_),[F,J]=i(),[v,tn]=i(!1),[L,U]=i([]),A=n=>{const e=s.findIndex(a=>a.internalId===n),t=[...s],o=t.splice(e,1)[0];d(t),h(void 0),b(o,t)},on=()=>{l!==void 0&&A(l.internalId)},sn=()=>{let n=0;const e=x.map(t=>({...t,internalId:n++,mode:mn.VIEW,selectedNode:1,status:t.status,annoTime:t.annoTime??0}));U([...new Array(n).keys()]),d(e)},an=()=>{let n=0;for(;L.includes(n);)n++;const e=[...L];return e.push(n),U(e),n},dn=n=>{const e=[...s],t=e.findIndex(C=>C.internalId===(l==null?void 0:l.internalId));if(t===-1)return;const o=e.splice(t,1)[0];b(o,e);const a=[...e];a.push(n),d(a),h(n)},H=n=>{J(n),Y(n)};u(()=>{I===void 0&&(d([]),h(void 0))},[I]),u(()=>{J(V),!(I!==void 0||x===void 0||x.length===0)&&sn()},[x]),u(()=>{B(_)},[_]),u(()=>{const e={...{canCreate:!0,canEdit:!0,canHaveMultipleLabels:!1,canLabel:!0,minimalArea:250},...T};R(e)},[T]),u(()=>{const e={...{nodeRadius:4,strokeWidth:4,imageCentered:!1},...g};nn(e)},[g]),u(()=>{const n={bbox:!0,point:!0,line:!0,junk:!0,polygon:!0};if(S===void 0)return p(n);p(S)},[S]);const ln={position:"fixed",top:0,left:0,zIndex:6e3,backgroundColor:"#ffff",width:"100%",height:"100%",padding:15},rn={flex:"1 1 auto",minHeight:0,display:"flex",flexDirection:"column"};return k===void 0?r("div",{className:"d-flex justify-content-center",children:r(W,{color:"primary",style:{width:"5rem",height:"5rem"}})}):P("div",{style:{...v?ln:{},flex:"1 1 auto",minHeight:0,display:"flex",flexDirection:"column"},children:[r("div",{ref:m,style:{marginBottom:10},children:r(In,{annotationSettings:E,allowedTools:k,additionalButtons:q,isDisabled:w,isFullscreen:v,isImageJunk:F,imageLabelIds:en,possibleLabels:D,selectedTool:j,onImageLabelsChanged:n=>{B(n),X(n)},onSetIsFullscreen:tn,onSetIsImageJunk:H,onSetSelectedTool:N,onShouldDeleteSelectedAnnotation:on})}),P("div",{style:rn,children:[w&&r("div",{className:"d-flex justify-content-center",children:r(W,{color:"primary",style:{width:"5rem",height:"5rem",marginTop:200}})}),I&&s&&r(fn,{annotations:s,annotationSettings:E,defaultLabelId:M,image:I,isFullscreen:v,isImageJunk:F,isPolygonSelectionMode:y,selectedAnnotation:l,selectedAnnoTool:j,polygonOperationResult:c,possibleLabels:D,uiConfig:O,onAnnoCreated:n=>{const e=[...s];e.push(n),d(e),h(n),G(n,e)},onAnnoChanged:n=>{const e=s.findIndex(o=>o.internalId===n.internalId);if(e===-1)return;const t=[...s];t[e]=n,d(t),Q(n,t)},onAnnoCreationFinished:(n,e)=>{const t=[...s];if(y&&(c==null?void 0:c.annotationsToDelete)!==void 0){c.annotationsToDelete.push(l);for(const o of c.annotationsToDelete){A(o.internalId);const a=t.findIndex(C=>C.internalId===o.internalId);t.splice(a,1)}}if(e)t.push(n);else{const o=s.findIndex(a=>a.internalId===n.internalId);t[o]=n}d(t),n.status=hn.CREATED,K(n,t)},onAnnoEditing:dn,onSetIsImageJunk:H,onNotification:Z,onRequestNewAnnoId:an,onSelectAnnotation:n=>{h(n),$(n)},onSetSelectedTool:N,onShouldDeleteAnno:A})]})]})};export{wn as default};
@@ -0,0 +1,21 @@
1
+ import { default as AnnotationTool } from '../models/AnnotationTool';
2
+ import { ReactElement } from 'react';
3
+ import { AllowedTools, AnnotationSettings, Label } from '../types';
4
+ type ToolbarProps = {
5
+ annotationSettings: AnnotationSettings;
6
+ allowedTools: AllowedTools;
7
+ additionalButtons?: ReactElement;
8
+ isImageJunk?: boolean;
9
+ imageLabelIds?: number[];
10
+ isDisabled?: boolean;
11
+ isFullscreen?: boolean;
12
+ possibleLabels: Label[];
13
+ selectedTool: AnnotationTool;
14
+ onImageLabelsChanged?: (selectedImageIds: number[]) => void;
15
+ onSetIsFullscreen?: (isFullscreen: boolean) => void;
16
+ onSetIsImageJunk?: (isImageJunk: boolean) => void;
17
+ onSetSelectedTool?: (selectedTool: AnnotationTool) => void;
18
+ onShouldDeleteSelectedAnnotation?: () => void;
19
+ };
20
+ declare const Toolbar: ({ annotationSettings, allowedTools, additionalButtons, isImageJunk, imageLabelIds, isDisabled, isFullscreen, possibleLabels, selectedTool, onImageLabelsChanged, onSetIsFullscreen, onSetIsImageJunk, onSetSelectedTool, onShouldDeleteSelectedAnnotation, }: ToolbarProps) => import("react/jsx-runtime").JSX.Element;
21
+ export default Toolbar;
@@ -0,0 +1 @@
1
+ import{jsxs as j,jsx as o}from"react/jsx-runtime";import{CRow as C,CCol as t}from"@coreui/react";import d from"./ToolbarItems/AnnoToolSelector.js";import g from"./ToolbarItems/ImageTools.js";import y from"./ToolbarItems/AccessibilityTools.js";const J=({annotationSettings:a,allowedTools:e,additionalButtons:c,isImageJunk:m=!1,imageLabelIds:f=[],isDisabled:r=!1,isFullscreen:n=!1,possibleLabels:l,selectedTool:s,onImageLabelsChanged:i=()=>{},onSetIsFullscreen:p=()=>{},onSetIsImageJunk:x=()=>{},onSetSelectedTool:u=()=>{},onShouldDeleteSelectedAnnotation:h=()=>{}})=>j(C,{className:"d-flex justify-content-center flex-wrap align-items-center gap-0 py-2 px-4",children:[o(t,{xs:"auto",children:o(g,{canJunk:e.junk,isImageJunk:m,imageLabelIds:f,isDisabled:r,isFullscreen:n,possibleLabels:l,onImageLabelsChanged:i,onSetIsImageJunk:x})}),o(t,{xs:"auto",children:o(y,{isDisabled:r,isFullscreen:n,onSetIsFullscreen:p})}),a.canCreate&&o(t,{xs:"auto",children:o(d,{allowedTools:e,isDisabled:r,selectedTool:s,onSetSelectedTool:u,onShouldDeleteSelectedAnnotation:h})}),c]});export{J as default};
@@ -0,0 +1,7 @@
1
+ type AccessibilityToolsProps = {
2
+ isDisabled?: boolean;
3
+ isFullscreen?: boolean;
4
+ onSetIsFullscreen?: (isFullscreen: boolean) => void;
5
+ };
6
+ declare const AccessibilityTools: ({ isDisabled, isFullscreen, onSetIsFullscreen, }: AccessibilityToolsProps) => import("react/jsx-runtime").JSX.Element;
7
+ export default AccessibilityTools;
@@ -0,0 +1 @@
1
+ import{jsxs as n,jsx as o}from"react/jsx-runtime";import{CButtonGroup as a}from"@coreui/react";import{faMaximize as c,faQuestion as p}from"@fortawesome/free-solid-svg-icons";import{useState as m}from"react";import u from"./InstructionsModal.js";import s from"../../IconButton.js";const M=({isDisabled:i=!1,isFullscreen:t=!1,onSetIsFullscreen:e=()=>{}})=>{const[l,r]=m(!1);return n(a,{role:"group","aria-label":"Basic example",children:[o(s,{color:"primary",icon:c,isOutline:!t,disabled:i,onClick:()=>e(!t),tooltip:"Toggle fullscreen"}),o(s,{color:"primary",icon:p,isOutline:!0,disabled:i,onClick:()=>r(!0),tooltip:"Open instructions"}),o(u,{isOpen:l,setIsOpen:r})]})};export{M as default};
@@ -0,0 +1,11 @@
1
+ import { default as AnnotationTool } from '../../models/AnnotationTool';
2
+ import { AllowedTools } from '../../types';
3
+ type AnnoToolSelectorProps = {
4
+ allowedTools: AllowedTools;
5
+ isDisabled?: boolean;
6
+ selectedTool: AnnotationTool;
7
+ onSetSelectedTool: (selectedTool: AnnotationTool) => void;
8
+ onShouldDeleteSelectedAnnotation?: () => void;
9
+ };
10
+ declare const AnnoToolSelector: ({ allowedTools, isDisabled, selectedTool, onSetSelectedTool, onShouldDeleteSelectedAnnotation, }: AnnoToolSelectorProps) => import("react/jsx-runtime").JSX.Element;
11
+ export default AnnoToolSelector;
@@ -0,0 +1 @@
1
+ import{jsxs as l,jsx as i}from"react/jsx-runtime";import{CButtonGroup as e}from"@coreui/react";import{pointIcon as c,lineIcon as x,bBoxIcon as u,polygonIcon as g}from"../../utils/siaIcons.js";import o from"../../models/AnnotationTool.js";import{faTrash as y}from"@fortawesome/free-solid-svg-icons";import t from"../../IconButton.js";const k=({allowedTools:r,isDisabled:n=!1,selectedTool:a,onSetSelectedTool:p,onShouldDeleteSelectedAnnotation:m=()=>{}})=>l(e,{role:"group","aria-label":"Basic example",children:[r.point&&i(t,{color:"primary",text:c(),isOutline:a!=o.Point,disabled:n,onClick:()=>p(o.Point),tooltip:"Create Point Annotation",margin:0}),r.line&&i(t,{color:"primary",text:x(),isOutline:a!=o.Line,disabled:n,onClick:()=>p(o.Line),tooltip:"Create Line Annotation",margin:0}),r.bbox&&i(t,{color:"primary",text:u(),isOutline:a!=o.BBox,disabled:n,onClick:()=>p(o.BBox),tooltip:"Create BBox Annotation",margin:0}),r.polygon&&i(t,{color:"primary",text:g(),isOutline:a!=o.Polygon,disabled:n,onClick:()=>p(o.Polygon),tooltip:"Create Polygon Annotation",margin:0}),i(t,{color:"primary",icon:y,isOutline:!0,disabled:n,onClick:m,tooltip:"Delete selected annotation",margin:0})]});export{k as default};
@@ -0,0 +1,11 @@
1
+ import { Label } from '../../../types';
2
+ type ImageLabelInputProps = {
3
+ isDisabled: boolean;
4
+ isVisible: boolean;
5
+ selectedLabelsIds: number[];
6
+ possibleLabels: Label[];
7
+ isMultilabel?: boolean;
8
+ onLabelSelect: (selectedLabelIds: number[]) => void;
9
+ };
10
+ declare const ImageLabelInput: ({ isDisabled, isVisible, selectedLabelsIds, possibleLabels, isMultilabel, onLabelSelect, }: ImageLabelInputProps) => import("react/jsx-runtime").JSX.Element;
11
+ export default ImageLabelInput;
@@ -0,0 +1 @@
1
+ import{jsx as r,jsxs as s}from"react/jsx-runtime";import{useState as C}from"react";import{CTooltip as L,CDropdown as w,CDropdownToggle as v,CDropdownMenu as T,CFormInput as x,CDropdownDivider as y,CDropdownItem as d}from"@coreui/react";import{FontAwesomeIcon as D}from"@fortawesome/react-fontawesome";import{faTag as b}from"@fortawesome/free-solid-svg-icons";import F from"./TagLabel.js";const M=({isDisabled:c,isVisible:m,selectedLabelsIds:t,possibleLabels:n,isMultilabel:p=!1,onLabelSelect:u})=>{const[i,f]=C(""),a=n.filter(e=>e.name.toLowerCase().includes(i.toLowerCase())),g=e=>{let o=[];if(p){o=[...t];const l=t.indexOf(e.id);l===-1?o.push(e.id):o.splice(l,1)}else o=[e.id];u(o)},h=()=>n.filter(o=>t.includes(o.id));return r(L,{content:"Add Image Label",children:s(w,{visible:m,autoClose:!1,children:[r(v,{variant:"outline",caret:!1,color:c?"secondary":"primary",style:{paddingTop:0,paddingBottom:0},as:"div",children:t.length===0?r("div",{style:{marginTop:6},children:r(D,{icon:b})}):h().map(o=>r(F,{name:o.name,color:o.color,size:25,triangleSize:17,style:{marginLeft:1,marginTop:5}},o.name))}),s(T,{children:[r("div",{className:"px-3 py-2",children:r(x,{placeholder:"Filter label...",value:i,onChange:e=>f(e.target.value),autoFocus:!0})}),r(y,{}),a.length>0?a.map(e=>r(d,{onClick:()=>g(e),children:e.name},e.id)):r(d,{disabled:!0,children:"No results"})]})]})})};export{M as default};
@@ -0,0 +1,11 @@
1
+ import { CSSProperties } from 'react';
2
+ type TagLabelProps = {
3
+ name: string;
4
+ color?: string;
5
+ size?: number;
6
+ style?: CSSProperties;
7
+ triangleSize?: number;
8
+ onClick?: () => void;
9
+ };
10
+ declare const TagLabel: ({ name, color, size: bodySize, style, triangleSize, onClick, }: TagLabelProps) => import("react/jsx-runtime").JSX.Element;
11
+ export default TagLabel;
@@ -0,0 +1 @@
1
+ import{jsxs as l,jsx as p}from"react/jsx-runtime";const x=({name:n,color:t="#2185d0",size:o=32,style:s={},triangleSize:e=22,onClick:r})=>{const i={display:"inline-flex",alignItems:"center",backgroundColor:t,color:"#000",height:`${o}px`,fontSize:`${o*.45}px`,padding:"0 1rem 0 0.75rem",border:0,borderRadius:"0 0.25rem 0.25rem 0",marginLeft:`${e/1.4}px`,position:"relative",overflow:"visible",cursor:r?"pointer":"default",...s},a={position:"absolute",left:`-${e/2}px`,width:`${e}px`,height:`${e}px`,backgroundColor:t,transform:"rotate(45deg)",zIndex:-1,pointerEvents:"none"};return l("button",{style:i,onClick:r,children:[p("span",{style:a}),n]})};export{x as default};
@@ -0,0 +1,13 @@
1
+ import { Label } from '../../types';
2
+ type ImageToolsProps = {
3
+ canJunk: boolean;
4
+ imageLabelIds?: number[];
5
+ isDisabled?: boolean;
6
+ isFullscreen?: boolean;
7
+ isImageJunk?: boolean;
8
+ possibleLabels: Label[];
9
+ onImageLabelsChanged?: (selectedImageIds: number[]) => void;
10
+ onSetIsImageJunk?: (isImageJunk: boolean) => void;
11
+ };
12
+ declare const ImageTools: ({ canJunk, isDisabled, isFullscreen, isImageJunk, imageLabelIds, possibleLabels, onImageLabelsChanged, onSetIsImageJunk, }: ImageToolsProps) => import("react/jsx-runtime").JSX.Element;
13
+ export default ImageTools;
@@ -0,0 +1 @@
1
+ import{jsxs as n,jsx as r}from"react/jsx-runtime";import{CButtonGroup as c}from"@coreui/react";import{faBan as b}from"@fortawesome/free-solid-svg-icons";import{useState as I,useEffect as d}from"react";import g from"./ImageToolItems/ImageLabelInput.js";import L from"../../IconButton.js";const S=({canJunk:a,isDisabled:e=!1,isFullscreen:s=!1,isImageJunk:o=!1,imageLabelIds:i=[],possibleLabels:l,onImageLabelsChanged:f=()=>{},onSetIsImageJunk:m=()=>{}})=>{const[p,t]=I(!1);return d(()=>{t(!1)},[s]),n(c,{role:"group","aria-label":"Image Tools",children:[l&&r(g,{isDisabled:e,isMultilabel:!0,isVisible:p,selectedLabelsIds:i,possibleLabels:l,onLabelSelect:u=>{t(!1),f(u)}}),a&&r(L,{color:"primary",icon:b,isOutline:!o,disabled:e,onClick:()=>m(!o),tooltip:"Junk image"})]})};export{S as default};
@@ -0,0 +1,2 @@
1
+ declare const Instructions: () => import("react/jsx-runtime").JSX.Element;
2
+ export default Instructions;
@@ -0,0 +1 @@
1
+ import{jsx as t,jsxs as a}from"react/jsx-runtime";import{CContainer as d,CRow as r,CCardText as l,CCol as s,CCard as c,CCardBody as C,CCardTitle as p}from"@coreui/react";const T=()=>{const o=[{title:"How to draw?",description:["1.) Select a Tool in the toolbar","2.) Draw with RIGHT CLICK on Canvas"]},{title:"How to delete an annotation?",description:["1.) Select an annotation with LEFT CLICK","2.) Press DELETE or BACKSPACE"]},{title:"How to assign a label?",description:["1.) Select an annotation with LEFT CLICK ","2.) Hit ENTER ","3.) Type into the input field ","4.) Hit ENTER to confirm ","5.) Hit ESCAPE to close the input field"]},{title:"Undo/ Redo",description:["Undo: Hit STRG + Z ","Redo: Hit STRG + R"]},{title:"Add/ Remove a node to Line/Polygon",description:["Add: Hit STRG + Click left on the line","Remove: Hit STRG + Click left on the node to delete"]},{title:"Remove a node",description:["Hold CTRL and left click on the node"]},{title:"Edit Line/Polygon",description:["1.) Click on the Annotation you want to edit.",' 2.) Press "e". New nodes can now be added using right click']},{title:"Zoom/ Move Canvas",description:["Zoom: Use MOUSE WHEEL to zoom in/out","Move: Hold MOUSE WHEEL and move mouse. Or Use W/A/S/D keys to move camera up/left/down/right"]},{title:"TAB navigation",description:["You can traverse all visible annotation by hitting TAB."]},{title:"Next/Prev image navigation",description:["Get next image by hitting ARROW_RIGHT key.","Get previous image by hitting ARROW_LEFT key."]},{title:"Copy and Paste annotations",description:["Copy: 1.) Select annotation 2.) Hit STRG + C","Paste: STRG + V"]},{title:"Mark image as junk",description:["Press J key"]},{title:"Assign a comment to a 2D annoation",description:["1.) Select annotation","2.) Hit C key"]}];return t(d,{children:t(r,{xs:{gutterY:2},children:o.map(e=>{const n=e.description.map(i=>t(l,{children:i},i));return t(s,{xs:12,md:4,lg:3,children:t(c,{children:a(C,{children:[t(p,{children:e.title}),n]})})},e.title)})})})};export{T as default};
@@ -0,0 +1,6 @@
1
+ type InstructionsModalProps = {
2
+ isOpen: boolean;
3
+ setIsOpen: (boolean: any) => void;
4
+ };
5
+ declare const InstructionsModal: ({ isOpen, setIsOpen }: InstructionsModalProps) => import("react/jsx-runtime").JSX.Element;
6
+ export default InstructionsModal;
@@ -0,0 +1 @@
1
+ import{jsxs as t,jsx as o}from"react/jsx-runtime";import{CModal as e,CModalHeader as i,CModalBody as l}from"@coreui/react";import n from"./Instructions.js";const m=({isOpen:r,setIsOpen:s})=>t(e,{visible:r,onClose:()=>s(!1),size:"xl",children:[o(i,{children:"Instructions"}),o(l,{children:o(n,{})})]});export{m as default};