@searpent/react-image-annotate 2.0.5 → 2.0.8

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 (195) hide show
  1. package/Annotator/examplePhotos.js +6976 -0
  2. package/Annotator/index.js +268 -0
  3. package/Annotator/reducers/combine-reducers.js +14 -0
  4. package/Annotator/reducers/convert-expanding-line-to-polygon.js +73 -0
  5. package/{src/Annotator → Annotator}/reducers/fix-twisted.js +3 -5
  6. package/Annotator/reducers/general-reducer.js +1152 -0
  7. package/Annotator/reducers/get-active-image.js +27 -0
  8. package/Annotator/reducers/get-implied-video-regions.js +180 -0
  9. package/Annotator/reducers/history-handler.js +38 -0
  10. package/Annotator/reducers/image-reducer.js +20 -0
  11. package/Annotator/reducers/video-reducer.js +88 -0
  12. package/ClassSelectionMenu/index.js +135 -0
  13. package/Crosshairs/index.js +53 -0
  14. package/DebugSidebarBox/index.js +20 -0
  15. package/DemoSite/Editor.js +194 -0
  16. package/DemoSite/ErrorBoundaryDialog.js +64 -0
  17. package/DemoSite/index.js +40 -0
  18. package/{src/Editor → Editor}/annotation-plugin/annotation.css +0 -0
  19. package/Editor/annotation-plugin/annotation.js +613 -0
  20. package/Editor/index.js +57 -0
  21. package/{src/Editor → Editor}/tools.js +2 -3
  22. package/FullImageSegmentationAnnotator/index.js +7 -0
  23. package/GroupSelectorSidebarBox/index.js +63 -0
  24. package/HighlightBox/index.js +99 -0
  25. package/HistorySidebarBox/index.js +71 -0
  26. package/ImageCanvas/index.js +429 -0
  27. package/ImageCanvas/region-tools.js +165 -0
  28. package/{src/ImageCanvas → ImageCanvas}/styles.js +12 -8
  29. package/ImageCanvas/use-mouse.js +180 -0
  30. package/ImageCanvas/use-project-box.js +27 -0
  31. package/ImageCanvas/use-wasd-mode.js +62 -0
  32. package/ImageMask/index.js +133 -0
  33. package/ImageMask/load-image.js +25 -0
  34. package/ImageSelectorSidebarBox/index.js +60 -0
  35. package/KeyframeTimeline/get-time-string.js +27 -0
  36. package/KeyframeTimeline/index.js +233 -0
  37. package/KeyframesSelectorSidebarBox/index.js +93 -0
  38. package/LandingPage/index.js +159 -0
  39. package/MainLayout/icon-dictionary.js +104 -0
  40. package/MainLayout/index.js +469 -0
  41. package/{src/MainLayout → MainLayout}/styles.js +6 -7
  42. package/MainLayout/types.js +0 -0
  43. package/MainLayout/use-implied-video-regions.js +13 -0
  44. package/MetadataEditorSidebarBox/index.js +126 -0
  45. package/PageSelector/index.js +69 -0
  46. package/{src/PageSelector → PageSelector}/page-selector.css +18 -0
  47. package/PointDistances/index.js +73 -0
  48. package/PreventScrollToParents/index.js +51 -0
  49. package/RegionLabel/index.js +205 -0
  50. package/{src/RegionLabel → RegionLabel}/styles.js +12 -15
  51. package/RegionSelectAndTransformBoxes/index.js +167 -0
  52. package/RegionSelectorSidebarBox/index.js +248 -0
  53. package/{src/RegionSelectorSidebarBox → RegionSelectorSidebarBox}/styles.js +13 -14
  54. package/RegionShapes/index.js +294 -0
  55. package/RegionTags/index.js +142 -0
  56. package/SettingsDialog/index.js +52 -0
  57. package/SettingsProvider/index.js +58 -0
  58. package/Shortcuts/ShortcutField.js +46 -0
  59. package/Shortcuts/index.js +133 -0
  60. package/ShortcutsManager/index.js +155 -0
  61. package/Sidebar/index.js +69 -0
  62. package/SidebarBoxContainer/index.js +93 -0
  63. package/SmallToolButton/index.js +42 -0
  64. package/TagsSidebarBox/index.js +105 -0
  65. package/TaskDescriptionSidebarBox/index.js +58 -0
  66. package/Theme/index.js +30 -0
  67. package/VideoOrImageCanvasBackground/index.js +151 -0
  68. package/colors.js +14 -0
  69. package/hooks/use-colors.js +101 -0
  70. package/hooks/use-event-callback.js +10 -0
  71. package/hooks/use-exclude-pattern.js +24 -0
  72. package/hooks/use-load-image.js +26 -0
  73. package/hooks/use-window-size.js +46 -0
  74. package/{src/hooks → hooks}/xpattern.js +1 -1
  75. package/index.js +3 -0
  76. package/lib.js +3 -0
  77. package/package.json +1 -1
  78. package/stories.js +5 -0
  79. package/{src/utils → utils}/filter-only-unique.js +1 -1
  80. package/utils/get-from-local-storage.js +7 -0
  81. package/utils/get-hotkey-help-text.js +9 -0
  82. package/utils/get-landmarks-with-transform.js +40 -0
  83. package/utils/photosToImages.js +53 -0
  84. package/utils/regions-to-blocks.js +16 -0
  85. package/utils/set-in-local-storage.js +3 -0
  86. package/.babelrc +0 -6
  87. package/.env +0 -1
  88. package/.flowconfig +0 -2
  89. package/.github/workflows/release-on-master.yml +0 -32
  90. package/.github/workflows/test.yml +0 -16
  91. package/.prettierrc +0 -3
  92. package/.releaserc.js +0 -18
  93. package/.storybook/addons.js +0 -2
  94. package/.storybook/config.js +0 -16
  95. package/LICENSE +0 -21
  96. package/public/favicon.ico +0 -0
  97. package/public/index.html +0 -38
  98. package/src/Annotator/bike-pic.png +0 -0
  99. package/src/Annotator/bike-pic2.png +0 -0
  100. package/src/Annotator/dab-keyframes.story.json +0 -1
  101. package/src/Annotator/examplePhotos.js +0 -7601
  102. package/src/Annotator/index.js +0 -291
  103. package/src/Annotator/index.story.js +0 -807
  104. package/src/Annotator/poses.story.js +0 -150
  105. package/src/Annotator/reducers/combine-reducers.js +0 -7
  106. package/src/Annotator/reducers/convert-expanding-line-to-polygon.js +0 -53
  107. package/src/Annotator/reducers/general-reducer.js +0 -996
  108. package/src/Annotator/reducers/get-active-image.js +0 -21
  109. package/src/Annotator/reducers/get-implied-video-regions.js +0 -115
  110. package/src/Annotator/reducers/history-handler.js +0 -60
  111. package/src/Annotator/reducers/image-reducer.js +0 -23
  112. package/src/Annotator/reducers/video-reducer.js +0 -85
  113. package/src/Annotator/video.story.js +0 -51
  114. package/src/ClassSelectionMenu/index.js +0 -108
  115. package/src/Crosshairs/index.js +0 -64
  116. package/src/DebugSidebarBox/index.js +0 -36
  117. package/src/DemoSite/Editor.js +0 -235
  118. package/src/DemoSite/ErrorBoundaryDialog.js +0 -34
  119. package/src/DemoSite/index.js +0 -41
  120. package/src/DemoSite/index.story.js +0 -10
  121. package/src/DemoSite/simple-segmentation-example.json +0 -572
  122. package/src/Editor/annotation-plugin/annotation.js +0 -515
  123. package/src/Editor/index.js +0 -24
  124. package/src/FullImageSegmentationAnnotator/hard1.story.jpg +0 -0
  125. package/src/FullImageSegmentationAnnotator/hard2.story.jpg +0 -0
  126. package/src/FullImageSegmentationAnnotator/hard3.story.jpg +0 -0
  127. package/src/FullImageSegmentationAnnotator/index.js +0 -7
  128. package/src/FullImageSegmentationAnnotator/index.story.js +0 -177
  129. package/src/FullImageSegmentationAnnotator/orange.story.png +0 -0
  130. package/src/GroupSelectorSidebarBox/index.js +0 -48
  131. package/src/HighlightBox/index.js +0 -143
  132. package/src/HistorySidebarBox/index.js +0 -78
  133. package/src/ImageCanvas/dancing-man.story.jpg +0 -0
  134. package/src/ImageCanvas/index.js +0 -494
  135. package/src/ImageCanvas/index.story.js +0 -314
  136. package/src/ImageCanvas/mouse_mask.story.png +0 -0
  137. package/src/ImageCanvas/region-tools.js +0 -171
  138. package/src/ImageCanvas/seves_desk.story.jpg +0 -0
  139. package/src/ImageCanvas/use-mouse.js +0 -168
  140. package/src/ImageCanvas/use-project-box.js +0 -23
  141. package/src/ImageCanvas/use-wasd-mode.js +0 -50
  142. package/src/ImageMask/index.js +0 -127
  143. package/src/ImageMask/load-image.js +0 -32
  144. package/src/ImageSelectorSidebarBox/index.js +0 -54
  145. package/src/KeyframeTimeline/get-time-string.js +0 -25
  146. package/src/KeyframeTimeline/index.js +0 -223
  147. package/src/KeyframesSelectorSidebarBox/index.js +0 -93
  148. package/src/LandingPage/content.md +0 -57
  149. package/src/LandingPage/github-markdown.css +0 -964
  150. package/src/LandingPage/index.js +0 -147
  151. package/src/MainLayout/icon-dictionary.js +0 -79
  152. package/src/MainLayout/index.js +0 -510
  153. package/src/MainLayout/index.story.js +0 -240
  154. package/src/MainLayout/types.js +0 -164
  155. package/src/MainLayout/use-implied-video-regions.js +0 -17
  156. package/src/MetadataEditorSidebarBox/index.js +0 -98
  157. package/src/PageSelector/index.js +0 -76
  158. package/src/PointDistances/index.js +0 -90
  159. package/src/PreventScrollToParents/index.js +0 -48
  160. package/src/PreventScrollToParents/index.story.js +0 -23
  161. package/src/RegionLabel/index.js +0 -222
  162. package/src/RegionSelectAndTransformBoxes/index.js +0 -234
  163. package/src/RegionSelectorSidebarBox/index.js +0 -216
  164. package/src/RegionShapes/index.js +0 -254
  165. package/src/RegionTags/index.js +0 -134
  166. package/src/SettingsDialog/index.js +0 -58
  167. package/src/SettingsProvider/index.js +0 -48
  168. package/src/Shortcuts/ShortcutField.js +0 -44
  169. package/src/Shortcuts/index.js +0 -129
  170. package/src/ShortcutsManager/index.js +0 -162
  171. package/src/Sidebar/index.js +0 -117
  172. package/src/SidebarBoxContainer/index.js +0 -93
  173. package/src/SmallToolButton/index.js +0 -57
  174. package/src/TagsSidebarBox/index.js +0 -93
  175. package/src/TaskDescriptionSidebarBox/index.js +0 -43
  176. package/src/Theme/index.js +0 -36
  177. package/src/VideoOrImageCanvasBackground/index.js +0 -170
  178. package/src/colors.js +0 -32
  179. package/src/hooks/use-colors.js +0 -74
  180. package/src/hooks/use-event-callback.js +0 -11
  181. package/src/hooks/use-exclude-pattern.js +0 -27
  182. package/src/hooks/use-load-image.js +0 -21
  183. package/src/hooks/use-window-size.js +0 -46
  184. package/src/hooks/xpattern.png +0 -0
  185. package/src/index.js +0 -18
  186. package/src/lib.js +0 -7
  187. package/src/screenshot.png +0 -0
  188. package/src/site.css +0 -5
  189. package/src/stories.js +0 -2
  190. package/src/utils/get-from-local-storage.js +0 -7
  191. package/src/utils/get-hotkey-help-text.js +0 -11
  192. package/src/utils/get-landmarks-with-transform.js +0 -23
  193. package/src/utils/photosToImages.js +0 -40
  194. package/src/utils/regions-to-blocks.js +0 -14
  195. package/src/utils/set-in-local-storage.js +0 -6
