@searpent/react-image-annotate 2.0.74 → 2.0.76

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