@searpent/react-image-annotate 2.0.77 → 2.0.79

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/Annotator/exampleImages.js +41 -0
  2. package/Annotator/examplePhotos.js +6980 -0
  3. package/Annotator/index.js +417 -0
  4. package/Annotator/reducers/combine-reducers.js +14 -0
  5. package/Annotator/reducers/convert-expanding-line-to-polygon.js +73 -0
  6. package/{src/Annotator → Annotator}/reducers/fix-twisted.js +3 -5
  7. package/Annotator/reducers/general-reducer.js +1430 -0
  8. package/Annotator/reducers/get-active-image.js +27 -0
  9. package/Annotator/reducers/get-implied-video-regions.js +180 -0
  10. package/Annotator/reducers/history-handler.js +38 -0
  11. package/Annotator/reducers/image-reducer.js +20 -0
  12. package/Annotator/reducers/video-reducer.js +88 -0
  13. package/ClassSelectionMenu/index.js +140 -0
  14. package/Crosshairs/index.js +53 -0
  15. package/DebugSidebarBox/index.js +20 -0
  16. package/DemoSite/Editor.js +194 -0
  17. package/DemoSite/ErrorBoundaryDialog.js +64 -0
  18. package/DemoSite/index.js +40 -0
  19. package/Editor/annotation-plugin/annotation.js +702 -0
  20. package/Editor/index.js +93 -0
  21. package/Editor/readOnly.js +123 -0
  22. package/{src/Editor → Editor}/tools.js +2 -3
  23. package/Errorer/index.js +11 -0
  24. package/FullImageSegmentationAnnotator/index.js +7 -0
  25. package/GroupSelectorSidebarBox/index.js +63 -0
  26. package/GroupsEditorSidebarBox/index.js +138 -0
  27. package/HelpSidebarBox/index.js +58 -0
  28. package/HighlightBox/index.js +102 -0
  29. package/HistorySidebarBox/index.js +71 -0
  30. package/ImageCanvas/index.js +441 -0
  31. package/ImageCanvas/region-tools.js +165 -0
  32. package/{src/ImageCanvas → ImageCanvas}/styles.js +12 -8
  33. package/ImageCanvas/use-mouse.js +180 -0
  34. package/ImageCanvas/use-project-box.js +27 -0
  35. package/ImageCanvas/use-wasd-mode.js +62 -0
  36. package/ImageMask/index.js +133 -0
  37. package/ImageMask/load-image.js +25 -0
  38. package/ImageSelectorSidebarBox/index.js +60 -0
  39. package/KeyframeTimeline/get-time-string.js +27 -0
  40. package/KeyframeTimeline/index.js +233 -0
  41. package/KeyframesSelectorSidebarBox/index.js +93 -0
  42. package/LandingPage/index.js +159 -0
  43. package/Locker/index.js +11 -0
  44. package/MainLayout/RightSidebarItemsWrapper.js +19 -0
  45. package/MainLayout/icon-dictionary.js +104 -0
  46. package/MainLayout/index.js +526 -0
  47. package/{src/MainLayout → MainLayout}/styles.js +6 -7
  48. package/MainLayout/types.js +0 -0
  49. package/MainLayout/use-implied-video-regions.js +13 -0
  50. package/MetadataEditorSidebarBox/index.js +231 -0
  51. package/PageSelector/index.js +180 -0
  52. package/PointDistances/index.js +73 -0
  53. package/PreventScrollToParents/index.js +51 -0
  54. package/RegionLabel/index.js +232 -0
  55. package/{src/RegionLabel → RegionLabel}/styles.js +12 -15
  56. package/RegionSelectAndTransformBoxes/index.js +169 -0
  57. package/RegionSelectorSidebarBox/index.js +254 -0
  58. package/{src/RegionSelectorSidebarBox → RegionSelectorSidebarBox}/styles.js +13 -14
  59. package/RegionShapes/index.js +294 -0
  60. package/RegionTags/index.js +144 -0
  61. package/SettingsDialog/index.js +52 -0
  62. package/SettingsProvider/index.js +60 -0
  63. package/Shortcuts/ShortcutField.js +46 -0
  64. package/Shortcuts/index.js +133 -0
  65. package/ShortcutsManager/index.js +155 -0
  66. package/Sidebar/index.js +69 -0
  67. package/SidebarBoxContainer/index.js +93 -0
  68. package/SmallToolButton/index.js +42 -0
  69. package/TagsSidebarBox/index.js +105 -0
  70. package/TaskDescriptionSidebarBox/index.js +58 -0
  71. package/Theme/index.js +30 -0
  72. package/VideoOrImageCanvasBackground/index.js +151 -0
  73. package/colors.js +14 -0
  74. package/hooks/use-colors.js +127 -0
  75. package/hooks/use-event-callback.js +10 -0
  76. package/hooks/use-exclude-pattern.js +24 -0
  77. package/hooks/use-load-image.js +26 -0
  78. package/hooks/use-window-size.js +46 -0
  79. package/{src/hooks → hooks}/xpattern.js +1 -1
  80. package/index.js +3 -0
  81. package/lib.js +3 -0
  82. package/package.json +1 -1
  83. package/stories.js +5 -0
  84. package/utils/blocks-to-article.js +60 -0
  85. package/{src/utils → utils}/blocks-to-article.test.js +5 -8
  86. package/{src/utils → utils}/default-locked-until.js +2 -1
  87. package/{src/utils → utils}/filter-only-unique.js +1 -1
  88. package/utils/get-from-local-storage.js +7 -0
  89. package/utils/get-hotkey-help-text.js +9 -0
  90. package/utils/get-landmarks-with-transform.js +40 -0
  91. package/utils/photosToImages.js +85 -0
  92. package/utils/regions-groups.js +28 -0
  93. package/utils/regions-to-blocks.js +18 -0
  94. package/utils/saveable-actions-enum.js +3 -0
  95. package/utils/set-in-local-storage.js +3 -0
  96. package/utils/sleep.js +7 -0
  97. package/utils/uuid-to-hash.js +5 -0
  98. package/.babelrc +0 -6
  99. package/.env +0 -1
  100. package/.flowconfig +0 -2
  101. package/.github/workflows/release-on-master.yml +0 -32
  102. package/.github/workflows/test.yml +0 -16
  103. package/.prettierrc +0 -3
  104. package/.releaserc.js +0 -18
  105. package/.storybook/addons.js +0 -2
  106. package/.storybook/config.js +0 -16
  107. package/LICENSE +0 -21
  108. package/public/favicon.ico +0 -0
  109. package/public/index.html +0 -38
  110. package/src/Annotator/bike-pic.png +0 -0
  111. package/src/Annotator/bike-pic2.png +0 -0
  112. package/src/Annotator/dab-keyframes.story.json +0 -1
  113. package/src/Annotator/exampleImages.js +0 -48
  114. package/src/Annotator/examplePhotos.js +0 -7603
  115. package/src/Annotator/index.js +0 -380
  116. package/src/Annotator/index.story.js +0 -899
  117. package/src/Annotator/poses.story.js +0 -150
  118. package/src/Annotator/reducers/combine-reducers.js +0 -7
  119. package/src/Annotator/reducers/convert-expanding-line-to-polygon.js +0 -53
  120. package/src/Annotator/reducers/general-reducer.js +0 -1228
  121. package/src/Annotator/reducers/get-active-image.js +0 -21
  122. package/src/Annotator/reducers/get-implied-video-regions.js +0 -115
  123. package/src/Annotator/reducers/history-handler.js +0 -60
  124. package/src/Annotator/reducers/image-reducer.js +0 -23
  125. package/src/Annotator/reducers/video-reducer.js +0 -85
  126. package/src/Annotator/video.story.js +0 -51
  127. package/src/ClassSelectionMenu/index.js +0 -112
  128. package/src/Crosshairs/index.js +0 -64
  129. package/src/DebugSidebarBox/index.js +0 -36
  130. package/src/DemoSite/Editor.js +0 -235
  131. package/src/DemoSite/ErrorBoundaryDialog.js +0 -34
  132. package/src/DemoSite/index.js +0 -41
  133. package/src/DemoSite/index.story.js +0 -10
  134. package/src/DemoSite/simple-segmentation-example.json +0 -572
  135. package/src/Editor/annotation-plugin/annotation.js +0 -546
  136. package/src/Editor/index.js +0 -50
  137. package/src/Editor/readOnly.js +0 -31
  138. package/src/Errorer/index.js +0 -13
  139. package/src/FullImageSegmentationAnnotator/hard1.story.jpg +0 -0
  140. package/src/FullImageSegmentationAnnotator/hard2.story.jpg +0 -0
  141. package/src/FullImageSegmentationAnnotator/hard3.story.jpg +0 -0
  142. package/src/FullImageSegmentationAnnotator/index.js +0 -7
  143. package/src/FullImageSegmentationAnnotator/index.story.js +0 -177
  144. package/src/FullImageSegmentationAnnotator/orange.story.png +0 -0
  145. package/src/GroupSelectorSidebarBox/index.js +0 -48
  146. package/src/GroupsEditorSidebarBox/index.js +0 -108
  147. package/src/HelpSidebarBox/index.js +0 -43
  148. package/src/HighlightBox/index.js +0 -143
  149. package/src/HistorySidebarBox/index.js +0 -78
  150. package/src/ImageCanvas/dancing-man.story.jpg +0 -0
  151. package/src/ImageCanvas/index.js +0 -515
  152. package/src/ImageCanvas/index.story.js +0 -314
  153. package/src/ImageCanvas/mouse_mask.story.png +0 -0
  154. package/src/ImageCanvas/region-tools.js +0 -171
  155. package/src/ImageCanvas/seves_desk.story.jpg +0 -0
  156. package/src/ImageCanvas/use-mouse.js +0 -168
  157. package/src/ImageCanvas/use-project-box.js +0 -23
  158. package/src/ImageCanvas/use-wasd-mode.js +0 -50
  159. package/src/ImageMask/index.js +0 -127
  160. package/src/ImageMask/load-image.js +0 -32
  161. package/src/ImageSelectorSidebarBox/index.js +0 -54
  162. package/src/KeyframeTimeline/get-time-string.js +0 -25
  163. package/src/KeyframeTimeline/index.js +0 -223
  164. package/src/KeyframesSelectorSidebarBox/index.js +0 -93
  165. package/src/LandingPage/content.md +0 -57
  166. package/src/LandingPage/github-markdown.css +0 -964
  167. package/src/LandingPage/index.js +0 -147
  168. package/src/Locker/index.js +0 -13
  169. package/src/MainLayout/RightSidebarItemsWrapper.js +0 -21
  170. package/src/MainLayout/icon-dictionary.js +0 -79
  171. package/src/MainLayout/index.js +0 -564
  172. package/src/MainLayout/index.story.js +0 -240
  173. package/src/MainLayout/types.js +0 -171
  174. package/src/MainLayout/use-implied-video-regions.js +0 -17
  175. package/src/MetadataEditorSidebarBox/index.js +0 -160
  176. package/src/PageSelector/index.js +0 -159
  177. package/src/PointDistances/index.js +0 -90
  178. package/src/PreventScrollToParents/index.js +0 -48
  179. package/src/PreventScrollToParents/index.story.js +0 -23
  180. package/src/RegionLabel/index.js +0 -236
  181. package/src/RegionSelectAndTransformBoxes/index.js +0 -236
  182. package/src/RegionSelectorSidebarBox/index.js +0 -220
  183. package/src/RegionShapes/index.js +0 -254
  184. package/src/RegionTags/index.js +0 -136
  185. package/src/SettingsDialog/index.js +0 -58
  186. package/src/SettingsProvider/index.js +0 -57
  187. package/src/Shortcuts/ShortcutField.js +0 -44
  188. package/src/Shortcuts/index.js +0 -129
  189. package/src/ShortcutsManager/index.js +0 -162
  190. package/src/Sidebar/index.js +0 -117
  191. package/src/SidebarBoxContainer/index.js +0 -93
  192. package/src/SmallToolButton/index.js +0 -57
  193. package/src/TagsSidebarBox/index.js +0 -93
  194. package/src/TaskDescriptionSidebarBox/index.js +0 -43
  195. package/src/Theme/index.js +0 -36
  196. package/src/VideoOrImageCanvasBackground/index.js +0 -170
  197. package/src/colors.js +0 -32
  198. package/src/hooks/use-colors.js +0 -95
  199. package/src/hooks/use-event-callback.js +0 -11
  200. package/src/hooks/use-exclude-pattern.js +0 -27
  201. package/src/hooks/use-load-image.js +0 -21
  202. package/src/hooks/use-window-size.js +0 -46
  203. package/src/hooks/xpattern.png +0 -0
  204. package/src/index.js +0 -18
  205. package/src/lib.js +0 -7
  206. package/src/screenshot.png +0 -0
  207. package/src/site.css +0 -5
  208. package/src/stories.js +0 -2
  209. package/src/utils/blocks-to-article.js +0 -61
  210. package/src/utils/get-from-local-storage.js +0 -7
  211. package/src/utils/get-hotkey-help-text.js +0 -11
  212. package/src/utils/get-landmarks-with-transform.js +0 -23
  213. package/src/utils/photosToImages.js +0 -67
  214. package/src/utils/regions-groups.js +0 -19
  215. package/src/utils/regions-to-blocks.js +0 -16
  216. package/src/utils/saveable-actions-enum.js +0 -5
  217. package/src/utils/set-in-local-storage.js +0 -6
  218. package/src/utils/sleep.js +0 -3
  219. package/src/utils/uuid-to-hash.js +0 -5
  220. /package/{src/Editor → Editor}/annotation-plugin/annotation.css +0 -0
  221. /package/{src/Errorer → Errorer}/errorer.css +0 -0
  222. /package/{src/Locker → Locker}/locker.css +0 -0
  223. /package/{src/PageSelector → PageSelector}/page-selector.css +0 -0
  224. /package/{src/utils → utils}/next-group-id.js +0 -0
