lost-sia 2.0.1-alpha9 → 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 (411) 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 -1
  4. package/dist/Annotation/ui/AnnotationComponent.d.ts +24 -0
  5. package/dist/Annotation/ui/AnnotationComponent.js +1 -1
  6. package/dist/Annotation/ui/atoms/AnnoBar.d.ts +15 -0
  7. package/dist/Annotation/ui/atoms/AnnoBar.js +1 -1
  8. package/dist/Annotation/ui/atoms/DaviIcon.d.ts +9 -0
  9. package/dist/Annotation/ui/atoms/Edge.d.ts +17 -0
  10. package/dist/Annotation/ui/atoms/Edge.js +1 -1
  11. package/dist/Annotation/ui/atoms/Node.d.ts +17 -0
  12. package/dist/Annotation/ui/atoms/Node.js +1 -1
  13. package/dist/Annotation/ui/atoms/PolygonArea.d.ts +16 -0
  14. package/dist/Annotation/ui/atoms/PolygonArea.js +1 -1
  15. package/dist/Annotation/ui/tools/BBox.d.ts +21 -0
  16. package/dist/Annotation/ui/tools/BBox.js +1 -1
  17. package/dist/Annotation/ui/tools/Line.d.ts +21 -0
  18. package/dist/Annotation/ui/tools/Line.js +1 -1
  19. package/dist/Annotation/ui/tools/Point.d.ts +16 -0
  20. package/dist/Annotation/ui/tools/Point.js +1 -1
  21. package/dist/Annotation/ui/tools/Polygon.d.ts +23 -0
  22. package/dist/Annotation/ui/tools/Polygon.js +1 -1
  23. package/dist/Canvas/Canvas.d.ts +31 -0
  24. package/dist/Canvas/Canvas.js +1 -1
  25. package/dist/Canvas/LabelInput.d.ts +11 -0
  26. package/dist/Canvas/LabelInput.js +1 -1
  27. package/dist/IconButton.d.ts +25 -0
  28. package/dist/IconButton.js +1 -0
  29. package/dist/Sia.d.ts +33 -0
  30. package/dist/Sia.js +1 -1
  31. package/dist/Toolbar/Toolbar.d.ts +21 -0
  32. package/dist/Toolbar/Toolbar.js +1 -1
  33. package/dist/Toolbar/ToolbarItems/AccessibilityTools.d.ts +7 -0
  34. package/dist/Toolbar/ToolbarItems/AccessibilityTools.js +1 -1
  35. package/dist/Toolbar/ToolbarItems/AnnoToolSelector.d.ts +11 -0
  36. package/dist/Toolbar/ToolbarItems/AnnoToolSelector.js +1 -1
  37. package/dist/Toolbar/ToolbarItems/ImageToolItems/ImageLabelInput.d.ts +11 -0
  38. package/dist/Toolbar/ToolbarItems/ImageToolItems/ImageLabelInput.js +1 -0
  39. package/dist/Toolbar/ToolbarItems/ImageToolItems/TagLabel.d.ts +11 -0
  40. package/dist/Toolbar/ToolbarItems/ImageToolItems/TagLabel.js +1 -1
  41. package/dist/Toolbar/ToolbarItems/ImageTools.d.ts +13 -0
  42. package/dist/Toolbar/ToolbarItems/ImageTools.js +1 -1
  43. package/dist/Toolbar/ToolbarItems/Instructions.d.ts +2 -0
  44. package/dist/Toolbar/ToolbarItems/InstructionsModal.d.ts +6 -0
  45. package/dist/index.d.ts +5 -0
  46. package/dist/index.js +1 -1
  47. package/dist/models/AnnotationMode.d.ts +11 -0
  48. package/dist/models/AnnotationStatus.d.ts +8 -0
  49. package/dist/models/AnnotationTool.d.ts +7 -0
  50. package/dist/models/CanvasAction.d.ts +28 -0
  51. package/dist/models/Direction.d.ts +7 -0
  52. package/dist/models/EditorModes.d.ts +11 -0
  53. package/dist/models/KeyAction.d.ts +22 -0
  54. package/dist/models/KeyAction.js +1 -1
  55. package/dist/models/NotificationType.d.ts +7 -0
  56. package/dist/models/NotificationType.js +1 -0
  57. package/dist/models/index.d.ts +6 -0
  58. package/dist/models/index.js +1 -1
  59. package/dist/stories/AnnotationTools.stories.d.ts +40 -0
  60. package/dist/stories/Canvas/Canvas.stories.d.ts +50 -0
  61. package/dist/stories/Canvas/CanvasOffset.d.ts +13 -0
  62. package/dist/stories/Canvas/CanvasWithOffset.stories.d.ts +36 -0
  63. package/dist/stories/FilterDropdown.stories.d.ts +19 -0
  64. package/dist/stories/MinimalSia.stories.d.ts +66 -0
  65. package/dist/stories/SIA/DemoWrapper.d.ts +8 -0
  66. package/dist/stories/SIA/DemoWrapper.stories.d.ts +27 -0
  67. package/dist/stories/SIA/SIA.stories.d.ts +72 -0
  68. package/dist/stories/Toolbar/ImageTools/TagLabel.stories.d.ts +21 -0
  69. package/dist/stories/Toolbar/Instructions.stories.d.ts +11 -0
  70. package/dist/stories/Toolbar/Toolbar.stories.d.ts +37 -0
  71. package/dist/stories/exampleData/exampleAnnotations.d.ts +8 -0
  72. package/dist/stories/exampleData/exampleExternalAnnotations.d.ts +8 -0
  73. package/dist/stories/exampleData/exampleImage.d.ts +2 -0
  74. package/dist/stories/exampleData/exampleLabels.d.ts +6 -0
  75. package/dist/types.d.ts +57 -0
  76. package/dist/utils/KeyMapper.d.ts +9 -0
  77. package/dist/utils/KeyMapper.js +1 -1
  78. package/dist/utils/TimeUtils.d.ts +4 -0
  79. package/dist/utils/TimeUtils.js +1 -0
  80. package/dist/utils/color.d.ts +2 -0
  81. package/dist/utils/index.d.ts +2 -0
  82. package/dist/utils/index.js +1 -1
  83. package/dist/utils/mouse.d.ts +6 -0
  84. package/dist/utils/mouse.js +1 -1
  85. package/dist/utils/siaIcons.js +5 -5
  86. package/dist/utils/transform.d.ts +28 -0
  87. package/dist/utils/transform.js +1 -1
  88. package/dist/utils/windowViewport.d.ts +22 -0
  89. package/dist/utils/windowViewport.js +1 -1
  90. package/package.json +19 -16
  91. package/src/AnnoExampleViewer.jsx +18 -18
  92. package/src/Annotation/logic/Annotation.ts +24 -26
  93. package/src/Annotation/ui/AnnotationComponent.tsx +115 -86
  94. package/src/Annotation/ui/atoms/AnnoBar.tsx +51 -53
  95. package/src/Annotation/ui/atoms/DaviIcon.tsx +12 -22
  96. package/src/Annotation/ui/atoms/Edge.tsx +25 -22
  97. package/src/Annotation/ui/atoms/Node.tsx +56 -50
  98. package/src/Annotation/ui/atoms/PolygonArea.tsx +30 -35
  99. package/src/Annotation/ui/tools/BBox.tsx +136 -150
  100. package/src/Annotation/ui/tools/Line.tsx +94 -91
  101. package/src/Annotation/ui/tools/Point.tsx +19 -17
  102. package/src/Annotation/ui/tools/Polygon.tsx +126 -95
  103. package/src/Canvas/Canvas.tsx +748 -594
  104. package/src/Canvas/LabelInput.tsx +68 -45
  105. package/src/IconButton.tsx +119 -0
  106. package/src/InfoBoxes/AnnoDetails.jsx +53 -53
  107. package/src/InfoBoxes/AnnoStats.jsx +41 -41
  108. package/src/InfoBoxes/InfoBox.jsx +16 -16
  109. package/src/InfoBoxes/InfoBoxArea.jsx +32 -34
  110. package/src/InfoBoxes/LabelInfo.jsx +30 -30
  111. package/src/SIASettingButton.jsx +25 -25
  112. package/src/Sia.tsx +484 -0
  113. package/src/Toolbar/Toolbar.tsx +38 -31
  114. package/src/Toolbar/ToolbarItems/AccessibilityTools.tsx +26 -46
  115. package/src/Toolbar/ToolbarItems/AnnoToolSelector.tsx +53 -46
  116. package/src/Toolbar/ToolbarItems/ImageToolItems/ImageLabelInput.tsx +127 -0
  117. package/src/Toolbar/ToolbarItems/ImageToolItems/TagLabel.tsx +29 -28
  118. package/src/Toolbar/ToolbarItems/ImageTools.tsx +43 -40
  119. package/src/Toolbar/ToolbarItems/Instructions.tsx +47 -50
  120. package/src/Toolbar/ToolbarItems/InstructionsModal.tsx +8 -8
  121. package/src/index.ts +9 -13
  122. package/src/models/{AnnotationMode.tsx → AnnotationMode.ts} +1 -1
  123. package/src/models/{AnnotationStatus.tsx → AnnotationStatus.ts} +1 -1
  124. package/src/models/{AnnotationTool.tsx → AnnotationTool.ts} +1 -1
  125. package/src/models/{CanvasAction.tsx → CanvasAction.ts} +1 -1
  126. package/src/models/{Direction.tsx → Direction.ts} +1 -1
  127. package/src/models/{EditorModes.tsx → EditorModes.ts} +1 -1
  128. package/src/models/{KeyAction.tsx → KeyAction.ts} +3 -1
  129. package/src/models/NotificationType.ts +8 -0
  130. package/src/models/index.ts +6 -7
  131. package/src/siaDummyData.js +71 -71
  132. package/src/stories/AnnotationTools.mdx +27 -0
  133. package/src/stories/AnnotationTools.stories.tsx +104 -0
  134. package/src/stories/Canvas/Canvas.stories.tsx +59 -113
  135. package/src/stories/Canvas/CanvasOffset.tsx +54 -38
  136. package/src/stories/Canvas/CanvasWithOffset.stories.tsx +42 -113
  137. package/src/stories/FilterDropdown.stories.ts +13 -11
  138. package/src/stories/MinimalSIA.mdx +20 -0
  139. package/src/stories/MinimalSia.stories.tsx +90 -0
  140. package/src/stories/SIA/DemoWrapper.stories.tsx +71 -0
  141. package/src/stories/SIA/DemoWrapper.tsx +55 -0
  142. package/src/stories/SIA/SIA.stories.tsx +79 -45
  143. package/src/stories/Toolbar/ImageTools/TagLabel.stories.tsx +11 -12
  144. package/src/stories/Toolbar/Instructions.stories.tsx +11 -11
  145. package/src/stories/Toolbar/Toolbar.stories.tsx +32 -47
  146. package/src/stories/Welcome.mdx +5 -0
  147. package/src/stories/development/CoordinateSystems.mdx +25 -0
  148. package/src/stories/exampleData/exampleAnnotations.ts +65 -0
  149. package/src/stories/exampleData/exampleExternalAnnotations.ts +115 -0
  150. package/src/stories/{siaDummyData2.ts → exampleData/exampleImage.ts} +3 -264
  151. package/src/stories/exampleData/exampleLabels.ts +146 -0
  152. package/src/stories/main.scss +6 -0
  153. package/src/styles/style.scss +1 -26
  154. package/src/types.ts +67 -0
  155. package/src/utils/KeyMapper.ts +76 -74
  156. package/src/utils/TimeUtils.ts +11 -0
  157. package/src/utils/color.ts +25 -25
  158. package/src/utils/hist.js +22 -22
  159. package/src/utils/index.ts +2 -3
  160. package/src/utils/mouse.ts +45 -0
  161. package/src/utils/siaIcons.jsx +5 -7
  162. package/src/utils/transform.ts +186 -0
  163. package/src/utils/uiConfig.js +19 -22
  164. package/src/utils/windowViewport.ts +34 -0
  165. package/dist/AnnoExampleViewer.cjs +0 -1
  166. package/dist/AnnoExampleViewer.js +0 -1
  167. package/dist/AnnoLabelInput.cjs +0 -1
  168. package/dist/AnnoLabelInput.js +0 -1
  169. package/dist/AnnoToolBar.cjs +0 -19
  170. package/dist/AnnoToolBar.js +0 -19
  171. package/dist/Annotation/AnnoBar.cjs +0 -1
  172. package/dist/Annotation/AnnoBar.js +0 -1
  173. package/dist/Annotation/Annotation.cjs +0 -1
  174. package/dist/Annotation/Annotation.js +0 -1
  175. package/dist/Annotation/BBox.cjs +0 -1
  176. package/dist/Annotation/BBox.js +0 -1
  177. package/dist/Annotation/Edge.cjs +0 -1
  178. package/dist/Annotation/Edge.js +0 -1
  179. package/dist/Annotation/InfSelectionArea.cjs +0 -1
  180. package/dist/Annotation/InfSelectionArea.js +0 -1
  181. package/dist/Annotation/Line.cjs +0 -1
  182. package/dist/Annotation/Line.js +0 -1
  183. package/dist/Annotation/Node.cjs +0 -1
  184. package/dist/Annotation/Node.js +0 -1
  185. package/dist/Annotation/Point.cjs +0 -1
  186. package/dist/Annotation/Point.js +0 -1
  187. package/dist/Annotation/Polygon.cjs +0 -1
  188. package/dist/Annotation/Polygon.js +0 -1
  189. package/dist/Annotation/logic/Annotation.cjs +0 -1
  190. package/dist/Annotation/logic/AnnotationUtils.cjs +0 -1
  191. package/dist/Annotation/logic/AnnotationUtils.js +0 -1
  192. package/dist/Annotation/ui/AnnotationComponent.cjs +0 -1
  193. package/dist/Annotation/ui/atoms/AnnoBar.cjs +0 -1
  194. package/dist/Annotation/ui/atoms/DaviIcon.cjs +0 -19
  195. package/dist/Annotation/ui/atoms/Edge.cjs +0 -1
  196. package/dist/Annotation/ui/atoms/Node.cjs +0 -1
  197. package/dist/Annotation/ui/atoms/PolygonArea.cjs +0 -1
  198. package/dist/Annotation/ui/tools/BBox.cjs +0 -1
  199. package/dist/Annotation/ui/tools/Line.cjs +0 -1
  200. package/dist/Annotation/ui/tools/Point.cjs +0 -1
  201. package/dist/Annotation/ui/tools/Polygon.cjs +0 -1
  202. package/dist/Canvas/Canvas.cjs +0 -1
  203. package/dist/Canvas/LabelInput.cjs +0 -1
  204. package/dist/Canvas.cjs +0 -1
  205. package/dist/Canvas.js +0 -1
  206. package/dist/ImgBar.cjs +0 -1
  207. package/dist/ImgBar.js +0 -1
  208. package/dist/InfoBoxes/AnnoDetails.cjs +0 -1
  209. package/dist/InfoBoxes/AnnoDetails.js +0 -1
  210. package/dist/InfoBoxes/AnnoStats.cjs +0 -1
  211. package/dist/InfoBoxes/AnnoStats.js +0 -1
  212. package/dist/InfoBoxes/InfoBox.cjs +0 -1
  213. package/dist/InfoBoxes/InfoBox.js +0 -1
  214. package/dist/InfoBoxes/InfoBoxArea.cjs +0 -1
  215. package/dist/InfoBoxes/InfoBoxArea.js +0 -1
  216. package/dist/InfoBoxes/LabelInfo.cjs +0 -1
  217. package/dist/InfoBoxes/LabelInfo.js +0 -1
  218. package/dist/LabelInput.cjs +0 -1
  219. package/dist/LabelInput.js +0 -1
  220. package/dist/Prompt.cjs +0 -1
  221. package/dist/Prompt.js +0 -1
  222. package/dist/SIAFilterButton.cjs +0 -1
  223. package/dist/SIAFilterButton.js +0 -1
  224. package/dist/SIASettingButton.cjs +0 -1
  225. package/dist/SIASettingButton.js +0 -1
  226. package/dist/Sia.cjs +0 -1
  227. package/dist/Sia2.cjs +0 -1
  228. package/dist/Sia2.js +0 -1
  229. package/dist/SiaPopup.cjs +0 -1
  230. package/dist/SiaPopup.js +0 -1
  231. package/dist/ToolBar.cjs +0 -1
  232. package/dist/ToolBar.js +0 -1
  233. package/dist/Toolbar/NavigationButtons.cjs +0 -1
  234. package/dist/Toolbar/NavigationButtons.js +0 -1
  235. package/dist/Toolbar/Toolbar.cjs +0 -1
  236. package/dist/Toolbar/ToolbarItems/AccessibilityTools.cjs +0 -1
  237. package/dist/Toolbar/ToolbarItems/AnnoToolSelector.cjs +0 -1
  238. package/dist/Toolbar/ToolbarItems/ImageToolItems/ImageLabel.cjs +0 -1
  239. package/dist/Toolbar/ToolbarItems/ImageToolItems/ImageLabel.js +0 -1
  240. package/dist/Toolbar/ToolbarItems/ImageToolItems/TagLabel.cjs +0 -1
  241. package/dist/Toolbar/ToolbarItems/ImageTools.cjs +0 -1
  242. package/dist/Toolbar/ToolbarItems/Instructions.cjs +0 -1
  243. package/dist/Toolbar/ToolbarItems/InstructionsModal.cjs +0 -1
  244. package/dist/ToolbarItem.cjs +0 -1
  245. package/dist/ToolbarItem.js +0 -1
  246. package/dist/_virtual/_commonjsHelpers.cjs +0 -1
  247. package/dist/_virtual/_commonjsHelpers.js +0 -1
  248. package/dist/_virtual/lodash.cjs +0 -1
  249. package/dist/_virtual/lodash.js +0 -1
  250. package/dist/assets/Annotation/Annotation-Cd5Ua5TG.css +0 -1
  251. package/dist/assets/Toolbar-Cp1xyYeH.css +0 -1
  252. package/dist/filterTools.cjs +0 -1
  253. package/dist/filterTools.js +0 -1
  254. package/dist/index.cjs +0 -1
  255. package/dist/models/AllowedTools.cjs +0 -1
  256. package/dist/models/AllowedTools.js +0 -1
  257. package/dist/models/AnnotationMode.cjs +0 -1
  258. package/dist/models/AnnotationSettings.cjs +0 -1
  259. package/dist/models/AnnotationSettings.js +0 -1
  260. package/dist/models/AnnotationStatus.cjs +0 -1
  261. package/dist/models/AnnotationTool.cjs +0 -1
  262. package/dist/models/CanvasAction.cjs +0 -1
  263. package/dist/models/Direction.cjs +0 -1
  264. package/dist/models/EditorModes.cjs +0 -1
  265. package/dist/models/ExternalAnnotation.cjs +0 -1
  266. package/dist/models/ExternalAnnotation.js +0 -1
  267. package/dist/models/KeyAction.cjs +0 -1
  268. package/dist/models/Label.cjs +0 -1
  269. package/dist/models/Label.js +0 -1
  270. package/dist/models/UiConfig.cjs +0 -1
  271. package/dist/models/UiConfig.js +0 -1
  272. package/dist/models/index.cjs +0 -1
  273. package/dist/siaDummyData.cjs +0 -7
  274. package/dist/siaDummyData.js +0 -7
  275. package/dist/stories/Canvas/CanvasOffset.cjs +0 -1
  276. package/dist/stories/Canvas/CanvasOffset.js +0 -1
  277. package/dist/stories/FilterDropdown.stories.cjs +0 -1
  278. package/dist/stories/FilterDropdown.stories.js +0 -1
  279. package/dist/stories/SIA2/DemoWrapper.cjs +0 -1
  280. package/dist/stories/SIA2/DemoWrapper.js +0 -1
  281. package/dist/stories/siaDummyData.cjs +0 -1
  282. package/dist/stories/siaDummyData.js +0 -1
  283. package/dist/stories/siaDummyData2.cjs +0 -7
  284. package/dist/stories/siaDummyData2.js +0 -7
  285. package/dist/types/annoStatus.cjs +0 -1
  286. package/dist/types/annoStatus.js +0 -1
  287. package/dist/types/canvasActions.cjs +0 -1
  288. package/dist/types/canvasActions.js +0 -1
  289. package/dist/types/cursorstyles.cjs +0 -1
  290. package/dist/types/cursorstyles.js +0 -1
  291. package/dist/types/modes.cjs +0 -1
  292. package/dist/types/modes.js +0 -1
  293. package/dist/types/notificationType.cjs +0 -1
  294. package/dist/types/notificationType.js +0 -1
  295. package/dist/types/toolbarEvents.cjs +0 -1
  296. package/dist/types/toolbarEvents.js +0 -1
  297. package/dist/types/tools.cjs +0 -1
  298. package/dist/types/tools.js +0 -1
  299. package/dist/types.cjs +0 -1
  300. package/dist/utils/KeyMapper.cjs +0 -1
  301. package/dist/utils/annoConversion.cjs +0 -1
  302. package/dist/utils/annoConversion.js +0 -1
  303. package/dist/utils/annoConversion2.cjs +0 -1
  304. package/dist/utils/annoConversion2.js +0 -1
  305. package/dist/utils/color.cjs +0 -1
  306. package/dist/utils/colorlut.cjs +0 -1
  307. package/dist/utils/colorlut.js +0 -1
  308. package/dist/utils/constraints.cjs +0 -1
  309. package/dist/utils/constraints.js +0 -1
  310. package/dist/utils/hist.cjs +0 -1
  311. package/dist/utils/hist.js +0 -1
  312. package/dist/utils/index.cjs +0 -1
  313. package/dist/utils/keyActions.cjs +0 -1
  314. package/dist/utils/keyActions.js +0 -1
  315. package/dist/utils/mouse.cjs +0 -1
  316. package/dist/utils/mouse2.cjs +0 -1
  317. package/dist/utils/mouse2.js +0 -1
  318. package/dist/utils/siaIcons.cjs +0 -12
  319. package/dist/utils/transform.cjs +0 -1
  320. package/dist/utils/transform2.cjs +0 -1
  321. package/dist/utils/transform2.js +0 -1
  322. package/dist/utils/uiConfig.cjs +0 -1
  323. package/dist/utils/windowViewport.cjs +0 -1
  324. package/dist/utils/windowViewport2.cjs +0 -1
  325. package/dist/utils/windowViewport2.js +0 -1
  326. package/src/AnnoLabelInput.jsx +0 -109
  327. package/src/AnnoToolBar.jsx +0 -153
  328. package/src/Annotation/AnnoBar.jsx +0 -154
  329. package/src/Annotation/Annotation.jsx +0 -395
  330. package/src/Annotation/Annotation.scss +0 -47
  331. package/src/Annotation/BBox.jsx +0 -299
  332. package/src/Annotation/Edge.jsx +0 -92
  333. package/src/Annotation/InfSelectionArea.jsx +0 -72
  334. package/src/Annotation/Line.jsx +0 -68
  335. package/src/Annotation/Node.jsx +0 -282
  336. package/src/Annotation/Point.jsx +0 -200
  337. package/src/Annotation/Polygon.jsx +0 -404
  338. package/src/Annotation/logic/AnnotationUtils.ts +0 -30
  339. package/src/Canvas.jsx +0 -2194
  340. package/src/ImgBar.jsx +0 -131
  341. package/src/LabelInput.jsx +0 -238
  342. package/src/Prompt.jsx +0 -45
  343. package/src/SIAFilterButton.jsx +0 -186
  344. package/src/Sia.jsx +0 -478
  345. package/src/Sia2.tsx +0 -392
  346. package/src/SiaPopup.jsx +0 -15
  347. package/src/ToolBar.jsx +0 -463
  348. package/src/Toolbar/NavigationButtons.tsx +0 -21
  349. package/src/Toolbar/ToolbarItem.jsx +0 -30
  350. package/src/Toolbar/ToolbarItems/ImageToolItems/ImageLabel.tsx +0 -62
  351. package/src/Toolbar.css +0 -13
  352. package/src/ToolbarItem.jsx +0 -31
  353. package/src/filterTools.js +0 -5
  354. package/src/models/AllowedTools.tsx +0 -9
  355. package/src/models/AnnotationSettings.tsx +0 -9
  356. package/src/models/ExternalAnnotation.ts +0 -15
  357. package/src/models/Label.tsx +0 -8
  358. package/src/models/UiConfig.tsx +0 -6
  359. package/src/stories/Button.jsx +0 -54
  360. package/src/stories/Button.stories.js +0 -48
  361. package/src/stories/Header.jsx +0 -69
  362. package/src/stories/Header.stories.js +0 -28
  363. package/src/stories/Page.jsx +0 -87
  364. package/src/stories/Page.stories.js +0 -28
  365. package/src/stories/SIA2/DemoWrapper.stories.tsx +0 -167
  366. package/src/stories/SIA2/DemoWrapper.tsx +0 -54
  367. package/src/stories/SIA2/Sia2.stories.tsx +0 -62
  368. package/src/stories/Toolbar/ImageTools/ImageLabel.stories.tsx +0 -32
  369. package/src/stories/assets/accessibility.png +0 -0
  370. package/src/stories/assets/accessibility.svg +0 -5
  371. package/src/stories/assets/addon-library.png +0 -0
  372. package/src/stories/assets/assets.png +0 -0
  373. package/src/stories/assets/avif-test-image.avif +0 -0
  374. package/src/stories/assets/context.png +0 -0
  375. package/src/stories/assets/discord.svg +0 -15
  376. package/src/stories/assets/docs.png +0 -0
  377. package/src/stories/assets/figma-plugin.png +0 -0
  378. package/src/stories/assets/github.svg +0 -3
  379. package/src/stories/assets/share.png +0 -0
  380. package/src/stories/assets/styling.png +0 -0
  381. package/src/stories/assets/testing.png +0 -0
  382. package/src/stories/assets/theming.png +0 -0
  383. package/src/stories/assets/tutorials.svg +0 -12
  384. package/src/stories/assets/youtube.svg +0 -4
  385. package/src/stories/button.css +0 -30
  386. package/src/stories/header.css +0 -32
  387. package/src/stories/lost.js +0 -54
  388. package/src/stories/page.css +0 -69
  389. package/src/stories/siaDummyData.js +0 -263
  390. package/src/stories/store.js +0 -18
  391. package/src/test.js +0 -7
  392. package/src/types/annoStatus.js +0 -4
  393. package/src/types/canvasActions.js +0 -58
  394. package/src/types/cursorstyles.js +0 -3
  395. package/src/types/modes.js +0 -9
  396. package/src/types/notificationType.js +0 -11
  397. package/src/types/toolbarEvents.js +0 -35
  398. package/src/types/tools.js +0 -17
  399. package/src/types.tsx +0 -11
  400. package/src/utils/annoConversion.js +0 -145
  401. package/src/utils/annoConversion2.ts +0 -145
  402. package/src/utils/colorlut.js +0 -68
  403. package/src/utils/constraints.js +0 -81
  404. package/src/utils/index.js +0 -1
  405. package/src/utils/keyActions.js +0 -113
  406. package/src/utils/mouse.js +0 -14
  407. package/src/utils/mouse2.ts +0 -35
  408. package/src/utils/transform.js +0 -336
  409. package/src/utils/transform2.ts +0 -343
  410. package/src/utils/windowViewport.js +0 -34
  411. 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;