@@ -1,291 +0,0 @@
1
- // @flow
2
-
3
- import type {
4
- Action,
5
- Image,
6
- MainLayoutState,
7
- Mode,
8
- ToolEnum,
9
- Metadata
10
- } from "../MainLayout/types"
11
- import React, { useEffect, useReducer } from "react"
12
- import makeImmutable, { without } from "seamless-immutable"
13
-
14
- import type { KeypointsDefinition } from "../ImageCanvas/region-tools"
15
- import MainLayout from "../MainLayout"
16
- import type { Node } from "react"
17
- import SettingsProvider from "../SettingsProvider"
18
- import combineReducers from "./reducers/combine-reducers.js"
19
- import generalReducer from "./reducers/general-reducer.js"
20
- import getFromLocalStorage from "../utils/get-from-local-storage"
21
- import historyHandler from "./reducers/history-handler.js"
22
- import imageReducer from "./reducers/image-reducer.js"
23
- import useEventCallback from "use-event-callback"
24
- import videoReducer from "./reducers/video-reducer.js"
25
-
26
- type Props = {
27
- taskDescription?: string,
28
- allowedArea?: { x: number, y: number, w: number, h: number },
29
- regionTagList?: Array<string>,
30
- regionClsList?: Array<string>,
31
- imageTagList?: Array<string>,
32
- imageClsList?: Array<string>,
33
- enabledTools?: Array<string>,
34
- selectedTool?: String,
35
- showTags?: boolean,
36
- selectedImage?: string | number,
37
- images?: Array<Image>,
38
- showPointDistances?: boolean,
39
- pointDistancePrecision?: number,
40
- RegionEditLabel?: Node,
41
- onExit: (MainLayoutState) => any,
42
- videoTime?: number,
43
- videoSrc?: string,
44
- keyframes?: Object,
45
- videoName?: string,
46
- keypointDefinitions: KeypointsDefinition,
47
- fullImageSegmentationMode?: boolean,
48
- autoSegmentationOptions?:
49
- | {| type: "simple" |}
50
- | {| type: "autoseg", maxClusters ?: number, slicWeightFactor ?: number |},
51
- hideHeader ?: boolean,
52
- hideHeaderText ?: boolean,
53
- hideNext ?: boolean,
54
- hidePrev ?: boolean,
55
- hideClone ?: boolean,
56
- hideSettings ?: boolean,
57
- hideFullScreen ?: boolean,
58
- hideSave ?: boolean,
59
- onImagesChange ?: (any) => any,
60
- groups ?: Array < any >,
61
- onGroupSelect ?: (any) => any,
62
- hideHistory ?: boolean,
63
- hideNotEditingLabel ?: boolean,
64
- showEditor ?: boolean,
65
- showPageSelector ?: boolean,
66
- clsColors ?: Object,
67
- groupColors ?: Object,
68
- onRecalc ?: (any) => any,
69
- onSave ?: (any) => any,
70
- allowedGroups ?: Object,
71
- metadata ?: Array < Metadata >,
72
- }
73
-
74
- export const Annotator = ({
75
- images,
76
- allowedArea,
77
- selectedImage = images && images.length > 0 ? 0 : undefined,
78
- showPointDistances,
79
- pointDistancePrecision,
80
- showTags = getFromLocalStorage("showTags", true),
81
- enabledTools = [
82
- "select",
83
- "create-point",
84
- "create-box",
85
- "create-polygon",
86
- "create-line",
87
- "create-expanding-line",
88
- "show-mask",
89
- ],
90
- selectedTool = "select",
91
- regionTagList = [],
92
- regionClsList = [],
93
- imageTagList = [],
94
- imageClsList = [],
95
- keyframes = {},
96
- taskDescription = "",
97
- fullImageSegmentationMode = false,
98
- RegionEditLabel,
99
- videoSrc,
100
- videoTime = 0,
101
- videoName,
102
- onExit,
103
- onNextImage,
104
- onPrevImage,
105
- keypointDefinitions,
106
- autoSegmentationOptions = { type: "autoseg" },
107
- hideHeader,
108
- hideHeaderText,
109
- hideNext,
110
- hidePrev,
111
- hideClone,
112
- hideSettings,
113
- hideFullScreen,
114
- hideSave,
115
- allowComments,
116
- onImagesChange,
117
- groups,
118
- onGroupSelect,
119
- hideHistory,
120
- hideNotEditingLabel,
121
- showEditor,
122
- showPageSelector,
123
- clsColors,
124
- groupColors,
125
- onRecalc,
126
- onSave,
127
- allowedGroups,
128
- metadata
129
- }: Props) => {
130
- if (typeof selectedImage === "string") {
131
- selectedImage = (images || []).findIndex((img) => img.src === selectedImage)
132
- if (selectedImage === -1) selectedImage = undefined
133
- }
134
- const annotationType = images ? "image" : "video"
135
- const [state, dispatchToReducer] = useReducer(
136
- historyHandler(
137
- combineReducers(
138
- annotationType === "image" ? imageReducer : videoReducer,
139
- generalReducer
140
- )
141
- ),
142
- makeImmutable({
143
- annotationType,
144
- showTags,
145
- allowedArea,
146
- showPointDistances,
147
- pointDistancePrecision,
148
- selectedTool,
149
- fullImageSegmentationMode: fullImageSegmentationMode,
150
- autoSegmentationOptions,
151
- mode: null,
152
- taskDescription,
153
- showMask: true,
154
- labelImages: imageClsList.length > 0 || imageTagList.length > 0,
155
- regionClsList,
156
- regionTagList,
157
- imageClsList,
158
- imageTagList,
159
- currentVideoTime: videoTime,
160
- enabledTools,
161
- history: [],
162
- videoName,
163
- keypointDefinitions,
164
- allowComments,
165
- ...(annotationType === "image"
166
- ? {
167
- selectedImage,
168
- images,
169
- selectedImageFrameTime:
170
- images && images.length > 0 ? images[0].frameTime : undefined,
171
- }
172
- : {
173
- videoSrc,
174
- keyframes,
175
- }),
176
- imagesUpdatedAt: null,
177
- imagesSavedAt: null,
178
- metadata,
179
- })
180
- )
181
-
182
- const dispatch = useEventCallback((action: Action) => {
183
- if (action.type === "HEADER_BUTTON_CLICKED") {
184
- if (["Exit", "Done", "Save", "Complete"].includes(action.buttonName)) {
185
- return onExit(without(state, "history"))
186
- } else if (action.buttonName === "Next" && onNextImage) {
187
- return onNextImage(without(state, "history"))
188
- } else if (action.buttonName === "Prev" && onPrevImage) {
189
- return onPrevImage(without(state, "history"))
190
- }
191
- }
192
- dispatchToReducer(action)
193
- })
194
-
195
- const onRegionClassAdded = useEventCallback((cls) => {
196
- dispatchToReducer({
197
- type: "ON_CLS_ADDED",
198
- cls: cls,
199
- })
200
- })
201
-
202
- const handleSaveClick = async (e) => {
203
- e.preventDefault()
204
- if (onSave) {
205
- onSave()
206
- dispatchToReducer({
207
- type: "IMAGES_SAVED",
208
- savedAt: new Date()
209
- })
210
- }
211
- }
212
-
213
- const handleRecalcClick = (e) => {
214
- e.preventDefault()
215
- if (onRecalc) {
216
- onRecalc()
217
- }
218
- }
219
-
220
- const handleMetadataChange = ({ name, value, imageIndex }) => {
221
- dispatchToReducer({
222
- type: "UPDATE_METADATA",
223
- name,
224
- value,
225
- imageIndex
226
- })
227
- }
228
-
229
- // trigger this on every BBox manipulation (there is currently no way to detect adding of new box!)
230
- useEffect(() => {
231
- if (!state.lastAction || !["BEGIN_BOX_TRANSFORM", "CHANGE_REGION", "DELETE_REGION"].includes(state.lastAction.type)) { return }
232
- if (onImagesChange) {
233
- onImagesChange(state.images)
234
- }
235
- dispatchToReducer({
236
- type: "IMAGES_UPDATED",
237
- updatedAt: new Date()
238
- })
239
- }, [onImagesChange, state.images, state.lastAction])
240
-
241
- useEffect(() => {
242
- if (selectedImage === undefined) return
243
- dispatchToReducer({
244
- type: "SELECT_IMAGE",
245
- imageIndex: selectedImage,
246
- image: state.images[selectedImage],
247
- })
248
- // eslint-disable-next-line react-hooks/exhaustive-deps
249
- }, [onImagesChange, selectedImage])
250
-
251
- if (!images && !videoSrc)
252
- return 'Missing required prop "images" or "videoSrc"'
253
-
254
-
255
- const [recalcActive, saveActive] = state.imagesSavedAt < state.imagesUpdatedAt ? [true, true] : [false, false];
256
-
257
- return (
258
- <SettingsProvider clsColors={clsColors} groupColors={groupColors}>
259
- <MainLayout
260
- RegionEditLabel={RegionEditLabel}
261
- alwaysShowNextButton={Boolean(onNextImage)}
262
- alwaysShowPrevButton={Boolean(onPrevImage)}
263
- state={state}
264
- dispatch={dispatch}
265
- onRegionClassAdded={onRegionClassAdded}
266
- hideHeader={hideHeader}
267
- hideHeaderText={hideHeaderText}
268
- hideNext={hideNext}
269
- hidePrev={hidePrev}
270
- hideClone={hideClone}
271
- hideSettings={hideSettings}
272
- hideFullScreen={hideFullScreen}
273
- hideSave={hideSave}
274
- groups={groups}
275
- onGroupSelect={onGroupSelect}
276
- hideHistory={hideHistory}
277
- hideNotEditingLabel={hideNotEditingLabel}
278
- showEditor={showEditor}
279
- showPageSelector={showPageSelector}
280
- onRecalc={handleRecalcClick}
281
- onSave={handleSaveClick}
282
- saveActive={recalcActive}
283
- recalcActive={saveActive}
284
- allowedGroups={allowedGroups}
285
- onMetadataChange={handleMetadataChange}
286
- />
287
- </SettingsProvider>
288
- )
289
- }
290
-
291
- export default Annotator