@@ -1,93 +0,0 @@
1
- // @flow
2
-
3
- import React, { useState, memo } from "react"
4
- import Paper from "@mui/material/Paper"
5
- import { makeStyles } from "@mui/styles"
6
- import { createTheme, ThemeProvider } from "@mui/material/styles"
7
- import ExpandIcon from "@mui/icons-material/ExpandMore"
8
- import IconButton from "@mui/material/IconButton"
9
- import Collapse from "@mui/material/Collapse"
10
- import { grey } from "@mui/material/colors"
11
- import classnames from "classnames"
12
- import useEventCallback from "use-event-callback"
13
- import SidebarBox from "react-material-workspace-layout/SidebarBox"
14
-
15
- const theme = createTheme()
16
- const useStyles = makeStyles((theme) => ({
17
- container: { margin: 8 },
18
- header: {
19
- display: "flex",
20
- flexDirection: "row",
21
- alignItems: "center",
22
- padding: 8,
23
- paddingLeft: 16,
24
- paddingRight: 16,
25
- },
26
- title: {
27
- fontSize: 14,
28
- fontWeight: "bold",
29
- flexGrow: 1,
30
- paddingLeft: 8,
31
- color: grey[800],
32
- "& span": {
33
- color: grey[600],
34
- fontSize: 12,
35
- },
36
- },
37
- expandButton: {
38
- padding: 0,
39
- width: 30,
40
- height: 30,
41
- "& .icon": {
42
- marginTop: -6,
43
- width: 20,
44
- height: 20,
45
- transition: "500ms transform",
46
- "&.expanded": {
47
- transform: "rotate(180deg)",
48
- },
49
- },
50
- },
51
- expandedContent: {
52
- maxHeight: 300,
53
- overflowY: "auto",
54
- "&.noScroll": {
55
- overflowY: "visible",
56
- overflow: "visible",
57
- },
58
- },
59
- }))
60
-
61
- export const SidebarBoxContainer = ({
62
- icon,
63
- title,
64
- subTitle,
65
- children,
66
- noScroll = false,
67
- expandedByDefault = false,
68
- }) => {
69
- const classes = useStyles()
70
- const content = (
71
- <div
72
- className={classnames(classes.expandedContent, noScroll && "noScroll")}
73
- >
74
- {children}
75
- </div>
76
- )
77
-
78
- const [expanded, changeExpanded] = useState(expandedByDefault)
79
- const toggleExpanded = useEventCallback(() => changeExpanded(!expanded))
80
-
81
- return (
82
- <ThemeProvider theme={theme}>
83
- <SidebarBox icon={icon} title={title}>
84
- {children}
85
- </SidebarBox>
86
- </ThemeProvider>
87
- )
88
- }
89
-
90
- export default memo(
91
- SidebarBoxContainer,
92
- (prev, next) => prev.title === next.title && prev.children === next.children
93
- )
@@ -1,57 +0,0 @@
1
- // @flow
2
-
3
- import React, { createContext, useContext, memo } from "react"
4
- import IconButton from "@mui/material/IconButton"
5
- import Tooltip from "@mui/material/Tooltip"
6
- import { blue } from "@mui/material/colors"
7
-
8
- export const SelectedTool = createContext()
9
-
10
- export const SmallToolButton = ({
11
- id,
12
- name,
13
- icon,
14
- selected,
15
- togglable,
16
- alwaysShowing = false,
17
- }: {
18
- id: string,
19
- name: string,
20
- icon: any,
21
- alwaysShowing?: boolean,
22
- selected?: boolean,
23
- togglable?: boolean,
24
- }) => {
25
- const { enabledTools, selectedTool, onClickTool } = useContext(SelectedTool)
26
- if (!enabledTools.includes(id) && !alwaysShowing) return null
27
- selected = selected || selectedTool === id
28
- return (
29
- <Tooltip placement="right" title={name}>
30
- <div>
31
- <IconButton
32
- disabled={!togglable ? selected : undefined}
33
- aria-label={name}
34
- onClick={() => onClickTool(id)}
35
- size="small"
36
- style={{
37
- width: 50,
38
- height: 50,
39
- margin: 1,
40
- color: selected ? blue[500] : undefined,
41
- }}
42
- >
43
- {icon}
44
- </IconButton>
45
- </div>
46
- </Tooltip>
47
- )
48
- }
49
-
50
- export default memo(
51
- SmallToolButton,
52
- (prevProps, nextProps) =>
53
- prevProps.togglable === nextProps.togglable &&
54
- prevProps.selected === nextProps.selected &&
55
- prevProps.name === nextProps.name &&
56
- prevProps.id === nextProps.id
57
- )
@@ -1,93 +0,0 @@
1
- // @flow
2
-
3
- import React, { useMemo, memo } from "react"
4
- import SidebarBoxContainer from "../SidebarBoxContainer"
5
- import StyleIcon from "@mui/icons-material/Style"
6
- import { grey } from "@mui/material/colors"
7
- import Select from "react-select"
8
- import useEventCallback from "use-event-callback"
9
- import { asMutable } from "seamless-immutable"
10
-
11
- type Props = {
12
- tags: Array<string>,
13
- currentImage: { cls?: string, tags?: Array<string> },
14
- imageClsList?: Array<string>,
15
- imageTagList?: Array<string>,
16
- onChangeImage: (Array<string>) => any,
17
- }
18
-
19
- const emptyArr = []
20
- const noop = () => null
21
-
22
- export const TagsSidebarBox = ({
23
- currentImage,
24
- imageClsList = emptyArr,
25
- imageTagList = emptyArr,
26
- onChangeImage = noop,
27
- }: Props) => {
28
- const { tags = [], cls = null } = currentImage || {}
29
- const onChangeClassification = useEventCallback((o) =>
30
- onChangeImage({ cls: o.value })
31
- )
32
- const onChangeTags = useEventCallback((o) =>
33
- onChangeImage({ tags: o.map((a) => a.value) })
34
- )
35
- const selectValue = useMemo(
36
- () => (cls ? { value: cls, label: cls } : null),
37
- [cls]
38
- )
39
- const memoImgClsList = useMemo(
40
- () => asMutable(imageClsList.map((c) => ({ value: c, label: c }))),
41
- [imageClsList]
42
- )
43
- const memoImgTagList = useMemo(
44
- () => asMutable(imageTagList.map((c) => ({ value: c, label: c }))),
45
- [imageTagList]
46
- )
47
- const memoCurrentTags = useMemo(
48
- () => tags.map((r) => ({ value: r, label: r })),
49
- [tags]
50
- )
51
-
52
- if (!currentImage) return null
53
-
54
- return (
55
- <SidebarBoxContainer
56
- title="Image Tags"
57
- expandedByDefault
58
- noScroll
59
- icon={<StyleIcon style={{ color: grey[700] }} />}
60
- >
61
- {imageClsList.length > 0 && (
62
- <div style={{ padding: 8 }}>
63
- <Select
64
- placeholder="Image Classification"
65
- onChange={onChangeClassification}
66
- value={selectValue}
67
- options={memoImgClsList}
68
- />
69
- </div>
70
- )}
71
- {imageTagList.length > 0 && (
72
- <div style={{ padding: 8, paddingTop: 0 }}>
73
- <Select
74
- isMulti
75
- placeholder="Image Tags"
76
- onChange={onChangeTags}
77
- value={memoCurrentTags}
78
- options={memoImgTagList}
79
- />
80
- </div>
81
- )}
82
- </SidebarBoxContainer>
83
- )
84
- }
85
-
86
- export default memo(
87
- TagsSidebarBox,
88
- (prevProps, nextProps) =>
89
- prevProps.currentImage.cls === nextProps.currentImage.cls &&
90
- prevProps.currentImage.tags === nextProps.currentImage.tags &&
91
- prevProps.imageClsList === nextProps.imageClsList &&
92
- prevProps.imageTagList === nextProps.imageTagList
93
- )
@@ -1,43 +0,0 @@
1
- // @flow
2
-
3
- import React, { memo } from "react"
4
- import SidebarBoxContainer from "../SidebarBoxContainer"
5
- import DescriptionIcon from "@mui/icons-material/Description"
6
- import { styled } from "@mui/material/styles"
7
- import { createTheme, ThemeProvider } from "@mui/material/styles"
8
- import { grey } from "@mui/material/colors"
9
- import Markdown from "react-markdown"
10
-
11
- const theme = createTheme()
12
- const MarkdownContainer = styled("div")(({ theme }) => ({
13
- paddingLeft: 16,
14
- paddingRight: 16,
15
- fontSize: 12,
16
- "& h1": { fontSize: 18 },
17
- "& h2": { fontSize: 14 },
18
- "& h3": { fontSize: 12 },
19
- "& h4": { fontSize: 12 },
20
- "& h5": { fontSize: 12 },
21
- "& h6": { fontSize: 12 },
22
- "& p": { fontSize: 12 },
23
- "& a": {},
24
- "& img": { width: "100%" },
25
- }))
26
-
27
- export const TaskDescriptionSidebarBox = ({ description }) => {
28
- return (
29
- <ThemeProvider theme={theme}>
30
- <SidebarBoxContainer
31
- title="Task Description"
32
- icon={<DescriptionIcon style={{ color: grey[700] }} />}
33
- expandedByDefault={description && description !== "" ? false : true}
34
- >
35
- <MarkdownContainer>
36
- <Markdown source={description} />
37
- </MarkdownContainer>
38
- </SidebarBoxContainer>
39
- </ThemeProvider>
40
- )
41
- }
42
-
43
- export default memo(TaskDescriptionSidebarBox)
@@ -1,36 +0,0 @@
1
- // @flow
2
-
3
- import React from "react"
4
- import { ThemeProvider, createTheme } from "@mui/material/styles"
5
- import { makeStyles } from "@mui/styles"
6
-
7
- const useStyles = makeStyles((theme) => ({
8
- container: {
9
- fontFamily: '"Inter", sans-serif',
10
- },
11
- }))
12
-
13
- const theme = createTheme({
14
- typography: {
15
- fontFamily: '"Inter", "Roboto", sans-serif',
16
- },
17
- overrides: {
18
- MuiButton: {
19
- root: {
20
- textTransform: "none",
21
- },
22
- },
23
- },
24
- })
25
-
26
- export const Theme = ({ children }: any) => {
27
- const classes = useStyles()
28
- return (
29
- <ThemeProvider theme={theme}>
30
- {/* <div className={classes.container}>{children}</div> */}
31
- <div>{children}</div>
32
- </ThemeProvider>
33
- )
34
- }
35
-
36
- export default Theme
@@ -1,170 +0,0 @@
1
- // @flow weak
2
-
3
- import React, { useRef, useEffect, useMemo, useState } from "react"
4
- import { styled } from "@mui/material/styles"
5
- import { createTheme, ThemeProvider } from "@mui/material/styles"
6
- import useEventCallback from "use-event-callback"
7
- import { useSettings } from "../SettingsProvider"
8
-
9
- const theme = createTheme()
10
- const Video = styled("video")(({ theme }) => ({
11
- zIndex: 0,
12
- position: "absolute",
13
- }))
14
-
15
- const StyledImage = styled("img")(({ theme }) => ({
16
- zIndex: 0,
17
- position: "absolute",
18
- }))
19
-
20
- const Error = styled("div")(({ theme }) => ({
21
- zIndex: 0,
22
- position: "absolute",
23
- left: 0,
24
- right: 0,
25
- bottom: 0,
26
- top: 0,
27
- backgroundColor: "rgba(255,0,0,0.2)",
28
- color: "#ff0000",
29
- fontWeight: "bold",
30
- whiteSpace: "pre-wrap",
31
- padding: 50,
32
- }))
33
-
34
- export default ({
35
- imagePosition,
36
- mouseEvents,
37
- videoTime,
38
- videoSrc,
39
- imageSrc,
40
- onLoad,
41
- useCrossOrigin = false,
42
- videoPlaying,
43
- onChangeVideoTime,
44
- onChangeVideoPlaying,
45
- }) => {
46
- const settings = useSettings()
47
- const videoRef = useRef()
48
- const imageRef = useRef()
49
- const [error, setError] = useState()
50
-
51
- useEffect(() => {
52
- if (!videoPlaying && videoRef.current) {
53
- videoRef.current.currentTime = (videoTime || 0) / 1000
54
- }
55
- }, [videoTime])
56
-
57
- useEffect(() => {
58
- let renderLoopRunning = false
59
- if (videoRef.current) {
60
- if (videoPlaying) {
61
- videoRef.current.play()
62
- renderLoopRunning = true
63
- if (settings.videoPlaybackSpeed) {
64
- videoRef.current.playbackRate = parseFloat(
65
- settings.videoPlaybackSpeed
66
- )
67
- }
68
- } else {
69
- videoRef.current.pause()
70
- }
71
- }
72
-
73
- function checkForNewFrame() {
74
- if (!renderLoopRunning) return
75
- if (!videoRef.current) return
76
- const newVideoTime = Math.floor(videoRef.current.currentTime * 1000)
77
- if (videoTime !== newVideoTime) {
78
- onChangeVideoTime(newVideoTime)
79
- }
80
- if (videoRef.current.paused) {
81
- renderLoopRunning = false
82
- onChangeVideoPlaying(false)
83
- }
84
- requestAnimationFrame(checkForNewFrame)
85
- }
86
- checkForNewFrame()
87
-
88
- return () => {
89
- renderLoopRunning = false
90
- }
91
- }, [videoPlaying])
92
-
93
- const onLoadedVideoMetadata = useEventCallback((event) => {
94
- const videoElm = event.currentTarget
95
- videoElm.currentTime = (videoTime || 0) / 1000
96
- if (onLoad)
97
- onLoad({
98
- naturalWidth: videoElm.videoWidth,
99
- naturalHeight: videoElm.videoHeight,
100
- videoElm: videoElm,
101
- duration: videoElm.duration,
102
- })
103
- })
104
- const onImageLoaded = useEventCallback((event) => {
105
- const imageElm = event.currentTarget
106
- if (onLoad)
107
- onLoad({
108
- naturalWidth: imageElm.naturalWidth,
109
- naturalHeight: imageElm.naturalHeight,
110
- imageElm,
111
- })
112
- })
113
- const onImageError = useEventCallback((event) => {
114
- setError(
115
- `Could not load image\n\nMake sure your image works by visiting ${
116
- imageSrc || videoSrc
117
- } in a web browser. If that URL works, the server hosting the URL may be not allowing you to access the image from your current domain. Adjust server settings to enable the image to be viewed.${
118
- !useCrossOrigin
119
- ? ""
120
- : `\n\nYour image may be blocked because it's not being sent with CORs headers. To do pixel segmentation, browser web security requires CORs headers in order for the algorithm to read the pixel data from the image. CORs headers are easy to add if you're using an S3 bucket or own the server hosting your images.`
121
- }\n\n If you need a hand, reach out to the community at universaldatatool.slack.com`
122
- )
123
- })
124
-
125
- const stylePosition = useMemo(() => {
126
- let width = imagePosition.bottomRight.x - imagePosition.topLeft.x
127
- let height = imagePosition.bottomRight.y - imagePosition.topLeft.y
128
- return {
129
- imageRendering: "pixelated",
130
- left: imagePosition.topLeft.x,
131
- top: imagePosition.topLeft.y,
132
- width: isNaN(width) ? 0 : width,
133
- height: isNaN(height) ? 0 : height,
134
- }
135
- }, [
136
- imagePosition.topLeft.x,
137
- imagePosition.topLeft.y,
138
- imagePosition.bottomRight.x,
139
- imagePosition.bottomRight.y,
140
- ])
141
-
142
- if (!videoSrc && !imageSrc)
143
- return <Error>No imageSrc or videoSrc provided</Error>
144
-
145
- if (error) return <Error>{error}</Error>
146
-
147
- return (
148
- <ThemeProvider theme={theme}>
149
- {imageSrc && videoTime === undefined ? (
150
- <StyledImage
151
- {...mouseEvents}
152
- src={imageSrc}
153
- ref={imageRef}
154
- style={stylePosition}
155
- onLoad={onImageLoaded}
156
- onError={onImageError}
157
- crossOrigin={useCrossOrigin ? "anonymous" : undefined}
158
- />
159
- ) : (
160
- <Video
161
- {...mouseEvents}
162
- ref={videoRef}
163
- style={stylePosition}
164
- onLoadedMetadata={onLoadedVideoMetadata}
165
- src={videoSrc || imageSrc}
166
- />
167
- )}
168
- </ThemeProvider>
169
- )
170
- }
package/src/colors.js DELETED
@@ -1,32 +0,0 @@
1
- // @flow
2
-
3
- import * as muiColors from "@mui/material/colors"
4
-
5
- export const colors = [
6
- muiColors.red[500],
7
- muiColors.blue[500],
8
- muiColors.green[500],
9
- muiColors.orange[800],
10
- muiColors.brown[500],
11
- muiColors.lightGreen[700],
12
- muiColors.pink[500],
13
- muiColors.purple[500],
14
- muiColors.indigo[500],
15
- muiColors.teal[500],
16
- muiColors.lime[500],
17
- muiColors.blueGrey[500],
18
- ]
19
-
20
- const transparency = 0x88000000
21
-
22
- function reverseParseColor(rrggbb) {
23
- rrggbb = rrggbb.replace("#", "")
24
- const bbggrr = rrggbb.substr(4, 2) + rrggbb.substr(2, 2) + rrggbb.substr(0, 2)
25
- return parseInt(bbggrr, 16)
26
- }
27
-
28
- export const colorInts: Array<number> = colors.map(
29
- (c) => (reverseParseColor(c) | transparency) >>> 0
30
- )
31
-
32
- export default colors
@@ -1,95 +0,0 @@
1
- import { useSettings } from "../SettingsProvider"
2
-
3
- const DEFAULT_GROUP_COLOR = "#32CD32";
4
-
5
- function defaultClsColor(cls) {
6
- switch (cls) {
7
- case 'title':
8
- return '#f70202'
9
- case 'subtitle':
10
- return "#ffb405"
11
- case 'text':
12
- return "#14deef"
13
- case 'author':
14
- return "#f8d51e"
15
- case 'appendix':
16
- return "#bfede2"
17
- case 'photo_author':
18
- return "#9a17bb"
19
- case 'photo_caption':
20
- return "#ff84f6"
21
- case 'advertisement':
22
- return "#ffb201"
23
- case 'other_graphics':
24
- return "#ff5400"
25
- case 'unknown':
26
- return "#bfede2"
27
- case 'about_author':
28
- return "#9a17bb"
29
- case 'image':
30
- return "#14deef"
31
- case 'interview':
32
- return "#23b20f"
33
- case 'table':
34
- return "#02b4ba"
35
- case 'section':
36
- return "#ffcccc"
37
- case 'continuation_ref':
38
- return '#FF33CC'
39
- case 'cover_clip':
40
- return '#669966'
41
- case 'page_id':
42
- return '#4433AA'
43
- case 'continuation_mark':
44
- return '#660066'
45
- case 'follow_up_mark':
46
- return '#873e23'
47
- case 'article_termination_mark':
48
- return '#873e23'
49
- case 'page_splitting_stripe':
50
- return '#873e23'
51
- case 'column_id_stripe':
52
- return '#873e23'
53
- case 'prev_page_reference':
54
- return '#f3a864'
55
- case 'section_subcategory':
56
- return '#442c55'
57
- default:
58
- return "#02b4ba"
59
- }
60
- }
61
-
62
- function stringToNumber(str) {
63
- let sum = 0
64
- for (let index = 0; index < str.length; index++) {
65
- sum += str.charCodeAt(index)
66
-
67
- }
68
- return sum
69
- }
70
-
71
- const useColors = () => {
72
- const { clsColors, groupColors } = useSettings()
73
-
74
- const clsColor = (cls) => {
75
- if (!clsColors) { return DEFAULT_GROUP_COLOR }
76
- if (clsColors[cls]) { return clsColors[cls] }
77
- return defaultClsColor(cls)
78
- }
79
-
80
- const groupColor = (idx) => {
81
- if (isNaN(idx)) {
82
- return groupColors[stringToNumber(idx) % groupColors.length] || DEFAULT_GROUP_COLOR
83
- } else {
84
- return groupColors[idx % groupColors.length] || DEFAULT_GROUP_COLOR
85
- }
86
-
87
- }
88
-
89
- return {
90
- clsColor,
91
- groupColor
92
- }
93
- }
94
-
95
- export default useColors;
@@ -1,11 +0,0 @@
1
- // @flow
2
-
3
- import { useRef, useCallback, useLayoutEffect, useEffect } from "react"
4
-
5
- export default (fn) => {
6
- let ref = useRef()
7
- useLayoutEffect(() => {
8
- ref.current = fn
9
- })
10
- return useCallback((...args) => (0, ref.current)(...args), [])
11
- }
@@ -1,27 +0,0 @@
1
- // @flow weak
2
-
3
- import { useRef } from "react"
4
- import excludePatternSrc from "./xpattern.js"
5
-
6
- export default () => {
7
- const excludePattern = useRef(null)
8
- if (excludePattern.current === null) {
9
- excludePattern.current = {
10
- image: new Image(),
11
- pattern: null,
12
- }
13
- const canvas = document.createElement("canvas")
14
- canvas.width = 100
15
- canvas.height = 100
16
- const context = canvas.getContext("2d")
17
-
18
- excludePattern.current.image.onload = () => {
19
- excludePattern.current.pattern = context.createPattern(
20
- excludePattern.current.image,
21
- "repeat"
22
- )
23
- }
24
- excludePattern.current.image.src = excludePatternSrc
25
- }
26
- return excludePattern.current.pattern
27
- }
@@ -1,21 +0,0 @@
1
- // @flow weak
2
-
3
- import { useRef, useState } from "react"
4
-
5
- export default (imageSrc, onImageLoaded) => {
6
- const [imageLoaded, changeImageLoaded] = useState(false)
7
- const image = useRef(null)
8
- if (image.current === null) {
9
- image.current = new Image()
10
- image.current.onload = () => {
11
- changeImageLoaded(true)
12
- if (onImageLoaded)
13
- onImageLoaded({
14
- width: image.current.naturalWidth,
15
- height: image.current.naturalHeight,
16
- })
17
- }
18
- image.current.src = imageSrc
19
- }
20
- return [image.current, imageLoaded]
21
- }