@searpent/react-image-annotate 2.0.3 → 2.0.4

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 (187) hide show
  1. package/.babelrc +6 -0
  2. package/.env +1 -0
  3. package/.flowconfig +2 -0
  4. package/.github/workflows/release-on-master.yml +32 -0
  5. package/.github/workflows/test.yml +16 -0
  6. package/.prettierrc +3 -0
  7. package/.releaserc.js +18 -0
  8. package/.storybook/addons.js +2 -0
  9. package/.storybook/config.js +16 -0
  10. package/LICENSE +21 -0
  11. package/package.json +4 -1
  12. package/public/favicon.ico +0 -0
  13. package/public/index.html +38 -0
  14. package/src/Annotator/bike-pic.png +0 -0
  15. package/src/Annotator/bike-pic2.png +0 -0
  16. package/src/Annotator/dab-keyframes.story.json +1 -0
  17. package/src/Annotator/examplePhotos.js +7601 -0
  18. package/src/Annotator/index.js +291 -0
  19. package/src/Annotator/index.story.js +807 -0
  20. package/src/Annotator/poses.story.js +150 -0
  21. package/src/Annotator/reducers/combine-reducers.js +7 -0
  22. package/src/Annotator/reducers/convert-expanding-line-to-polygon.js +53 -0
  23. package/{Annotator → src/Annotator}/reducers/fix-twisted.js +5 -3
  24. package/src/Annotator/reducers/general-reducer.js +996 -0
  25. package/src/Annotator/reducers/get-active-image.js +21 -0
  26. package/src/Annotator/reducers/get-implied-video-regions.js +115 -0
  27. package/src/Annotator/reducers/history-handler.js +60 -0
  28. package/src/Annotator/reducers/image-reducer.js +23 -0
  29. package/src/Annotator/reducers/video-reducer.js +85 -0
  30. package/src/Annotator/video.story.js +51 -0
  31. package/src/ClassSelectionMenu/index.js +108 -0
  32. package/src/Crosshairs/index.js +64 -0
  33. package/src/DebugSidebarBox/index.js +36 -0
  34. package/src/DemoSite/Editor.js +235 -0
  35. package/src/DemoSite/ErrorBoundaryDialog.js +34 -0
  36. package/src/DemoSite/index.js +41 -0
  37. package/src/DemoSite/index.story.js +10 -0
  38. package/src/DemoSite/simple-segmentation-example.json +572 -0
  39. package/src/Editor/annotation-plugin/annotation.css +46 -0
  40. package/src/Editor/annotation-plugin/annotation.js +515 -0
  41. package/src/Editor/index.js +24 -0
  42. package/src/Editor/tools.js +6 -0
  43. package/src/FullImageSegmentationAnnotator/hard1.story.jpg +0 -0
  44. package/src/FullImageSegmentationAnnotator/hard2.story.jpg +0 -0
  45. package/src/FullImageSegmentationAnnotator/hard3.story.jpg +0 -0
  46. package/src/FullImageSegmentationAnnotator/index.js +7 -0
  47. package/src/FullImageSegmentationAnnotator/index.story.js +177 -0
  48. package/src/FullImageSegmentationAnnotator/orange.story.png +0 -0
  49. package/src/GroupSelectorSidebarBox/index.js +48 -0
  50. package/src/HighlightBox/index.js +143 -0
  51. package/src/HistorySidebarBox/index.js +78 -0
  52. package/src/ImageCanvas/dancing-man.story.jpg +0 -0
  53. package/src/ImageCanvas/index.js +494 -0
  54. package/src/ImageCanvas/index.story.js +314 -0
  55. package/src/ImageCanvas/mouse_mask.story.png +0 -0
  56. package/src/ImageCanvas/region-tools.js +171 -0
  57. package/src/ImageCanvas/seves_desk.story.jpg +0 -0
  58. package/{ImageCanvas → src/ImageCanvas}/styles.js +8 -12
  59. package/src/ImageCanvas/use-mouse.js +168 -0
  60. package/src/ImageCanvas/use-project-box.js +23 -0
  61. package/src/ImageCanvas/use-wasd-mode.js +50 -0
  62. package/src/ImageMask/index.js +127 -0
  63. package/src/ImageMask/load-image.js +32 -0
  64. package/src/ImageSelectorSidebarBox/index.js +54 -0
  65. package/src/KeyframeTimeline/get-time-string.js +25 -0
  66. package/src/KeyframeTimeline/index.js +223 -0
  67. package/src/KeyframesSelectorSidebarBox/index.js +93 -0
  68. package/src/LandingPage/content.md +57 -0
  69. package/src/LandingPage/github-markdown.css +964 -0
  70. package/src/LandingPage/index.js +147 -0
  71. package/src/MainLayout/icon-dictionary.js +79 -0
  72. package/src/MainLayout/index.js +510 -0
  73. package/src/MainLayout/index.story.js +240 -0
  74. package/{MainLayout → src/MainLayout}/styles.js +7 -6
  75. package/src/MainLayout/types.js +164 -0
  76. package/src/MainLayout/use-implied-video-regions.js +17 -0
  77. package/src/MetadataEditorSidebarBox/index.js +98 -0
  78. package/src/PageSelector/index.js +76 -0
  79. package/src/PageSelector/page-selector.css +69 -0
  80. package/src/PointDistances/index.js +90 -0
  81. package/src/PreventScrollToParents/index.js +48 -0
  82. package/src/PreventScrollToParents/index.story.js +23 -0
  83. package/src/RegionLabel/index.js +222 -0
  84. package/{RegionLabel → src/RegionLabel}/styles.js +15 -12
  85. package/src/RegionSelectAndTransformBoxes/index.js +234 -0
  86. package/src/RegionSelectorSidebarBox/index.js +216 -0
  87. package/{RegionSelectorSidebarBox → src/RegionSelectorSidebarBox}/styles.js +14 -13
  88. package/src/RegionShapes/index.js +254 -0
  89. package/src/RegionTags/index.js +134 -0
  90. package/src/SettingsDialog/index.js +58 -0
  91. package/src/SettingsProvider/index.js +48 -0
  92. package/src/Shortcuts/ShortcutField.js +44 -0
  93. package/src/Shortcuts/index.js +129 -0
  94. package/src/ShortcutsManager/index.js +162 -0
  95. package/src/Sidebar/index.js +117 -0
  96. package/src/SidebarBoxContainer/index.js +93 -0
  97. package/src/SmallToolButton/index.js +57 -0
  98. package/src/TagsSidebarBox/index.js +93 -0
  99. package/src/TaskDescriptionSidebarBox/index.js +43 -0
  100. package/src/Theme/index.js +36 -0
  101. package/src/VideoOrImageCanvasBackground/index.js +170 -0
  102. package/src/colors.js +32 -0
  103. package/src/hooks/use-colors.js +74 -0
  104. package/src/hooks/use-event-callback.js +11 -0
  105. package/src/hooks/use-exclude-pattern.js +27 -0
  106. package/src/hooks/use-load-image.js +21 -0
  107. package/src/hooks/use-window-size.js +46 -0
  108. package/{hooks → src/hooks}/xpattern.js +1 -1
  109. package/src/hooks/xpattern.png +0 -0
  110. package/src/index.js +18 -0
  111. package/src/lib.js +7 -0
  112. package/src/screenshot.png +0 -0
  113. package/src/site.css +5 -0
  114. package/src/stories.js +2 -0
  115. package/src/utils/filter-only-unique.js +5 -0
  116. package/src/utils/get-from-local-storage.js +7 -0
  117. package/src/utils/get-hotkey-help-text.js +11 -0
  118. package/src/utils/get-landmarks-with-transform.js +23 -0
  119. package/src/utils/photosToImages.js +40 -0
  120. package/src/utils/regions-to-blocks.js +14 -0
  121. package/src/utils/set-in-local-storage.js +6 -0
  122. package/Annotator/index.js +0 -169
  123. package/Annotator/reducers/combine-reducers.js +0 -14
  124. package/Annotator/reducers/convert-expanding-line-to-polygon.js +0 -73
  125. package/Annotator/reducers/general-reducer.js +0 -1058
  126. package/Annotator/reducers/get-active-image.js +0 -27
  127. package/Annotator/reducers/get-implied-video-regions.js +0 -180
  128. package/Annotator/reducers/history-handler.js +0 -38
  129. package/Annotator/reducers/image-reducer.js +0 -20
  130. package/Annotator/reducers/video-reducer.js +0 -88
  131. package/ClassSelectionMenu/index.js +0 -135
  132. package/Crosshairs/index.js +0 -53
  133. package/DebugSidebarBox/index.js +0 -20
  134. package/DemoSite/Editor.js +0 -194
  135. package/DemoSite/ErrorBoundaryDialog.js +0 -64
  136. package/DemoSite/index.js +0 -40
  137. package/FullImageSegmentationAnnotator/index.js +0 -7
  138. package/GroupSelectorSidebarBox/index.js +0 -63
  139. package/HighlightBox/index.js +0 -99
  140. package/HistorySidebarBox/index.js +0 -71
  141. package/ImageCanvas/index.js +0 -424
  142. package/ImageCanvas/region-tools.js +0 -165
  143. package/ImageCanvas/use-mouse.js +0 -180
  144. package/ImageCanvas/use-project-box.js +0 -27
  145. package/ImageCanvas/use-wasd-mode.js +0 -62
  146. package/ImageMask/index.js +0 -133
  147. package/ImageMask/load-image.js +0 -25
  148. package/ImageSelectorSidebarBox/index.js +0 -60
  149. package/KeyframeTimeline/get-time-string.js +0 -27
  150. package/KeyframeTimeline/index.js +0 -233
  151. package/KeyframesSelectorSidebarBox/index.js +0 -93
  152. package/LandingPage/index.js +0 -159
  153. package/MainLayout/icon-dictionary.js +0 -104
  154. package/MainLayout/index.js +0 -366
  155. package/MainLayout/types.js +0 -0
  156. package/MainLayout/use-implied-video-regions.js +0 -13
  157. package/PointDistances/index.js +0 -73
  158. package/PreventScrollToParents/index.js +0 -51
  159. package/RegionLabel/index.js +0 -191
  160. package/RegionSelectAndTransformBoxes/index.js +0 -167
  161. package/RegionSelectorSidebarBox/index.js +0 -248
  162. package/RegionShapes/index.js +0 -274
  163. package/RegionTags/index.js +0 -138
  164. package/SettingsDialog/index.js +0 -52
  165. package/SettingsProvider/index.js +0 -53
  166. package/Shortcuts/ShortcutField.js +0 -46
  167. package/Shortcuts/index.js +0 -133
  168. package/ShortcutsManager/index.js +0 -155
  169. package/Sidebar/index.js +0 -69
  170. package/SidebarBoxContainer/index.js +0 -93
  171. package/SmallToolButton/index.js +0 -42
  172. package/TagsSidebarBox/index.js +0 -105
  173. package/TaskDescriptionSidebarBox/index.js +0 -58
  174. package/Theme/index.js +0 -30
  175. package/VideoOrImageCanvasBackground/index.js +0 -151
  176. package/colors.js +0 -14
  177. package/hooks/use-event-callback.js +0 -10
  178. package/hooks/use-exclude-pattern.js +0 -24
  179. package/hooks/use-load-image.js +0 -26
  180. package/hooks/use-window-size.js +0 -46
  181. package/index.js +0 -3
  182. package/lib.js +0 -3
  183. package/stories.js +0 -5
  184. package/utils/get-from-local-storage.js +0 -7
  185. package/utils/get-hotkey-help-text.js +0 -9
  186. package/utils/get-landmarks-with-transform.js +0 -40
  187. package/utils/set-in-local-storage.js +0 -3