@@ -1 +1 @@
1
- import a from"../../models/AnnotationMode.js";import r from"../../models/AnnotationStatus.js";class l{constructor(t,o,s,i=a.CREATE,e=r.CREATING,n=""){this.internalId=t,this.externalId=n,this.labelIds=[],this.type=o,this.mode=i,this.status=e,this.coordinates=s,this.selectedNode=1,this.timestamp=performance.now(),this.annoTime=0}}export{l as default};
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;
@@ -1 +1 @@
1
- import{jsxs as T,jsx as u}from"react/jsx-runtime";import D from"../../models/AnnotationTool.js";import{getDefaultColor as L}from"../../utils/color.js";import j from"./tools/Point.js";import w from"./tools/Line.js";import q from"./atoms/AnnoBar.js";import v from"../../models/CanvasAction.js";import z from"./tools/BBox.js";import G from"./tools/Polygon.js";import{useState as y,useRef as H,useEffect as b}from"react";import t from"../../models/AnnotationMode.js";const eo=({scaledAnnotation:r,annotationSettings:d,possibleLabels:A,svgScale:s,pageToStageOffset:a,strokeWidth:_,nodeRadius:x,isSelected:l,isDisabled:B=!1,onFinishAnnoCreate:P,onLabelIconClicked:R,onAction:V=(n,c)=>{},onAnnoChanged:N=n=>{},onAnnotationModeChange:W=n=>{}})=>{const[n,c]=y(r.coordinates),[e,i]=y(r.mode),[k,f]=y(!1),h=H(n);b(()=>{h.current=n},[n]);const p=()=>{i(t.VIEW);const o={...r,coordinates:h.current};P(o)},F=o=>A.find(E=>E.id===o),I=(()=>{if(!r.labelIds||r.labelIds.length==0)return L();const o=F(r.labelIds[0]);return o===void 0||o.color===void 0?L():o.color})(),m={stroke:I,fill:I,strokeWidth:_/s,r:x/s},C=o=>{c(o);let E=o;[t.ADD,t.MOVE].includes(e)&&(E=o.slice(0,-1)),N({...r,coordinates:E})},M=o=>{e!==t.CREATE&&i(t.MOVE),c(o)},g=()=>{i(t.VIEW),N({...r,coordinates:h.current})};b(()=>{W(e)},[e]),b(()=>{e!==t.CREATE&&c(r.coordinates)},[r]);const O=()=>{switch(r.type){case D.Point:return u(j,{isSelected:l,annotationSettings:d,coordinates:n[0],pageToStageOffset:a,svgScale:s,style:m,onMoving:o=>{i(t.MOVE),c([o])},onMoved:g,onIsDraggingStateChanged:f});case D.Line:return u(w,{annotationSettings:d,coordinates:n,isSelected:l,pageToStageOffset:a,annotationMode:e,setAnnotationMode:i,svgScale:s,style:m,onAddNode:C,onDeleteNode:C,onMoving:M,onMoved:g,onIsDraggingStateChanged:f,onFinishAnnoCreate:p});case D.BBox:return u(z,{annotationMode:e,annotationSettings:d,startCoords:n[0],endCoords:n[1],isSelected:l,pageToStageOffset:a,style:m,svgScale:s,onDeleteNode:()=>{console.log("TODO")},onIsDraggingStateChanged:f,onFinishAnnoCreate:p,onMoving:M,onMoved:g});case D.Polygon:return u(G,{annotationSettings:d,coordinates:n,isSelected:l,isDisabled:B,pageToStageOffset:a,annotationMode:e,setAnnotationMode:i,svgScale:s,style:m,onAddNode:C,onDeleteNode:C,onMoving:M,onMoved:g,onIsDraggingStateChanged:f,onFinishAnnoCreate:p})}};return T("g",{onClick:o=>{o.stopPropagation(),V(r,v.ANNO_SELECTED)},children:[!k&&e!==t.CREATE&&u(q,{annotationCoordinates:n,canLabel:d.canLabel,labels:A,color:I,isSelected:l,selectedLabelIds:r.labelIds,style:m,svgScale:s,onLabelIconClicked:R}),O()]})};export{eo as default};
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;
@@ -1 +1 @@
1
- import{jsxs as _,jsx as x}from"react/jsx-runtime";import{useState as r,useRef as C,useEffect as c}from"react";import m from"../../../utils/transform2.js";import H from"./DaviIcon.js";const R=10,p=15,j=3,U=({annotationCoordinates:u,canLabel:y,color:T,labels:b,selectedLabelIds:h=[],isSelected:E,svgScale:t,style:f,onLabelIconClicked:P})=>{const[e,B]=r({x:0,y:0}),[a,L]=r(0),[w,D]=r(0),[d,z]=r(0),[l,A]=r(""),s=C(null);c(()=>{A(F())},[h]),c(()=>{const i=m.getTopPoint(u),o=m.getMostLeftPoints(i)[0],n={x:o.x+7/t,y:o.y-10/t};B(n);const W=Math.ceil(R/t);z(W),D(p/t)},[t]),c(()=>{if(s===void 0)return;const n=(s.current.getBoundingClientRect().width+j)/t;L(n)},[s,l,d]);const F=()=>{const o=b.filter(n=>h.includes(n.id)).map(n=>n.name).join(", ");return o.length?o:"no label"};return _("g",{children:[E&&y&&x(H,{x:e.x-33/t,y:e.y-30/t,color:T,size:60/t,onClick:()=>P(e)}),x("rect",{x:e.x,y:e.y-6/(t*1.2),width:a,height:w,rx:5/t,opacity:"0.5",style:f}),x("text",{x:e.x+1/t,y:e.y+6/t,fill:"white",textAnchor:"start",alignmentBaseline:"central",ref:s,fontSize:`${d}pt`,children:l}),x("rect",{x:e.x,y:e.y-6/(t*1.2),width:a,height:p,rx:5/t,opacity:"0.01",style:f,onContextMenu:i=>i.preventDefault()})]})};export{U as default};
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,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;
@@ -1 +1 @@
1
- import{jsx as d}from"react/jsx-runtime";import f from"../../../utils/mouse2.js";const p=({startCoordinate:o,endCoordinate:t,isDisabled:s=!1,pageToStageOffset:r,style:n,svgScale:a,onAddNode:l=()=>{},onDoubleClick:u=()=>{},onMouseDown:x,onMouseMove:c})=>{const m=e=>{const y=f.getAntiScaledMouseStagePosition(e,r,a);l(y)};return d("line",{x1:o.x,y1:o.y,x2:t.x,y2:t.y,style:n,onClick:e=>e.ctrlKey&&m(e),onDoubleClick:u,onMouseDown:x,onMouseMove:c,onContextMenu:e=>e.preventDefault(),"stroke-dasharray":s?"10,5":"0"})};export{p as default};
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;
@@ -1 +1 @@
1
- import{jsxs as C,jsx as u}from"react/jsx-runtime";import{useState as c,useRef as H,useEffect as m}from"react";import h from"../../../utils/mouse2.js";const R=({index:v,coordinates:t,annotationSettings:o,pageToStageOffset:x,svgScale:r,style:y,onDeleteNode:p,onMoving:D,onMoved:I,onIsDraggingStateChanged:g})=>{const[A,i]=c(!1),[n,l]=c(!1),[s,a]=c(!1),f=H(s);m(()=>{f.current=s},[s]);const M=e=>{if(!n)return;const w=h.getAntiScaledMouseStagePosition(e,x,r);(e.movementX!==0||e.movementY!==0)&&(a(!0),D(v,w))};m(()=>{if(g(n),!n)return;const e=()=>{l(!1),f.current&&I(),a(!1)};return window.addEventListener("mouseup",e),()=>{window.removeEventListener("mouseup",e)}},[n]);const d=e=>{o.canEdit&&(e.ctrlKey?p():l(!0))},E=()=>u("circle",{cx:t.x,cy:t.y,r:12/r,onMouseLeave:e=>o.canEdit&&i(!1),onMouseDown:d,onContextMenu:e=>e.preventDefault()});return C("g",{children:[n&&u("circle",{cx:t.x,cy:t.y,r:"100%",style:{opacity:0},onMouseMove:e=>M(e),onContextMenu:e=>e.preventDefault()}),A&&E(),u("circle",{cx:t.x,cy:t.y,r:10/r,style:y,onMouseOver:()=>{o.canEdit&&i(!0)},onMouseDown:d,onMouseMove:e=>M(e),onContextMenu:e=>e.preventDefault()})]})};export{R as default};
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;
@@ -1 +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:s,isSelected:n,isDisabled:e=!1,annotationMode:u,style:f,onFinishAnnoCreate:p=()=>{},onMouseDown:a,onMouseUp:l=()=>{},onMouseMove:y})=>{const i=s.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={...f};return t.cursor=g,t.fillOpacity=n?0:.3,n&&e&&(t.stroke="none"),m("polygon",{points:i,style:t,onMouseDown:o=>{n&&r("grabbing"),a(o)},onMouseUp:o=>{r("grab"),l(o)},onDoubleClick:()=>u===x.CREATE&&p(),onMouseMove:y,onContextMenu:o=>o.preventDefault()})};export{E as default};
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;
@@ -1 +1 @@
1
- import{jsxs as G,jsx as y}from"react/jsx-runtime";import{useState as l,useRef as H,useEffect as x}from"react";import J from"../atoms/Node.js";import i from"../../../models/AnnotationMode.js";import K from"../../../utils/mouse2.js";import Q from"../atoms/PolygonArea.js";import V from"../atoms/Edge.js";const re=({annotationMode:m,annotationSettings:f,pageToStageOffset:w,startCoords:R,endCoords:b,svgScale:t,isSelected:E,style:C,onDeleteNode:T,onFinishAnnoCreate:U,onIsDraggingStateChanged:p,onMoving:v,onMoved:M})=>{const n=[R,{x:R.x,y:b.y},b,{x:b.x,y:R.y}],[D,j]=l(m===i.CREATE),[a,L]=l(!1),[d,N]=l(!1),[z,B]=l(0),[g,A]=l(!1),k=H(g);x(()=>{k.current=g},[g]);const X=e=>{f.canEdit!==!1&&E&&m!==i.CREATE&&e.button===0&&L(!0)},_=e=>{f.canEdit!==!1&&E&&m!==i.CREATE&&e.button===0&&N(!0)},Y=e=>{if(a){const o=[{...n[0]},{...n[2]}].map(s=>({x:s.x+=e.movementX/t,y:s.y+=e.movementY/t}));(e.movementX!==0||e.movementY!==0)&&(A(!0),v(o))}if(m===i.CREATE){const r=K.getAntiScaledMouseStagePosition(e,w,t),s=[[...n][0],r];v(s)}};x(()=>{if(!D)return;const e=r=>{r.button===2&&(U(),j(!1))};return window.addEventListener("mouseup",e),()=>{window.removeEventListener("mouseup",e)}},[D]),x(()=>{if(p(a),!a)return;const e=()=>{L(!1),k.current&&M(),A(!1)};return window.addEventListener("mouseup",e),()=>{window.removeEventListener("mouseup",e)}},[a]),x(()=>{if(p(d),!d)return;const e=()=>{N(!1),k.current&&M(),A(!1)};return window.addEventListener("mouseup",e),()=>{window.removeEventListener("mouseup",e)}},[d]);const $=()=>n.map((r,o)=>y(J,{index:o,annotationSettings:f,coordinates:r,pageToStageOffset:w,svgScale:t,style:C,onDeleteNode:()=>{const s=[...n];s.splice(o,1),T(s)},onMoving:(s,c)=>{const u=[n[0],n[2]];switch(s){case 0:u[0]=c;break;case 1:u[0].x=c.x,u[1].y=c.y;break;case 2:u[1]=c;break;case 3:u[1].x=c.x,u[0].y=c.y;break}v(u)},onMoved:()=>M(),onIsDraggingStateChanged:p},`node_${o}`)),h=(e,r)=>{const o=[n[0],n[2]];switch(e){case 0:o[0].x+=r.movementX/t;break;case 1:o[1].y+=r.movementY/t;break;case 2:o[1].x+=r.movementX/t;break;case 3:o[0].y+=r.movementY/t;break}(r.movementX!==0||r.movementY!==0)&&(A(!0),v(o))},q=()=>n.map((r,o)=>{const s=o+1<n.length?n[o+1]:n[0],c=o%2===0?"ew-resize":"ns-resize";return y(V,{startCoordinate:r,endCoordinate:s,pageToStageOffset:w,svgScale:t,style:{...C,cursor:c},onMouseDown:_,onMouseMove:u=>{B(o),d&&h(o,u)}},`edge_${o}`)}),I=e=>y("circle",{cx:n[0].x,cy:n[0].y,r:"100%",style:{opacity:0},onMouseDown:X,onMouseMove:r=>{e&&d&&h(z,r),!e&&Y(r)},onContextMenu:r=>r.preventDefault()});return G("g",{children:[(a||m===i.CREATE)&&I(!1),y(Q,{annotationSettings:f,coordinates:n,isSelected:E,annotationMode:m,pageToStageOffset:w,style:C,svgScale:t,onIsDraggingStateChanged:p,onMouseDown:X,onMouseMove:Y}),d&&I(!0),E&&f.canEdit&&q(),E&&m!==i.CREATE&&$()]})};export{re as default};
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;
@@ -1 +1 @@
1
- import{jsxs as Y,jsx as d}from"react/jsx-runtime";import{useState as P,useRef as _,useEffect as b}from"react";import $ from"../atoms/Node.js";import i from"../../../models/AnnotationMode.js";import k from"../atoms/Edge.js";import x from"../../../utils/mouse2.js";const H=({annotationSettings:A,coordinates:n,isSelected:p,annotationMode:r,pageToStageOffset:l,svgScale:s,style:C,onAddNode:v,onDeleteNode:I,onFinishAnnoCreate:L,onMoving:c,onMoved:w,onIsDraggingStateChanged:R})=>{const[m,y]=P(!1),[E,g]=P(!1),D=_(E);b(()=>{D.current=E},[E]);const M=t=>{if(A.canEdit!==!1&&(p&&r!==i.CREATE&&t.button===0&&y(!0),t.button===2&&r==i.CREATE)){const o=x.getAntiScaledMouseStagePosition(t,l,s);let e=[...n];e.push(o),v(e)}},N=t=>{if(m){const o=n.map(e=>({x:e.x+=t.movementX/s,y:e.y+=t.movementY/s}));(t.movementX!==0||t.movementY!==0)&&(g(!0),c(o))}if(r===i.CREATE){const o=x.getAntiScaledMouseStagePosition(t,l,s);let e=[...n];n.length>1&&(e=n.slice(0,-1)),e.push(o),c(e)}};b(()=>{if(R(m),!m)return;const t=()=>{y(!1),D.current&&w(),g(!1)};return window.addEventListener("mouseup",t),()=>{window.removeEventListener("mouseup",t)}},[m]);const T=()=>d("circle",{cx:n[0].x,cy:n[0].y,r:"100%",style:{opacity:0},onMouseDown:M,onMouseMove:N,onContextMenu:t=>t.preventDefault()}),a=()=>n.map((o,e)=>d($,{index:e,annotationSettings:A,coordinates:o,pageToStageOffset:l,svgScale:s,style:C,onDeleteNode:()=>{const u=[...n];u.splice(e,1),I(u)},onMoving:(u,f)=>{const h=[...n];h[u]=f,c(h)},onMoved:()=>w(),onIsDraggingStateChanged:R},`node_${e}`)),j=()=>n.map((o,e)=>{if(!(e+1>=n.length))return d(k,{startCoordinate:o,endCoordinate:n[e+1],pageToStageOffset:l,svgScale:s,style:C,onAddNode:u=>{const f=[...n];f.splice(e+1,0,u),v(f)},onDoubleClick:()=>r===i.CREATE&&L(),onMouseDown:M,onMouseMove:N},`edge_${e}`)}),X=p&&r!==i.CREATE;return Y("g",{children:[(m||r===i.CREATE)&&T(),j(),X&&a()]})};export{H as default};
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;
@@ -1 +1 @@
1
- import{jsx as x}from"react/jsx-runtime";import l from"../atoms/Node.js";const M=({annotationSettings:e,coordinates:o,isSelected:n,pageToStageOffset:t,svgScale:r,style:d,onMoving:i,onMoved:m,onIsDraggingStateChanged:f})=>x(l,{index:0,annotationSettings:e,coordinates:o,pageToStageOffset:t,svgScale:r,style:d,onDeleteNode:()=>{},onMoving:(s,p)=>n&&i(p),onMoved:()=>m([o]),onIsDraggingStateChanged:f});export{M as default};
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;
@@ -1 +1 @@
1
- import{jsxs as $,jsx as c}from"react/jsx-runtime";import{useState as j,useRef as k,useEffect as I}from"react";import U from"../atoms/Node.js";import g from"../atoms/PolygonArea.js";import m from"../../../models/AnnotationMode.js";import q from"../atoms/Edge.js";import L from"../../../utils/mouse2.js";const V=({annotationSettings:i,coordinates:o,isSelected:l,isDisabled:P=!1,annotationMode:t,pageToStageOffset:f,svgScale:s,style:p,onAddNode:D,onDeleteNode:T,onFinishAnnoCreate:M,onMoving:C,onMoved:N,onIsDraggingStateChanged:d})=>{const[E,b]=j(!1),[v,h]=j(!1),x=k(v);I(()=>{x.current=v},[v]);const w=r=>{if(i.canEdit!==!1&&(l&&t!==m.CREATE&&r.button===0&&b(!0),r.button===2&&t==m.CREATE)){const n=L.getAntiScaledMouseStagePosition(r,f,s);let e=[...o];e.push(n),D(e)}},y=r=>{if(E){const n=o.map(e=>({x:e.x+=r.movementX/s,y:e.y+=r.movementY/s}));(r.movementX!==0||r.movementY!==0)&&(h(!0),C(n))}if(t===m.CREATE){const n=L.getAntiScaledMouseStagePosition(r,f,s);let e=[...o];o.length>1&&(e=o.slice(0,-1)),e.push(n),C(e)}};I(()=>{if(d(E),!E)return;const r=()=>{b(!1),x.current&&N(),h(!1)};return window.addEventListener("mouseup",r),()=>{window.removeEventListener("mouseup",r)}},[E]);const X=()=>o.map((n,e)=>c(U,{index:e,annotationSettings:i,coordinates:n,pageToStageOffset:f,svgScale:s,style:p,onDeleteNode:()=>{const u=[...o];u.splice(e,1),T(u)},onMoving:(u,R)=>{const A=[...o];A[u]=R,C(A)},onMoved:()=>N(),onIsDraggingStateChanged:d},`node_${e}`)),Y=()=>o.map((n,e)=>{const u=e+1<o.length?o[e+1]:o[0];return c(q,{startCoordinate:n,endCoordinate:u,isDisabled:P&&l,pageToStageOffset:f,svgScale:s,style:p,onAddNode:R=>{const A=[...o];A.splice(e+1,0,R),D(A)},onDoubleClick:()=>t===m.CREATE&&M(),onMouseDown:w,onMouseMove:y},`edge_${e}`)}),_=()=>c("circle",{cx:o[0].x,cy:o[0].y,r:"100%",style:{opacity:0},onMouseDown:w,onMouseMove:y,onContextMenu:r=>r.preventDefault()});return $("g",{children:[(E||t===m.CREATE)&&_(),c(g,{annotationSettings:i,coordinates:o,isSelected:l,isDisabled:P,annotationMode:t,pageToStageOffset:f,style:p,svgScale:s,onFinishAnnoCreate:M,onIsDraggingStateChanged:d,onMouseDown:w,onMouseMove:y}),l&&i.canEdit&&Y(),l&&t!==m.CREATE&&X()]})};export{V as default};
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;
@@ -1 +1 @@
1
- import{jsxs as w,jsx as O}from"react/jsx-runtime";import{useState as E,useRef as ne,useEffect as A}from"react";import P from"../models/AnnotationTool.js";import i from"../models/EditorModes.js";import we from"../utils/KeyMapper.js";import c from"../models/KeyAction.js";import te from"../Annotation/logic/Annotation.js";import Se from"../models/CanvasAction.js";import xe from"../Annotation/ui/AnnotationComponent.js";import ke from"../utils/mouse2.js";import S from"../models/AnnotationMode.js";import Re from"./LabelInput.js";import{FontAwesomeIcon as Ve}from"@fortawesome/react-fontawesome";import{faBan as Le}from"@fortawesome/free-solid-svg-icons";import Ke from"../models/AnnotationStatus.js";const eo=({annotations:se=[],annotationSettings:x,image:W,isImageJunk:Y=!1,isPolygonSelectionMode:B=!1,polygonOperationResult:k={annotationsToDelete:[],polygonsToCreate:[]},possibleLabels:F,preventScrolling:X=!0,selectedAnnotation:l,selectedAnnoTool:R,toolbarHeight:re=0,uiConfig:U,onAnnoCreated:ae,onAnnoCreationFinished:ce,onAnnoChanged:G,onRequestNewAnnoId:H,onSelectAnnotation:$})=>{const[_,g]=E(i.VIEW),[f,j]=E(0),[y,z]=E({x:-1,y:-1}),[r,J]=E([-1,-1]),[u,ie]=E([-1,-1]),[d,Q]=E([-1,-1]),[a,p]=E(1),[T,I]=E([0,0]),[D,N]=E(),h=ne(null),C=ne(null),le=new we(e=>ue(e)),de=e=>{g(i.CREATE);const o=b([e]);R===P.BBox&&o.push(o[0]);const n=H(),t=new te(n,R,o);if(ae(t),R===P.Point){const s={...t,coordinates:[e]};L(s)}},Oe=()=>{g(i.VIEW),j(0),z({x:-1,y:-1}),J([-1,-1]),Q([-1,-1]),p(1),I([0,0]),N(void 0)};A(()=>{Oe()},[W]),A(()=>{const{top:e,left:o}=C.current.getBoundingClientRect(),n={x:o+window.scrollX,y:e+window.scrollY};z(n)},[C,f,T]);const Ee=(e,o)=>{if(e[0]===0||e[1]===0||o[0]===0||o[1]===0)return 0;const n=o[0]/e[0],t=o[1]/e[1];return Math.min(n,t)},ue=e=>{switch(e){case c.EDIT_LABEL:console.log("KeyAction TODO: EDIT_LABEL");break;case c.DELETE_ANNO:console.log("KeyAction TODO: DELETE_ANNO");break;case c.TOGGLE_ANNO_COMMENT_INPUT:console.log("KeyAction TODO: TOGGLE_ANNO_COMMENT_INPUT");break;case c.DELETE_ANNO_IN_CREATION:console.log("KeyAction TODO: DELETE_ANNO_IN_CREATION");break;case c.ENTER_ANNO_ADD_MODE:console.log("KeyAction TODO: ENTER_ANNO_ADD_MODE");break;case c.LEAVE_ANNO_ADD_MODE:console.log("KeyAction TODO: LEAVE_ANNO_ADD_MODE");break;case c.UNDO:console.log("KeyAction TODO: UNDO");break;case c.REDO:console.log("KeyAction TODO: REDO");break;case c.TRAVERSE_ANNOS:console.log("KeyAction TODO: TRAVERSE_ANNOS");break;case c.CAM_MOVE_LEFT:M(20*a,0);break;case c.CAM_MOVE_RIGHT:M(-20*a,0);break;case c.CAM_MOVE_UP:M(0,20*a);break;case c.CAM_MOVE_DOWN:M(0,-20*a);break;case c.CAM_MOVE_STOP:console.log("KeyAction TODO: CAM_MOVE_STOP");break;case c.COPY_ANNOTATION:console.log("KeyAction TODO: COPY_ANNOTATION");break;case c.PASTE_ANNOTATION:console.log("KeyAction TODO: PASTE_ANNOTATION");break;case c.RECREATE_ANNO:console.log("KeyAction TODO: RECREATE_ANNO");break;default:console.log("Unknown KeyAction",e);break}},M=(e,o)=>{let n=T[0]+e/a,t=T[1]+o/a;const s=u[0]*-.25,v=u[1]*-.25,m=u[0]*.75,K=u[1]*.75;n<s&&(n+=25),n>m&&(n-=25),t<v&&(t+=25),t>K&&(t-=25),I([n,t])},ge=e=>e.map(n=>({x:n.x*r[0],y:n.y*r[1]})),fe=e=>{const o=d[0]/r[0];return e.map(t=>({x:t.x*o,y:t.y*o}))},V=e=>{const o=ge(e);return fe(o)},Te=(e=>d[0]<=0||d[1]<=0||r[0]<=0||r[1]<=0?[]:se.map(n=>({...n,coordinates:V(n.coordinates)})))();A(()=>{if(h.current===null)return;const{width:e,height:o}=h.current.getBoundingClientRect(),n=o-re;ie([e,n])},[h]),A(()=>{if(C.current===null)return;const{width:e,height:o}=C.current.getBoundingClientRect();J([e,o])},[C]),A(()=>{if(u[0]<=0||u[1]<=0||r[0]<=0||r[1]<=0)return;const e=Ee(r,u);j(e)},[u,r]),A(()=>{if(f===0)return;const e=[r[0]*f,r[1]*f];Q(e)},[f]),A(()=>{if(!B)return;const e=H();k.polygonsToCreate!==void 0&&k.polygonsToCreate.forEach(o=>{const n=new te(e,P.Polygon,V(o),S.VIEW,Ke.CREATED);L(n)})},[k]);const L=e=>{g(i.VIEW),e.mode=S.VIEW;const o=b(e.coordinates);e.coordinates=o,G(e),ce(e)},me=e=>{e.preventDefault(),le.keyDown(e.key)},Ae=e=>{e.preventDefault()},Ce=e=>{if(e.button!==0){if(e.button===1)g(i.CAMERA_MOVE);else if(e.button===2){if(!x.canCreate)return;const o=ke.getAntiScaledMouseStagePosition(e,y,a);de(o)}}},Ie=e=>e.map(n=>({x:n.x/f,y:n.y/f})),Ne=()=>{X&&(document.body.style.overflow="hidden")},he=e=>{switch(e.button){case 1:g(i.VIEW);break}},Z=e=>{_===i.CAMERA_MOVE&&M(e.movementX,e.movementY)},Me=()=>{X&&(document.body.style.overflow="")},_e=e=>{const n=e.deltaY<0?1:-1,t=h.current.getBoundingClientRect(),s=e.clientX-t.left,v=e.clientY-t.top;let m=n>0?a*1.25:a/1.25;const K=(s-T[0]*a)/a,ve=(v-T[1]*a)/a,ee=s/m-K,oe=v/m-ve;m<1?(p(1),I([0,0])):m>200?(p(200),I([ee,oe])):(p(m),I([ee,oe]))},ye=(e,o)=>{switch(o){case Se.ANNO_SELECTED:const n={...e,coordinates:b([...e.coordinates])};$(n);break;default:console.log("Unknown Canvas Action:",o)}},b=e=>Ie(e).map(s=>(s.x<0&&(s.x=0),s.y<0&&(s.y=0),s.x>r[0]&&(s.x=r[0]),s.y>r[1]&&(s.y=r[1]),s)).map(s=>({x:s.x/r[0],y:s.y/r[1]})),q=e=>{const o=b(e.coordinates),n={...e,coordinates:o};G(n)},pe=e=>{const o={x:e.x*a+y.x,y:e.y*a+y.y};N(o)},De=()=>{if(_===i.CAMERA_MOVE)return"";const e=Te.map(o=>{if(!([i.CREATE,i.MOVE].includes(_)&&o.internalId!==(l==null?void 0:l.internalId)))return O(xe,{scaledAnnotation:o,annotationSettings:x,possibleLabels:F,svgScale:a,pageToStageOffset:y,nodeRadius:U.nodeRadius,strokeWidth:U.strokeWidth,isSelected:o.internalId===(l==null?void 0:l.internalId),isDisabled:B&&o.internalId===(l==null?void 0:l.internalId),onFinishAnnoCreate:L,onLabelIconClicked:pe,onAction:ye,onAnnoChanged:q,onAnnotationModeChange:t=>{t===S.MOVE&&g(i.MOVE),_===i.MOVE&&t===S.VIEW&&g(i.VIEW)}},`annotationComponent_${o.internalId}`)});return O("g",{children:e})},be=()=>O("circle",{cx:d[0]/2,cy:d[1]/2,r:"100%",style:{opacity:0},onContextMenu:e=>e.preventDefault(),onClick:()=>{N(void 0)}});return w("div",{ref:h,style:{width:"100%",height:"100%"},children:[D&&O("div",{style:{position:"absolute",left:D.x,top:D.y},children:O(Re,{selectedLabelsIds:l.labelIds,possibleLabels:F,isMultilabel:x.canHaveMultipleLabels,onLabelSelect:e=>{N(void 0);const o={...l,coordinates:V(l.coordinates),labelIds:[...e]};q(o)}})}),Y&&w("div",{style:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",textAlign:"center",color:"white"},children:[O(Ve,{icon:Le,size:"5x",style:{marginBottom:15}}),O("h2",{children:"Marked as Junk"})]}),w("svg",{width:"100%",height:"100%",onKeyDown:me,onKeyUp:Ae,onMouseMove:Z,tabIndex:0,children:[w("g",{transform:`scale(${a}) translate(${T[0]}, ${T[1]})`,onMouseOver:Ne,onMouseLeave:Me,onMouseUp:he,onWheel:_e,onMouseMove:Z,onClick:()=>{$(void 0)},children:[O("image",{onContextMenu:e=>e.preventDefault(),onMouseDown:Ce,href:W,ref:C,width:d[0]>0?d[0]:void 0,height:d[1]>0?d[1]:void 0}),De()]}),D&&be(),Y&&O("rect",{x:"0",y:"0",width:d[0],height:d[1],style:{opacity:.8},onContextMenu:e=>e.preventDefault(),onClick:()=>{N(void 0)}})]})]})};export{eo as default};
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;
@@ -1 +1 @@
1
- import{jsx as r,jsxs as c}from"react/jsx-runtime";import{useState as f}from"react";import{CDropdown as h,CDropdownMenu as C,CFormInput as x,CDropdownItem as l}from"@coreui/react";const I=({selectedLabelsIds:o,possibleLabels:d,isMultilabel:a=!1,onLabelSelect:u})=>{const[n,p]=f(""),i=d.filter(e=>e.name.toLowerCase().includes(n.toLowerCase())),m=e=>{let t=[];if(a){t=[...o];const s=o.indexOf(e.id);s!==-1?t.splice(s,1):t.push(e.id)}else t=[e.id];u(t)};return r(h,{visible:!0,children:c(C,{style:{minWidth:"250px"},children:[r("div",{className:"px-3 py-2",children:r(x,{placeholder:"Filter label...",value:n,onChange:e=>p(e.target.value),autoFocus:!0})}),i.length>0?i.map(e=>r(l,{onClick:()=>m(e),children:e.name},e.id)):r(l,{disabled:!0,children:"No results"})]})})};export{I as default};
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 CHANGED
@@ -1 +1 @@
1
- import{jsxs as F,jsx as C}from"react/jsx-runtime";import{useState as i,useRef as G,useEffect as l}from"react";import R from"./Canvas.js";import{noAnnos as E}from"./siaDummyData.js";import P from"./ToolBar.js";import{CANVAS_UI_CONFIG_UPDATE as A,CANVAS_SVG_UPDATE as w}from"./types/canvasActions.js";import{EDIT_NODE_RADIUS as W,EDIT_STROKE_WIDTH as K,SHOW_ANNO_STATS as M,SHOW_LABEL_INFO as V,SHOW_ANNO_DETAILS as H,SET_FULLSCREEN as J}from"./types/toolbarEvents.js";const Z=e=>{const[k,m]=i(""),[s,f]=i(),[S,g]=i(E),[c,I]=i(0),[T,h]=i(),[x,d]=i(!1),[a,o]=i({nodeRadius:4,strokeWidth:4,annoDetails:{visible:!1},labelInfo:{visible:!1},annoStats:{visible:!1},layoutOffset:{left:20,top:0,bottom:5,right:5},imgBarVisible:!0,imgLabelInputVisible:!1,centerCanvasInContainer:!0,maxCanvas:!0}),b=G();l(()=>{v()},[e.layoutUpdate]),l(()=>{},[S]),l(()=>{e.annos?g(e.annos):g({...E})},[e.annos]),l(()=>{typeof e.fullscreen=="boolean"&&s!==e.fullscreen&&f(e.fullscreen)},[e.fullscreen]),l(()=>{s!==void 0&&O(s)},[s]),l(()=>{d(!0),o({...a,...e.uiConfig})},[e.uiConfig]),l(()=>{x?d(!1):e.onCanvasEvent&&e.onCanvasEvent(A,a)},[a]);const v=()=>{I(c+1)},B=(n,t,u)=>{e.onAnnoEvent&&e.onAnnoEvent(n,t,u)},D=n=>{e.onNotification&&e.onNotification(n)},_=n=>{e.onCanvasKeyDown&&e.onCanvasKeyDown(n)},r=(n,t)=>{switch(n){case w:h(t);break;case A:o({...a,...t});break}e.onCanvasEvent&&e.onCanvasEvent(n,t)},y=n=>{e.onGetFunction&&e.onGetFunction(n)},N=(n,t)=>{e.onAnnoSaveEvent&&e.onAnnoSaveEvent(n,t)},O=n=>{n?(m("sia-fullscreen"),o({...a,layoutOffset:{...a.layoutOffset,left:50,top:5}}),v()):(m(""),o({...a,layoutOffset:{...a.layoutOffset,left:20,top:0}}),v())},U=()=>{f(!s)},L=(n,t)=>{switch(n){case J:U();break;case H:o({...a,annoDetails:{...a.annoDetails,visible:!a.annoDetails.visible}});break;case V:o({...a,labelInfo:{...a.labelInfo,visible:!a.labelInfo.visible}});break;case M:o({...a,annoStats:{...a.annoStats,visible:!a.annoStats.visible}});break;case K:o({...a,strokeWidth:t});break;case W:o({...a,nodeRadius:t});break}e.onToolBarEvent&&e.onToolBarEvent(n,t)};return e.canvasConfig.tools,F("div",{className:`sia-app ${k}`,ref:b,children:[C(R,{container:b,onAnnoEvent:(n,t,u)=>B(n,t,u),onNotification:n=>D(n),onKeyDown:n=>_(n),onCanvasEvent:(n,t)=>r(n,t),onGetAnnoExample:n=>e.onGetAnnoExample?e.onGetAnnoExample(n):{},onGetFunction:n=>y(n),onAnnoSaveEvent:n=>N(n),annoSaveResponse:e.annoSaveResponse,canvasConfig:e.canvasConfig,uiConfig:a,annos:S,annoTaskId:e.annoTaskId,imageMeta:e.imageMeta,imageBlob:e.imageBlob,possibleLabels:e.possibleLabels,exampleImg:e.exampleImg,lockedAnnos:e.lockedAnnos,layoutUpdate:c,selectedTool:e.selectedTool,isJunk:e.isJunk,blocked:e.blockCanvas,defaultLabel:e.defaultLabel,preventScrolling:e.preventScrolling,isImageChanging:e.isImageChanging,isStaticPosition:e.isStaticPosition,fixedImageSize:e.fixedImageSize,samPoints:e.samPoints||[],onSamPointClick:e.onSamPointClick,samBBox:e.samBBox||null,onUpdateSamBBox:e.onUpdateSamBBox}),C(P,{onToolBarEvent:(n,t)=>L(n,t),imageMeta:e.imageMeta,layoutUpdate:c,svg:T,active:{isJunk:e.isJunk,selectedTool:e.selectedTool,fullscreen:e.fullscreenMode},enabled:e.toolbarEnabled,canvasConfig:e.canvasConfig,uiConfig:a,filter:e.filter,onImgageSearchClicked:()=>{if(e.onImgageSearchClicked)return e.onImgageSearchClicked()}})]})};export{Z as default};
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};