@searpent/react-image-annotate 2.0.76 → 2.0.78
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.
- package/Annotator/exampleImages.js +41 -0
- package/Annotator/examplePhotos.js +6980 -0
- package/Annotator/index.js +417 -0
- package/Annotator/reducers/combine-reducers.js +14 -0
- package/Annotator/reducers/convert-expanding-line-to-polygon.js +73 -0
- package/{src/Annotator → Annotator}/reducers/fix-twisted.js +3 -5
- package/Annotator/reducers/general-reducer.js +1430 -0
- package/Annotator/reducers/get-active-image.js +27 -0
- package/Annotator/reducers/get-implied-video-regions.js +180 -0
- package/Annotator/reducers/history-handler.js +38 -0
- package/Annotator/reducers/image-reducer.js +20 -0
- package/Annotator/reducers/video-reducer.js +88 -0
- package/ClassSelectionMenu/index.js +140 -0
- package/Crosshairs/index.js +53 -0
- package/DebugSidebarBox/index.js +20 -0
- package/DemoSite/Editor.js +194 -0
- package/DemoSite/ErrorBoundaryDialog.js +64 -0
- package/DemoSite/index.js +40 -0
- package/{src/Editor → Editor}/annotation-plugin/annotation.css +20 -0
- package/Editor/annotation-plugin/annotation.js +697 -0
- package/Editor/index.js +93 -0
- package/Editor/readOnly.js +123 -0
- package/{src/Editor → Editor}/tools.js +2 -3
- package/Errorer/index.js +11 -0
- package/FullImageSegmentationAnnotator/index.js +7 -0
- package/GroupSelectorSidebarBox/index.js +63 -0
- package/GroupsEditorSidebarBox/index.js +138 -0
- package/HelpSidebarBox/index.js +58 -0
- package/HighlightBox/index.js +102 -0
- package/HistorySidebarBox/index.js +71 -0
- package/ImageCanvas/index.js +441 -0
- package/ImageCanvas/region-tools.js +165 -0
- package/{src/ImageCanvas → ImageCanvas}/styles.js +12 -8
- package/ImageCanvas/use-mouse.js +180 -0
- package/ImageCanvas/use-project-box.js +27 -0
- package/ImageCanvas/use-wasd-mode.js +62 -0
- package/ImageMask/index.js +133 -0
- package/ImageMask/load-image.js +25 -0
- package/ImageSelectorSidebarBox/index.js +60 -0
- package/KeyframeTimeline/get-time-string.js +27 -0
- package/KeyframeTimeline/index.js +233 -0
- package/KeyframesSelectorSidebarBox/index.js +93 -0
- package/LandingPage/index.js +159 -0
- package/Locker/index.js +11 -0
- package/MainLayout/RightSidebarItemsWrapper.js +19 -0
- package/MainLayout/icon-dictionary.js +104 -0
- package/MainLayout/index.js +526 -0
- package/{src/MainLayout → MainLayout}/styles.js +6 -7
- package/MainLayout/types.js +0 -0
- package/MainLayout/use-implied-video-regions.js +13 -0
- package/MetadataEditorSidebarBox/index.js +231 -0
- package/PageSelector/index.js +180 -0
- package/PointDistances/index.js +73 -0
- package/PreventScrollToParents/index.js +51 -0
- package/RegionLabel/index.js +232 -0
- package/{src/RegionLabel → RegionLabel}/styles.js +12 -15
- package/RegionSelectAndTransformBoxes/index.js +169 -0
- package/RegionSelectorSidebarBox/index.js +254 -0
- package/{src/RegionSelectorSidebarBox → RegionSelectorSidebarBox}/styles.js +13 -14
- package/RegionShapes/index.js +294 -0
- package/RegionTags/index.js +144 -0
- package/SettingsDialog/index.js +52 -0
- package/SettingsProvider/index.js +60 -0
- package/Shortcuts/ShortcutField.js +46 -0
- package/Shortcuts/index.js +133 -0
- package/ShortcutsManager/index.js +155 -0
- package/Sidebar/index.js +69 -0
- package/SidebarBoxContainer/index.js +93 -0
- package/SmallToolButton/index.js +42 -0
- package/TagsSidebarBox/index.js +105 -0
- package/TaskDescriptionSidebarBox/index.js +58 -0
- package/Theme/index.js +30 -0
- package/VideoOrImageCanvasBackground/index.js +151 -0
- package/colors.js +14 -0
- package/hooks/use-colors.js +127 -0
- package/hooks/use-event-callback.js +10 -0
- package/hooks/use-exclude-pattern.js +24 -0
- package/hooks/use-load-image.js +26 -0
- package/hooks/use-window-size.js +46 -0
- package/{src/hooks → hooks}/xpattern.js +1 -1
- package/index.js +3 -0
- package/lib.js +3 -0
- package/package.json +1 -1
- package/stories.js +5 -0
- package/utils/blocks-to-article.js +60 -0
- package/{src/utils → utils}/blocks-to-article.test.js +5 -8
- package/{src/utils → utils}/default-locked-until.js +2 -1
- package/{src/utils → utils}/filter-only-unique.js +1 -1
- package/utils/get-from-local-storage.js +7 -0
- package/utils/get-hotkey-help-text.js +9 -0
- package/utils/get-landmarks-with-transform.js +40 -0
- package/utils/photosToImages.js +85 -0
- package/utils/regions-groups.js +28 -0
- package/utils/regions-to-blocks.js +18 -0
- package/utils/saveable-actions-enum.js +3 -0
- package/utils/set-in-local-storage.js +3 -0
- package/utils/sleep.js +7 -0
- package/utils/uuid-to-hash.js +5 -0
- package/.babelrc +0 -6
- package/.env +0 -1
- package/.flowconfig +0 -2
- package/.github/workflows/release-on-master.yml +0 -32
- package/.github/workflows/test.yml +0 -16
- package/.prettierrc +0 -3
- package/.releaserc.js +0 -18
- package/.storybook/addons.js +0 -2
- package/.storybook/config.js +0 -16
- package/LICENSE +0 -21
- package/public/favicon.ico +0 -0
- package/public/index.html +0 -38
- package/src/Annotator/bike-pic.png +0 -0
- package/src/Annotator/bike-pic2.png +0 -0
- package/src/Annotator/dab-keyframes.story.json +0 -1
- package/src/Annotator/exampleImages.js +0 -48
- package/src/Annotator/examplePhotos.js +0 -7603
- package/src/Annotator/index.js +0 -380
- package/src/Annotator/index.story.js +0 -877
- package/src/Annotator/poses.story.js +0 -150
- package/src/Annotator/reducers/combine-reducers.js +0 -7
- package/src/Annotator/reducers/convert-expanding-line-to-polygon.js +0 -53
- package/src/Annotator/reducers/general-reducer.js +0 -1228
- package/src/Annotator/reducers/get-active-image.js +0 -21
- package/src/Annotator/reducers/get-implied-video-regions.js +0 -115
- package/src/Annotator/reducers/history-handler.js +0 -60
- package/src/Annotator/reducers/image-reducer.js +0 -23
- package/src/Annotator/reducers/video-reducer.js +0 -85
- package/src/Annotator/video.story.js +0 -51
- package/src/ClassSelectionMenu/index.js +0 -112
- package/src/Crosshairs/index.js +0 -64
- package/src/DebugSidebarBox/index.js +0 -36
- package/src/DemoSite/Editor.js +0 -235
- package/src/DemoSite/ErrorBoundaryDialog.js +0 -34
- package/src/DemoSite/index.js +0 -41
- package/src/DemoSite/index.story.js +0 -10
- package/src/DemoSite/simple-segmentation-example.json +0 -572
- package/src/Editor/annotation-plugin/annotation.js +0 -536
- package/src/Editor/index.js +0 -50
- package/src/Editor/readOnly.js +0 -21
- package/src/Errorer/index.js +0 -13
- package/src/FullImageSegmentationAnnotator/hard1.story.jpg +0 -0
- package/src/FullImageSegmentationAnnotator/hard2.story.jpg +0 -0
- package/src/FullImageSegmentationAnnotator/hard3.story.jpg +0 -0
- package/src/FullImageSegmentationAnnotator/index.js +0 -7
- package/src/FullImageSegmentationAnnotator/index.story.js +0 -177
- package/src/FullImageSegmentationAnnotator/orange.story.png +0 -0
- package/src/GroupSelectorSidebarBox/index.js +0 -48
- package/src/GroupsEditorSidebarBox/index.js +0 -108
- package/src/HelpSidebarBox/index.js +0 -43
- package/src/HighlightBox/index.js +0 -143
- package/src/HistorySidebarBox/index.js +0 -78
- package/src/ImageCanvas/dancing-man.story.jpg +0 -0
- package/src/ImageCanvas/index.js +0 -515
- package/src/ImageCanvas/index.story.js +0 -314
- package/src/ImageCanvas/mouse_mask.story.png +0 -0
- package/src/ImageCanvas/region-tools.js +0 -171
- package/src/ImageCanvas/seves_desk.story.jpg +0 -0
- package/src/ImageCanvas/use-mouse.js +0 -168
- package/src/ImageCanvas/use-project-box.js +0 -23
- package/src/ImageCanvas/use-wasd-mode.js +0 -50
- package/src/ImageMask/index.js +0 -127
- package/src/ImageMask/load-image.js +0 -32
- package/src/ImageSelectorSidebarBox/index.js +0 -54
- package/src/KeyframeTimeline/get-time-string.js +0 -25
- package/src/KeyframeTimeline/index.js +0 -223
- package/src/KeyframesSelectorSidebarBox/index.js +0 -93
- package/src/LandingPage/content.md +0 -57
- package/src/LandingPage/github-markdown.css +0 -964
- package/src/LandingPage/index.js +0 -147
- package/src/Locker/index.js +0 -13
- package/src/MainLayout/RightSidebarItemsWrapper.js +0 -21
- package/src/MainLayout/icon-dictionary.js +0 -79
- package/src/MainLayout/index.js +0 -564
- package/src/MainLayout/index.story.js +0 -240
- package/src/MainLayout/types.js +0 -171
- package/src/MainLayout/use-implied-video-regions.js +0 -17
- package/src/MetadataEditorSidebarBox/index.js +0 -160
- package/src/PageSelector/index.js +0 -159
- package/src/PointDistances/index.js +0 -90
- package/src/PreventScrollToParents/index.js +0 -48
- package/src/PreventScrollToParents/index.story.js +0 -23
- package/src/RegionLabel/index.js +0 -236
- package/src/RegionSelectAndTransformBoxes/index.js +0 -236
- package/src/RegionSelectorSidebarBox/index.js +0 -220
- package/src/RegionShapes/index.js +0 -254
- package/src/RegionTags/index.js +0 -136
- package/src/SettingsDialog/index.js +0 -58
- package/src/SettingsProvider/index.js +0 -57
- package/src/Shortcuts/ShortcutField.js +0 -44
- package/src/Shortcuts/index.js +0 -129
- package/src/ShortcutsManager/index.js +0 -162
- package/src/Sidebar/index.js +0 -117
- package/src/SidebarBoxContainer/index.js +0 -93
- package/src/SmallToolButton/index.js +0 -57
- package/src/TagsSidebarBox/index.js +0 -93
- package/src/TaskDescriptionSidebarBox/index.js +0 -43
- package/src/Theme/index.js +0 -36
- package/src/VideoOrImageCanvasBackground/index.js +0 -170
- package/src/colors.js +0 -32
- package/src/hooks/use-colors.js +0 -75
- package/src/hooks/use-event-callback.js +0 -11
- package/src/hooks/use-exclude-pattern.js +0 -27
- package/src/hooks/use-load-image.js +0 -21
- package/src/hooks/use-window-size.js +0 -46
- package/src/hooks/xpattern.png +0 -0
- package/src/index.js +0 -18
- package/src/lib.js +0 -7
- package/src/screenshot.png +0 -0
- package/src/site.css +0 -5
- package/src/stories.js +0 -2
- package/src/utils/blocks-to-article.js +0 -61
- package/src/utils/get-from-local-storage.js +0 -7
- package/src/utils/get-hotkey-help-text.js +0 -11
- package/src/utils/get-landmarks-with-transform.js +0 -23
- package/src/utils/photosToImages.js +0 -67
- package/src/utils/regions-groups.js +0 -19
- package/src/utils/regions-to-blocks.js +0 -16
- package/src/utils/saveable-actions-enum.js +0 -5
- package/src/utils/set-in-local-storage.js +0 -6
- package/src/utils/sleep.js +0 -3
- package/src/utils/uuid-to-hash.js +0 -5
- /package/{src/Errorer → Errorer}/errorer.css +0 -0
- /package/{src/Locker → Locker}/locker.css +0 -0
- /package/{src/PageSelector → PageSelector}/page-selector.css +0 -0
- /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)
|
package/src/Theme/index.js
DELETED
|
@@ -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
|
package/src/hooks/use-colors.js
DELETED
|
@@ -1,75 +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
|
-
default:
|
|
38
|
-
return "#02b4ba"
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function stringToNumber(str) {
|
|
43
|
-
let sum = 0
|
|
44
|
-
for (let index = 0; index < str.length; index++) {
|
|
45
|
-
sum += str.charCodeAt(index)
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
return sum
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const useColors = () => {
|
|
52
|
-
const { clsColors, groupColors } = useSettings()
|
|
53
|
-
|
|
54
|
-
const clsColor = (cls) => {
|
|
55
|
-
if (!clsColors) { return DEFAULT_GROUP_COLOR }
|
|
56
|
-
if (clsColors[cls]) { return clsColors[cls] }
|
|
57
|
-
return defaultClsColor(cls)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const groupColor = (idx) => {
|
|
61
|
-
if (isNaN(idx)) {
|
|
62
|
-
return groupColors[stringToNumber(idx) % groupColors.length] || DEFAULT_GROUP_COLOR
|
|
63
|
-
} else {
|
|
64
|
-
return groupColors[idx % groupColors.length] || DEFAULT_GROUP_COLOR
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return {
|
|
70
|
-
clsColor,
|
|
71
|
-
groupColor
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export default useColors;
|
|
@@ -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
|
-
}
|