@@ -0,0 +1,807 @@
1
+ // @flow
2
+
3
+ import React, { useState } from "react"
4
+
5
+ import { storiesOf } from "@storybook/react"
6
+ import { action as actionAddon } from "@storybook/addon-actions"
7
+ import exampleImage from "../ImageCanvas/seves_desk.story.jpg"
8
+ import bikeImg1 from "./bike-pic.png"
9
+ import bikeImg2 from "./bike-pic2.png"
10
+ import { HotKeys } from "react-hotkeys"
11
+ import { defaultKeyMap } from "../ShortcutsManager"
12
+
13
+ import Annotator from "./"
14
+
15
+ import { testRegions, testRegionsBoxes } from "../ImageCanvas/index.story"
16
+ import photosToImages from "../utils/photosToImages"
17
+ import examplePhotos from "./examplePhotos"
18
+
19
+ const middlewares = [
20
+ (store) => (next) => (action) => {
21
+ actionAddon(action.type)(action)
22
+ return next(action)
23
+ },
24
+ ]
25
+
26
+ storiesOf("Annotator", module)
27
+ .add("Basic", () => (
28
+ <Annotator
29
+ onExit={actionAddon("onExit")}
30
+ middlewares={middlewares}
31
+ labelImages
32
+ regionClsList={["Alpha", "Beta", "Charlie", "Delta"]}
33
+ regionTagList={["tag1", "tag2", "tag3"]}
34
+ imageClsList={["Alpha", "Beta", "Charlie", "Delta"]}
35
+ imageTagList={["tag1", "tag2", "tag3"]}
36
+ images={[
37
+ {
38
+ src: exampleImage,
39
+ name: "Seve's Desk",
40
+ regions: testRegions,
41
+ },
42
+ {
43
+ src: "https://loremflickr.com/100/100/cars?lock=1",
44
+ name: "Frame 0036",
45
+ },
46
+ {
47
+ src: "https://loremflickr.com/100/100/cars?lock=2",
48
+ name: "Frame 0037",
49
+ },
50
+ {
51
+ src: "https://loremflickr.com/100/100/cars?lock=3",
52
+ name: "Frame 0038",
53
+ },
54
+ ]}
55
+ />
56
+ ))
57
+ .add("Basic with onImagesChange", () => (
58
+ <Annotator
59
+ middlewares={middlewares}
60
+ labelImages
61
+ regionClsList={[
62
+ "author",
63
+ "appendix",
64
+ "photo_author",
65
+ "photo_caption",
66
+ "advertisement",
67
+ "other_graphics",
68
+ "unknown",
69
+ "title",
70
+ "about_author",
71
+ "image",
72
+ "subtitle",
73
+ "interview",
74
+ "table",
75
+ "text",
76
+ ]}
77
+ allowedGroups={[
78
+ { value: '0', label: '0' },
79
+ { value: '1', label: '1' },
80
+ { value: '2', label: '2' },
81
+ { value: '3', label: '3' },
82
+ { value: '4', label: '4' },
83
+ { value: '5', label: '5' },
84
+ { value: '6', label: '6' },
85
+ { value: '7', label: '7' },
86
+ { value: '8', label: '8' },
87
+ { value: '9', label: '9' },
88
+ ]}
89
+ onImagesChange={(images) => console.log("[images changed to]:", images)}
90
+ images={photosToImages([...examplePhotos, ...examplePhotos, ...examplePhotos])}
91
+ clsColors={{
92
+ title: "#f70202",
93
+ subtitle: "#ffb405",
94
+ text: "#14deef",
95
+ author: "#f8d51e",
96
+ appendix: "#bfede2",
97
+ photo_author: "#9a17bb",
98
+ photo_caption: "#ff84f6",
99
+ advertisement: "#ffb201",
100
+ other_graphics: "#ff5400",
101
+ unknown: "#bfede2",
102
+ about_author: "#9a17bb",
103
+ image: "#14deef",
104
+ interview: "#23b20f",
105
+ table: "#02b4ba",
106
+ }}
107
+ groupColors={{
108
+ "0": "#e3a7c0",
109
+ "1": "#c2d5a8",
110
+ "2": "#f2e9cc",
111
+ "3": "#bad5f0",
112
+ "4": "#f0d5ba",
113
+ "5": "#d6eff5",
114
+ "6": "#f8d7e8",
115
+ "7": "#a5d5d5",
116
+ "8": "#b0abcb",
117
+ "9": "#fae4cc",
118
+ }}
119
+ onGroupSelect={(groupId) => console.log('selected groupid:', groupId)}
120
+ hideHeader={true}
121
+ hideHistory={true}
122
+ hideNotEditingLabel={true}
123
+ showEditor={true}
124
+ showPageSelector={true}
125
+ metadata={[{
126
+ key: "name", value: "Dennik Aha"
127
+ }, {
128
+ key: "released", value: "20/1/2022"
129
+ }]}
130
+ onSave={() => console.log("[onSave] triggered]")}
131
+ onRecalc={() => console.log("[onRecalc] triggered]")}
132
+ onExit={(s) => console.log('[onExit] triggered:', s)}
133
+ />
134
+ ))
135
+ .add("Basic - Allow Comments", () => (
136
+ <Annotator
137
+ onExit={actionAddon("onExit")}
138
+ middlewares={middlewares}
139
+ labelImages
140
+ regionClsList={["Alpha", "Beta", "Charlie", "Delta"]}
141
+ regionTagList={["tag1", "tag2", "tag3"]}
142
+ imageClsList={["Alpha", "Beta", "Charlie", "Delta"]}
143
+ imageTagList={["tag1", "tag2", "tag3"]}
144
+ images={[
145
+ {
146
+ src: exampleImage,
147
+ name: "Seve's Desk",
148
+ regions: testRegions,
149
+ },
150
+ {
151
+ src: "https://loremflickr.com/100/100/cars?lock=1",
152
+ name: "Frame 0036",
153
+ },
154
+ {
155
+ src: "https://loremflickr.com/100/100/cars?lock=2",
156
+ name: "Frame 0037",
157
+ },
158
+ {
159
+ src: "https://loremflickr.com/100/100/cars?lock=3",
160
+ name: "Frame 0038",
161
+ },
162
+ ]}
163
+ allowComments
164
+ />
165
+ ))
166
+ .add("Fixed Size Container", () => (
167
+ <div style={{ width: 500, height: 500 }}>
168
+ <Annotator
169
+ onExit={actionAddon("onExit")}
170
+ middlewares={[
171
+ (store) => (next) => (action) => {
172
+ actionAddon(action.type)(action)
173
+ return next(action)
174
+ },
175
+ ]}
176
+ labelImages
177
+ regionClsList={["Alpha", "Beta", "Charlie", "Delta"]}
178
+ regionTagList={["tag1", "tag2", "tag3"]}
179
+ imageClsList={["Alpha", "Beta", "Charlie", "Delta"]}
180
+ imageTagList={["tag1", "tag2", "tag3"]}
181
+ images={[
182
+ {
183
+ src: exampleImage,
184
+ name: "Seve's Desk",
185
+ regions: testRegions,
186
+ },
187
+ {
188
+ src: "https://loremflickr.com/100/100/cars?lock=1",
189
+ name: "Frame 0036",
190
+ },
191
+ {
192
+ src: "https://loremflickr.com/100/100/cars?lock=2",
193
+ name: "Frame 0037",
194
+ },
195
+ {
196
+ src: "https://loremflickr.com/100/100/cars?lock=3",
197
+ name: "Frame 0038",
198
+ },
199
+ ]}
200
+ />
201
+ </div>
202
+ ))
203
+ .add("Shrunk Annotator (Test Fullscreen)", () => (
204
+ <div style={{ padding: 100 }}>
205
+ <Annotator
206
+ onExit={actionAddon("onExit")}
207
+ regionClsList={["Alpha", "Beta", "Charlie", "Delta"]}
208
+ regionTagList={["tag1", "tag2", "tag3"]}
209
+ middlewares={[
210
+ (store) => (next) => (action) => {
211
+ actionAddon(action.type)(action)
212
+ return next(action)
213
+ },
214
+ ]}
215
+ images={[
216
+ {
217
+ src: exampleImage,
218
+ name: "Seve's Desk",
219
+ regions: testRegions,
220
+ },
221
+ ]}
222
+ />
223
+ </div>
224
+ ))
225
+ .add("Annotator w/o No Region Labels or Image Labels", () => (
226
+ <Annotator
227
+ onExit={actionAddon("onExit")}
228
+ middlewares={middlewares}
229
+ images={[
230
+ {
231
+ src: exampleImage,
232
+ name: "Seve's Desk",
233
+ regions: testRegions,
234
+ },
235
+ ]}
236
+ />
237
+ ))
238
+ .add("Annotator with no enabled tools", () => (
239
+ <Annotator
240
+ onExit={actionAddon("onExit")}
241
+ enabledTools={[]}
242
+ showTags={false}
243
+ middlewares={middlewares}
244
+ images={[
245
+ {
246
+ src: exampleImage,
247
+ name: "Seve's Desk",
248
+ regions: testRegions,
249
+ },
250
+ ]}
251
+ />
252
+ ))
253
+ .add("Bounding Box Annotator with output to console.log", () => (
254
+ <Annotator
255
+ onExit={(out) => {
256
+ window.lastOutput = out
257
+ console.log(out)
258
+ }}
259
+ taskDescription={`## Annotate Hands\nDraw a bounding box around each hand.`}
260
+ enabledTools={["select", "create-box"]}
261
+ regionClsList={["Hand", "Face"]}
262
+ regionTagList={["Open Pinch", "Closed Pinch", "In Frame"]}
263
+ showTags={false}
264
+ images={[
265
+ {
266
+ src: "https://s3.amazonaws.com/jobstorage.workaround.online/Atheer/video-frames/VID_20190111_161054.mp4_frame017.png",
267
+ name: "Bounding Box Test",
268
+ regions: [],
269
+ },
270
+ {
271
+ src: "https://s3.amazonaws.com/jobstorage.workaround.online/Atheer/video-frames/VID_20190111_161054.mp4_frame001.png",
272
+ name: "Bounding Box Test",
273
+ regions: [],
274
+ },
275
+ ]}
276
+ />
277
+ ))
278
+ .add("Bounding Box Annotator with allowed area", () => (
279
+ <Annotator
280
+ taskDescription={`## Annotate Hands\nDraw a bounding box around each hand.`}
281
+ enabledTools={["select", "create-box"]}
282
+ regionClsList={["Hand", "Face"]}
283
+ regionTagList={["Open Pinch", "Closed Pinch", "In Frame"]}
284
+ showTags={false}
285
+ allowedArea={{ x: 0, y: 0.6, w: 0.3, h: 0.3 }}
286
+ images={[
287
+ {
288
+ src: "https://s3.amazonaws.com/jobstorage.workaround.online/Atheer/video-frames/VID_20190111_161054.mp4_frame017.png",
289
+ name: "Bounding Box Test",
290
+ regions: [],
291
+ },
292
+ ]}
293
+ />
294
+ ))
295
+ .add("Car Annotation", () => (
296
+ <Annotator
297
+ onExit={actionAddon("onExit")}
298
+ middlewares={middlewares}
299
+ labelImages
300
+ regionClsList={["Car", "Sign", "Construction Barrier"]}
301
+ regionTagList={["Moving", "Stopped", "Obstacle"]}
302
+ imageClsList={["On Street", "Sidewalk", "Other"]}
303
+ // imageTagList={["tag1", "tag2", "tag3"]}
304
+ images={[
305
+ {
306
+ src: bikeImg1,
307
+ name: "Frame 03021",
308
+ regions: [
309
+ {
310
+ cls: "Car",
311
+ color: "hsl(82,100%,50%)",
312
+ h: 0.45921666772960146,
313
+ w: 0.3932156342484836,
314
+ x: 0.6302148980776354,
315
+ y: 0.5559504689545722,
316
+ type: "box",
317
+ id: "8776160642957009",
318
+ tags: ["Stopped"],
319
+ highlighted: false,
320
+ editingLabels: false,
321
+ },
322
+ {
323
+ cls: "Car",
324
+ color: "hsl(264,100%,50%)",
325
+ type: "box",
326
+ id: "885140028730734",
327
+ tags: ["Moving"],
328
+ w: 0.2627711048576583,
329
+ x: 0.20751775748638238,
330
+ y: 0.5566583219431673,
331
+ h: 0.268717618171478,
332
+ highlighted: false,
333
+ editingLabels: false,
334
+ },
335
+ {
336
+ cls: "Car",
337
+ color: "hsl(127,100%,50%)",
338
+ w: 0.033016094117647055,
339
+ x: 0.5051247779336334,
340
+ y: 0.5396378545840628,
341
+ h: 0.03423999999999994,
342
+ type: "box",
343
+ id: "5952553512262024",
344
+ tags: ["Stopped"],
345
+ highlighted: false,
346
+ editingLabels: false,
347
+ },
348
+ {
349
+ type: "box",
350
+ x: 0.7847296794208894,
351
+ y: 0.3635007199404308,
352
+ w: 0.04871147880041349,
353
+ h: 0.10995961095800888,
354
+ highlighted: true,
355
+ editingLabels: false,
356
+ color: "hsl(268,100%,50%)",
357
+ id: "5647593040225252",
358
+ cls: "Sign",
359
+ },
360
+ ],
361
+ },
362
+ {
363
+ src: bikeImg2,
364
+ name: "Frame 03022",
365
+ regions: [
366
+ {
367
+ type: "box",
368
+ x: 0.12226982552783494,
369
+ y: 0.5578947368421052,
370
+ w: 0.3301518695958121,
371
+ h: 0.33562583001232194,
372
+ highlighted: false,
373
+ editingLabels: false,
374
+ color: "hsl(171,100%,50%)",
375
+ id: "014393439034159128",
376
+ cls: "Car",
377
+ tags: ["Stopped"],
378
+ },
379
+ {
380
+ type: "box",
381
+ x: 0.5018477698901193,
382
+ y: 0.5954194079501558,
383
+ w: 0.07194249496837657,
384
+ h: 0.06826906557009338,
385
+ highlighted: false,
386
+ editingLabels: false,
387
+ color: "hsl(17,100%,50%)",
388
+ id: "02954614542034717",
389
+ cls: "Car",
390
+ tags: ["Moving"],
391
+ },
392
+ {
393
+ type: "box",
394
+ x: 0.6483083881082046,
395
+ y: 0.6217109311709718,
396
+ w: 0.08786544324705947,
397
+ h: 0.20450608002345438,
398
+ highlighted: true,
399
+ editingLabels: true,
400
+ color: "hsl(337,100%,50%)",
401
+ id: "9124138360972984",
402
+ cls: "Construction Barrier",
403
+ tags: ["Obstacle"],
404
+ },
405
+ {
406
+ type: "box",
407
+ x: 0.7628671305695606,
408
+ y: 0.6299511028935285,
409
+ w: 0.12734928166820647,
410
+ h: 0.2689292407634438,
411
+ highlighted: false,
412
+ editingLabels: false,
413
+ color: "hsl(89,100%,50%)",
414
+ id: "5960600741979638",
415
+ cls: "Construction Barrier",
416
+ },
417
+ {
418
+ type: "box",
419
+ x: 0.5871362440754417,
420
+ y: 0.6232091442114366,
421
+ w: 0.06562102723514573,
422
+ h: 0.15281773012741662,
423
+ highlighted: false,
424
+ editingLabels: false,
425
+ color: "hsl(326,100%,50%)",
426
+ id: "7955287536996538",
427
+ cls: "Construction Barrier",
428
+ },
429
+ {
430
+ type: "box",
431
+ x: 0.42943330004934643,
432
+ y: 0.6054718359824862,
433
+ w: 0.053210066743122564,
434
+ h: 0.054984658299147116,
435
+ highlighted: false,
436
+ editingLabels: false,
437
+ color: "hsl(66,100%,50%)",
438
+ id: "49573139861381166",
439
+ cls: "Car",
440
+ tags: ["Stopped"],
441
+ },
442
+ ],
443
+ },
444
+ ]}
445
+ onExit={(out) => {
446
+ window.lastOutput = out
447
+ console.log(JSON.stringify(out.images))
448
+ }}
449
+ />
450
+ ))
451
+ .add("Annotator blocks scroll from propagating", () => (
452
+ <div style={{ height: "200vh" }}>
453
+ <Annotator
454
+ onExit={actionAddon("onExit")}
455
+ showTags={false}
456
+ middlewares={[
457
+ (store) => (next) => (action) => {
458
+ actionAddon(action.type)(action)
459
+ return next(action)
460
+ },
461
+ ]}
462
+ images={[
463
+ {
464
+ src: exampleImage,
465
+ name: "Seve's Desk",
466
+ regions: testRegions,
467
+ },
468
+ ]}
469
+ />
470
+ <div style={{ color: "red" }}>You shouldn't be able to see this</div>
471
+ </div>
472
+ ))
473
+ .add("Annotator should not expand beyond parent", () => (
474
+ <div
475
+ style={{
476
+ width: "100vw",
477
+ height: "100vh",
478
+ padding: 100,
479
+ boxSizing: "border-box",
480
+ }}
481
+ >
482
+ <Annotator
483
+ onExit={actionAddon("onExit")}
484
+ showTags={false}
485
+ middlewares={[
486
+ (store) => (next) => (action) => {
487
+ actionAddon(action.type)(action)
488
+ return next(action)
489
+ },
490
+ ]}
491
+ images={[
492
+ {
493
+ src: exampleImage,
494
+ name: "Seve's Desk",
495
+ regions: testRegions,
496
+ },
497
+ ]}
498
+ />
499
+ </div>
500
+ ))
501
+ .add("Video with frames as each image", () => (
502
+ <div
503
+ style={{
504
+ width: "100vw",
505
+ height: "100vh",
506
+ boxSizing: "border-box",
507
+ }}
508
+ >
509
+ <Annotator
510
+ onExit={actionAddon("onExit")}
511
+ showTags={false}
512
+ middlewares={[
513
+ (store) => (next) => (action) => {
514
+ actionAddon(action.type)(action)
515
+ return next(action)
516
+ },
517
+ ]}
518
+ images={[
519
+ {
520
+ src: "https://s3.amazonaws.com/asset.workaround.online/SampleVideo_1280x720_1mb.mp4",
521
+ frameTime: 0,
522
+ name: "Frame 1",
523
+ },
524
+ {
525
+ src: "https://s3.amazonaws.com/asset.workaround.online/SampleVideo_1280x720_1mb.mp4",
526
+ frameTime: 4500,
527
+ name: "Frame 2",
528
+ },
529
+ ]}
530
+ />
531
+ </div>
532
+ ))
533
+ .add("Keyframe video", () => (
534
+ <div
535
+ style={{
536
+ width: "100vw",
537
+ height: "100vh",
538
+ boxSizing: "border-box",
539
+ }}
540
+ >
541
+ <Annotator
542
+ onExit={(...args) => {
543
+ console.log(...args)
544
+ actionAddon("onExit")(...args)
545
+ }}
546
+ showTags
547
+ videoSrc="https://s3.amazonaws.com/asset.workaround.online/SampleVideo_1280x720_1mb.mp4"
548
+ videoTime={1000}
549
+ keyframes={{
550
+ 0: {
551
+ regions: [
552
+ {
553
+ type: "point",
554
+ x: 0.1608187134502924,
555
+ y: 0.5769980506822612,
556
+ highlighted: true,
557
+ editingLabels: false,
558
+ color: "hsl(238,100%,50%)",
559
+ id: "9995495728521284",
560
+ },
561
+ {
562
+ type: "box",
563
+ x: 0.089171974522293,
564
+ y: 0.36801132342533616,
565
+ w: 0.30573248407643316,
566
+ h: 0.4170794998820476,
567
+ highlighted: true,
568
+ editingLabels: false,
569
+ color: "hsl(263,100%,50%)",
570
+ id: "04858393322065635",
571
+ },
572
+ ],
573
+ },
574
+ 3333: {
575
+ regions: [
576
+ {
577
+ type: "point",
578
+ x: 0.1608187134502924,
579
+ y: 0.5769980506822612,
580
+ highlighted: true,
581
+ editingLabels: false,
582
+ color: "hsl(238,100%,50%)",
583
+ id: "9995495728521284",
584
+ },
585
+ {
586
+ type: "box",
587
+ x: 0.14861995753715496,
588
+ y: 0.0934182590233546,
589
+ w: 0.3163481953290871,
590
+ h: 0.7596131163010142,
591
+ highlighted: true,
592
+ editingLabels: false,
593
+ color: "hsl(263,100%,50%)",
594
+ id: "04858393322065635",
595
+ },
596
+ ],
597
+ },
598
+ }}
599
+ />
600
+ </div>
601
+ ))
602
+ .add("Override Next/Prev Button Handling", () => {
603
+ const images = [
604
+ exampleImage,
605
+ "https://loremflickr.com/100/100/cars?lock=1",
606
+ "https://loremflickr.com/100/100/cars?lock=2",
607
+ ]
608
+ const [selectedImageIndex, changeSelectedImageIndex] = useState(0)
609
+
610
+ return (
611
+ <Annotator
612
+ onExit={actionAddon("onExit")}
613
+ onNextImage={() => {
614
+ actionAddon("onNextImage")()
615
+ changeSelectedImageIndex((selectedImageIndex + 1) % 3)
616
+ }}
617
+ onPrevImage={() => {
618
+ actionAddon("onPrevImage")()
619
+ changeSelectedImageIndex((selectedImageIndex - 1 + 3) % 3)
620
+ }}
621
+ labelImages
622
+ selectedImage={images[selectedImageIndex]}
623
+ regionClsList={["Alpha", "Beta", "Charlie", "Delta"]}
624
+ imageClsList={["Alpha", "Beta", "Charlie", "Delta"]}
625
+ images={[
626
+ {
627
+ src: exampleImage,
628
+ name: "Seve's Desk",
629
+ },
630
+ {
631
+ src: images[1],
632
+ name: "Frame 0036",
633
+ },
634
+ {
635
+ src: images[2],
636
+ name: "Frame 0037",
637
+ },
638
+ ]}
639
+ />
640
+ )
641
+ })
642
+ .add("Override RegionEditLabel", () => {
643
+ const images = [
644
+ exampleImage,
645
+ "https://loremflickr.com/100/100/cars?lock=1",
646
+ "https://loremflickr.com/100/100/cars?lock=2",
647
+ ]
648
+
649
+ const NewRegionEditLabel = ({
650
+ region,
651
+ editing,
652
+ onDelete,
653
+ onChange,
654
+ onClose,
655
+ onOpen,
656
+ }) => {
657
+ return (
658
+ <div style={{ backgroundColor: "white" }}>
659
+ I'm the closed part
660
+ <div style={{ display: editing ? "block" : "none" }}>
661
+ I'm the part that shows when it's being edited!
662
+ <button onClick={() => onDelete(region)}>Delete This Region</button>
663
+ <button
664
+ onClick={() => onChange({ ...region, cls: "awesome-value" })}
665
+ >
666
+ Set Classification to "awesome-value"
667
+ </button>
668
+ <button onClick={() => onClose(region)}>Close the edit mode</button>
669
+ </div>
670
+ </div>
671
+ )
672
+ }
673
+
674
+ return (
675
+ <Annotator
676
+ onExit={actionAddon("onExit")}
677
+ labelImages
678
+ selectedImage={images[0]}
679
+ RegionEditLabel={NewRegionEditLabel}
680
+ images={[
681
+ {
682
+ src: exampleImage,
683
+ name: "Seve's Desk",
684
+ },
685
+ {
686
+ src: images[1],
687
+ name: "Frame 0036",
688
+ },
689
+ {
690
+ src: images[2],
691
+ name: "Frame 0037",
692
+ },
693
+ ]}
694
+ />
695
+ )
696
+ })
697
+ .add("Two on sample page w/ hotkeys", () => {
698
+ return (
699
+ <HotKeys keyMap={defaultKeyMap}>
700
+ <div>
701
+ <div style={{ height: 600 }}>
702
+ <Annotator
703
+ onExit={actionAddon("onExit")}
704
+ regionClsList={["Alpha", "Beta", "Charlie", "Delta"]}
705
+ imageClsList={["Alpha", "Beta", "Charlie", "Delta"]}
706
+ middlewares={[
707
+ (store) => (next) => (action) => {
708
+ actionAddon(action.type)(action)
709
+ return next(action)
710
+ },
711
+ ]}
712
+ images={[
713
+ {
714
+ src: exampleImage,
715
+ name: "Seve's Desk",
716
+ regions: testRegions,
717
+ },
718
+ ]}
719
+ />
720
+ </div>
721
+ <div style={{ height: 600 }}>
722
+ <Annotator
723
+ onExit={actionAddon("onExit")}
724
+ middlewares={[
725
+ (store) => (next) => (action) => {
726
+ actionAddon(action.type)(action)
727
+ return next(action)
728
+ },
729
+ ]}
730
+ images={[
731
+ {
732
+ src: exampleImage,
733
+ name: "Seve's Desk",
734
+ regions: testRegions,
735
+ },
736
+ ]}
737
+ />
738
+ </div>
739
+ </div>
740
+ </HotKeys>
741
+ )
742
+ })
743
+ .add("CORs Error (Pixel Segmentation)", () => (
744
+ <Annotator
745
+ onExit={actionAddon("onExit")}
746
+ middlewares={middlewares}
747
+ labelImages
748
+ fullImageSegmentationMode
749
+ regionClsList={["Alpha", "Beta", "Charlie", "Delta"]}
750
+ images={[
751
+ {
752
+ src: "https://placebear.com/200/300",
753
+ name: "Frame 0036",
754
+ },
755
+ ]}
756
+ />
757
+ ))
758
+ .add("Modify Allowed Area", () => (
759
+ <Annotator
760
+ onExit={actionAddon("onExit")}
761
+ middlewares={middlewares}
762
+ labelImages
763
+ fullImageSegmentationMode
764
+ allowedArea={{ x: 0, y: 0.6, w: 0.3, h: 0.3 }}
765
+ enabledTools={["modify-allowed-area"]}
766
+ regionClsList={["Alpha", "Beta", "Charlie", "Delta"]}
767
+ images={[
768
+ {
769
+ src: exampleImage,
770
+ name: "Frame 0036",
771
+ },
772
+ ]}
773
+ />
774
+ ))
775
+ .add("Hide Next, Hide Header Text", () => (
776
+ <Annotator
777
+ onExit={actionAddon("onExit")}
778
+ labelImages
779
+ hideNext
780
+ hideHeaderText
781
+ fullImageSegmentationMode
782
+ enabledTools={["modify-allowed-area"]}
783
+ regionClsList={["Alpha", "Beta", "Charlie", "Delta"]}
784
+ images={[
785
+ {
786
+ src: exampleImage,
787
+ name: "Frame 0036",
788
+ },
789
+ ]}
790
+ />
791
+ ))
792
+ .add("Hide Header", () => (
793
+ <Annotator
794
+ onExit={actionAddon("onExit")}
795
+ labelImages
796
+ hideHeader
797
+ fullImageSegmentationMode
798
+ enabledTools={["modify-allowed-area"]}
799
+ regionClsList={["Alpha", "Beta", "Charlie", "Delta"]}
800
+ images={[
801
+ {
802
+ src: exampleImage,
803
+ name: "Frame 0036",
804
+ },
805
+ ]}
806
+ />
807
+ ))