@nualang/nualang-ui-components 0.1.1400 → 0.1.1401
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/dist/Exercises/Roleplay/Games/TopBarActions.js +10 -15
- package/dist/Exercises/Roleplay/OriginalRoleplay.js +11 -16
- package/dist/Lists/ExerciseSelection/ExerciseSelection.js +7 -3
- package/dist/Lists/Exercises/Exercises.js +4 -7
- package/dist/Lists/PhraseListSelection/PhraseListSelection.js +8 -4
- package/dist/Lists/RoleplaySelection/RoleplaySelection.js +8 -4
- package/dist/Misc/AchievementsBanner/AchievementsBanner.js +62 -0
- package/dist/Misc/ColorLinearProgress/ColorLinearProgress.js +14 -17
- package/dist/Misc/ExerciseProgressBar/ExerciseProgressBar.js +10 -16
- package/dist/Misc/MedalCard/MedalCard.js +98 -0
- package/dist/Misc/MedalSelector/MedalSelector.js +4 -0
- package/dist/Misc/MedalSelector/PlaceholderMedal.js +96 -0
- package/dist/Misc/MedalSelector/PlaceholderMedal.svg +27 -0
- package/dist/Misc/NualaMascot/NualaMascot.js +68 -0
- package/dist/Misc/NualaMascot/NualaMascotGreen.js +212 -0
- package/dist/Misc/NualaMascot/NualaMascotPink.js +131 -0
- package/dist/Misc/NualaMascot/NualaMascotRed.js +148 -0
- package/dist/Misc/NualaMascot/NualaMascotYellow.js +140 -0
- package/dist/index.js +4 -1
- package/package.json +4 -4
|
@@ -7,23 +7,10 @@ import EditIcon from "@mui/icons-material/Create";
|
|
|
7
7
|
import Share from "@mui/icons-material/Share";
|
|
8
8
|
import MoreVertIcon from "@mui/icons-material/MoreVert";
|
|
9
9
|
import { makeStyles } from "tss-react/mui";
|
|
10
|
-
import { withStyles } from "tss-react/mui";
|
|
11
10
|
import { alpha } from "@mui/material/styles";
|
|
12
11
|
import VoiceSpeedSelector from "../../../Misc/VoiceSpeed/VoiceSpeed";
|
|
13
12
|
import ReportProblem from "../../../Misc/ReportProblem/ReportProblem";
|
|
14
13
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
15
|
-
const RoundedLinearProgress = withStyles(LinearProgress, theme => ({
|
|
16
|
-
root: {
|
|
17
|
-
height: 12,
|
|
18
|
-
borderRadius: 4
|
|
19
|
-
},
|
|
20
|
-
colorPrimary: {
|
|
21
|
-
backgroundColor: alpha(theme.palette.success.light, 0.25)
|
|
22
|
-
},
|
|
23
|
-
barColorPrimary: {
|
|
24
|
-
backgroundColor: theme.palette.success.main
|
|
25
|
-
}
|
|
26
|
-
}));
|
|
27
14
|
const useStyles = makeStyles()((theme, _params, classes) => ({
|
|
28
15
|
label: {
|
|
29
16
|
color: "#fff"
|
|
@@ -238,13 +225,21 @@ const TopBarActions = ({
|
|
|
238
225
|
children: roleplayHasStarted || isRoleplayPreview ? /*#__PURE__*/_jsxs(_Fragment, {
|
|
239
226
|
children: [!isRoleplayPreview && /*#__PURE__*/_jsx("div", {
|
|
240
227
|
className: classes.progress,
|
|
241
|
-
children: /*#__PURE__*/_jsx(
|
|
228
|
+
children: /*#__PURE__*/_jsx(LinearProgress, {
|
|
242
229
|
variant: "determinate",
|
|
243
230
|
value: currentMessages.length / roleplay.script.length * 100,
|
|
244
231
|
"aria-label": t("exercise"),
|
|
245
232
|
"aria-valuemin": 0,
|
|
246
233
|
"aria-valuemax": 100,
|
|
247
|
-
"aria-valuenow": currentMessages.length / roleplay.script.length * 100
|
|
234
|
+
"aria-valuenow": currentMessages.length / roleplay.script.length * 100,
|
|
235
|
+
sx: {
|
|
236
|
+
height: 12,
|
|
237
|
+
borderRadius: 4,
|
|
238
|
+
backgroundColor: theme => alpha(theme.palette.success.light, 0.25),
|
|
239
|
+
"& .MuiLinearProgress-bar": {
|
|
240
|
+
backgroundColor: theme => theme.palette.success.main
|
|
241
|
+
}
|
|
242
|
+
}
|
|
248
243
|
})
|
|
249
244
|
}), hiddenDown ? null : /*#__PURE__*/_jsxs(_Fragment, {
|
|
250
245
|
children: [/*#__PURE__*/_jsx(VoiceSpeedSelector, {
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { useEffect, useState, memo } from "react";
|
|
2
2
|
import { Joyride, STATUS } from "react-joyride";
|
|
3
3
|
import { useTheme, alpha } from "@mui/material/styles";
|
|
4
|
-
import { withStyles } from "tss-react/mui";
|
|
5
4
|
import { makeStyles } from "tss-react/mui";
|
|
6
|
-
import { Grid, Slide, IconButton, Button, ButtonBase, Avatar, Dialog, Typography, Box, Divider, Tooltip,
|
|
5
|
+
import { Grid, Slide, IconButton, Button, ButtonBase, Avatar, Dialog, Typography, Box, Divider, Tooltip, useMediaQuery, LinearProgress } from "@mui/material";
|
|
7
6
|
import Alert from "@mui/material/Alert";
|
|
8
7
|
import Menu from "@mui/material/Menu";
|
|
9
8
|
import MenuItem from "@mui/material/MenuItem";
|
|
@@ -31,18 +30,6 @@ import ReportProblem from "../../Misc/ReportProblem/ReportProblem";
|
|
|
31
30
|
import { removeExtraWhiteSpaces } from "../../utils";
|
|
32
31
|
import DefaultButton from "../../Misc/DefaultColourButton/DefaultColourButton";
|
|
33
32
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
34
|
-
const RoundedLinearProgress = withStyles(LinearProgress, theme => ({
|
|
35
|
-
root: {
|
|
36
|
-
height: 12,
|
|
37
|
-
borderRadius: 4
|
|
38
|
-
},
|
|
39
|
-
colorPrimary: {
|
|
40
|
-
backgroundColor: alpha(theme.palette.success.light, 0.25)
|
|
41
|
-
},
|
|
42
|
-
barColorPrimary: {
|
|
43
|
-
backgroundColor: theme.palette.success.main
|
|
44
|
-
}
|
|
45
|
-
}));
|
|
46
33
|
const useStyles = makeStyles()((theme, {
|
|
47
34
|
isActorOne
|
|
48
35
|
}, classes) => ({
|
|
@@ -629,9 +616,17 @@ function Roleplay({
|
|
|
629
616
|
children: roleplayHasStarted ? /*#__PURE__*/_jsxs(_Fragment, {
|
|
630
617
|
children: [/*#__PURE__*/_jsx("div", {
|
|
631
618
|
className: classes.progress,
|
|
632
|
-
children: /*#__PURE__*/_jsx(
|
|
619
|
+
children: /*#__PURE__*/_jsx(LinearProgress, {
|
|
633
620
|
variant: "determinate",
|
|
634
|
-
value: currentMessages.length / roleplay.script.length * 100
|
|
621
|
+
value: currentMessages.length / roleplay.script.length * 100,
|
|
622
|
+
sx: {
|
|
623
|
+
height: 12,
|
|
624
|
+
borderRadius: 4,
|
|
625
|
+
backgroundColor: theme => alpha(theme.palette.success.light, 0.25),
|
|
626
|
+
"& .MuiLinearProgress-bar": {
|
|
627
|
+
backgroundColor: theme => theme.palette.success.main
|
|
628
|
+
}
|
|
629
|
+
}
|
|
635
630
|
})
|
|
636
631
|
}), hiddenDown ? null : /*#__PURE__*/_jsxs(_Fragment, {
|
|
637
632
|
children: [/*#__PURE__*/_jsxs(Button, {
|
|
@@ -27,7 +27,8 @@ function Exercise({
|
|
|
27
27
|
sectionId,
|
|
28
28
|
topicId,
|
|
29
29
|
setIsExerciseSelected,
|
|
30
|
-
phrases
|
|
30
|
+
phrases,
|
|
31
|
+
topicName
|
|
31
32
|
}) {
|
|
32
33
|
const noRoleplays = name.toLowerCase() === "roleplays" && roleplays.length === 0;
|
|
33
34
|
const noPhrases = name.toLowerCase() === "phrases" && !phrases?.length && !getPhraseLists;
|
|
@@ -96,7 +97,8 @@ function Exercise({
|
|
|
96
97
|
isExerciseSelected: isExerciseSelected,
|
|
97
98
|
setIsExerciseSelected: setIsExerciseSelected,
|
|
98
99
|
isExpanded: phraseListsOpen,
|
|
99
|
-
onPhraseListsLoaded: handlePhraseListsLoaded
|
|
100
|
+
onPhraseListsLoaded: handlePhraseListsLoaded,
|
|
101
|
+
topicName: topicName
|
|
100
102
|
})
|
|
101
103
|
})
|
|
102
104
|
}), name.toLowerCase() === "roleplays" && /*#__PURE__*/_jsx(Collapse, {
|
|
@@ -114,7 +116,8 @@ function Exercise({
|
|
|
114
116
|
t: t,
|
|
115
117
|
isExerciseSelected: isExerciseSelected,
|
|
116
118
|
handleSelectExercise: handleSelectExercise,
|
|
117
|
-
useCase: useCase
|
|
119
|
+
useCase: useCase,
|
|
120
|
+
topicName: topicName
|
|
118
121
|
})
|
|
119
122
|
})
|
|
120
123
|
})]
|
|
@@ -340,6 +343,7 @@ function Topic({
|
|
|
340
343
|
handleStartExercise: handleStartExercise,
|
|
341
344
|
isCreator: isCreator,
|
|
342
345
|
getPhraseLists: getPhraseLists,
|
|
346
|
+
topicName: topicName,
|
|
343
347
|
...otherProps
|
|
344
348
|
})
|
|
345
349
|
})]
|
|
@@ -15,7 +15,8 @@ import { searchStringToObj, objToSearchString } from "../../utils";
|
|
|
15
15
|
import FlashOnIcon from "@mui/icons-material/FlashOn";
|
|
16
16
|
import FlashOffIcon from "@mui/icons-material/FlashOff";
|
|
17
17
|
import MenuBookIcon from "@mui/icons-material/MenuBook";
|
|
18
|
-
import { Collapse, ListItemText, ListItemIcon, List, ListItemAvatar, IconButton, Badge, Tooltip, Box, Chip
|
|
18
|
+
import { Collapse, ListItemText, ListItemIcon, List, ListItemAvatar, IconButton, Badge, Tooltip, Box, Chip } from "@mui/material";
|
|
19
|
+
import ColorLinearProgress from "../../Misc/ColorLinearProgress/ColorLinearProgress";
|
|
19
20
|
import Add from "@mui/icons-material/Add";
|
|
20
21
|
import Face from "@mui/icons-material/Face";
|
|
21
22
|
import ForumIcon from "@mui/icons-material/Forum";
|
|
@@ -181,13 +182,9 @@ function ItemProgressBar({
|
|
|
181
182
|
sx: {
|
|
182
183
|
width: 160
|
|
183
184
|
},
|
|
184
|
-
children: /*#__PURE__*/_jsx(
|
|
185
|
+
children: /*#__PURE__*/_jsx(ColorLinearProgress, {
|
|
185
186
|
variant: "determinate",
|
|
186
|
-
value: pct
|
|
187
|
-
sx: {
|
|
188
|
-
height: 6,
|
|
189
|
-
borderRadius: 3
|
|
190
|
-
}
|
|
187
|
+
value: pct
|
|
191
188
|
})
|
|
192
189
|
}), /*#__PURE__*/_jsx(Typography, {
|
|
193
190
|
variant: "caption",
|
|
@@ -18,7 +18,8 @@ function PhraseList({
|
|
|
18
18
|
setIsPhraseListSelected,
|
|
19
19
|
t,
|
|
20
20
|
isExerciseSelected,
|
|
21
|
-
setIsExerciseSelected
|
|
21
|
+
setIsExerciseSelected,
|
|
22
|
+
topicName
|
|
22
23
|
}) {
|
|
23
24
|
const [open, setOpen] = useState(false);
|
|
24
25
|
const isTranslationHidden = phraseList?.hiddenPhraseGroupGames?.translation;
|
|
@@ -37,7 +38,8 @@ function PhraseList({
|
|
|
37
38
|
timer: 30,
|
|
38
39
|
answerOption: 0,
|
|
39
40
|
phraseListId: phraseList.phraseListId,
|
|
40
|
-
phrases: phraseList.phrases || []
|
|
41
|
+
phrases: phraseList.phrases || [],
|
|
42
|
+
topicName: topicName ?? ""
|
|
41
43
|
});
|
|
42
44
|
};
|
|
43
45
|
return /*#__PURE__*/_jsxs("div", {
|
|
@@ -162,7 +164,8 @@ function PhraseListSelection({
|
|
|
162
164
|
isExerciseSelected,
|
|
163
165
|
isExpanded,
|
|
164
166
|
setIsExerciseSelected,
|
|
165
|
-
onPhraseListsLoaded
|
|
167
|
+
onPhraseListsLoaded,
|
|
168
|
+
topicName
|
|
166
169
|
}) {
|
|
167
170
|
const [isPhraseListSelected, setIsPhraseListSelected] = useState(false);
|
|
168
171
|
const phraseListsQuery = courseQuerys.useCourseSectionTopicPhraseLists(async (cId, sId, tId, filters) => getPhraseLists(cId, sId, tId, filters), {
|
|
@@ -232,7 +235,8 @@ function PhraseListSelection({
|
|
|
232
235
|
setIsPhraseListSelected: setIsPhraseListSelected,
|
|
233
236
|
t: t,
|
|
234
237
|
isExerciseSelected: isExerciseSelected,
|
|
235
|
-
setIsExerciseSelected: setIsExerciseSelected
|
|
238
|
+
setIsExerciseSelected: setIsExerciseSelected,
|
|
239
|
+
topicName: topicName
|
|
236
240
|
}, phraseList.phraseListId || index));
|
|
237
241
|
}
|
|
238
242
|
export default PhraseListSelection;
|
|
@@ -15,7 +15,8 @@ function Roleplay({
|
|
|
15
15
|
setIsRoleplaySelected,
|
|
16
16
|
t,
|
|
17
17
|
isExerciseSelected,
|
|
18
|
-
handleSelectExercise = null
|
|
18
|
+
handleSelectExercise = null,
|
|
19
|
+
topicName
|
|
19
20
|
}) {
|
|
20
21
|
const [open, setOpen] = useState(false);
|
|
21
22
|
const games = ["roleplay-story", "roleplay-fill-in-the-blanks", "roleplay-act-it-out", "roleplay-act-it-out-listening", "roleplay-act-it-out-speaking", "roleplay-act-it-out-listening-speaking"];
|
|
@@ -26,7 +27,8 @@ function Roleplay({
|
|
|
26
27
|
exercise: exerciseName,
|
|
27
28
|
timer: 30,
|
|
28
29
|
answerOption: 0,
|
|
29
|
-
roleplayId: roleplay.roleplayId
|
|
30
|
+
roleplayId: roleplay.roleplayId,
|
|
31
|
+
topicName: topicName ?? ""
|
|
30
32
|
});
|
|
31
33
|
};
|
|
32
34
|
const isRoleplayEmpty = roleplay?.script?.length === 0 || !roleplay?.script?.some(line => line.text !== undefined);
|
|
@@ -174,7 +176,8 @@ function RoleplaySelection({
|
|
|
174
176
|
t,
|
|
175
177
|
isExerciseSelected,
|
|
176
178
|
handleSelectExercise,
|
|
177
|
-
useCase
|
|
179
|
+
useCase,
|
|
180
|
+
topicName
|
|
178
181
|
}) {
|
|
179
182
|
const [isRoleplaySelected, setIsRoleplaySelected] = useState(false);
|
|
180
183
|
return roleplays.map((roleplay, index) => /*#__PURE__*/_jsx(Roleplay, {
|
|
@@ -186,7 +189,8 @@ function RoleplaySelection({
|
|
|
186
189
|
t: t,
|
|
187
190
|
isExerciseSelected: isExerciseSelected,
|
|
188
191
|
handleSelectExercise: handleSelectExercise,
|
|
189
|
-
useCase: useCase
|
|
192
|
+
useCase: useCase,
|
|
193
|
+
topicName: topicName
|
|
190
194
|
}, index));
|
|
191
195
|
}
|
|
192
196
|
export default RoleplaySelection;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Typography } from "@mui/material";
|
|
2
|
+
import { makeStyles } from "tss-react/mui";
|
|
3
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
4
|
+
const useStyles = makeStyles()((theme, {
|
|
5
|
+
height,
|
|
6
|
+
backgroundImage
|
|
7
|
+
}) => ({
|
|
8
|
+
banner: {
|
|
9
|
+
backgroundColor: theme.palette.secondary.main,
|
|
10
|
+
backgroundImage: backgroundImage ? `linear-gradient(to right, ${theme.palette.secondary.main} 50%, transparent 100%), url(${backgroundImage})` : undefined,
|
|
11
|
+
backgroundSize: "100% 100%, auto 100%",
|
|
12
|
+
backgroundPosition: "0 0, right center",
|
|
13
|
+
backgroundRepeat: "no-repeat",
|
|
14
|
+
minHeight: height,
|
|
15
|
+
display: "flex",
|
|
16
|
+
alignItems: "stretch",
|
|
17
|
+
borderRadius: 12,
|
|
18
|
+
marginBottom: theme.spacing(4)
|
|
19
|
+
},
|
|
20
|
+
text: {
|
|
21
|
+
display: "flex",
|
|
22
|
+
flexDirection: "column",
|
|
23
|
+
justifyContent: "center",
|
|
24
|
+
padding: theme.spacing(3, 4),
|
|
25
|
+
flex: 1
|
|
26
|
+
}
|
|
27
|
+
}));
|
|
28
|
+
export default function AchievementsBanner({
|
|
29
|
+
title,
|
|
30
|
+
description,
|
|
31
|
+
backgroundImage,
|
|
32
|
+
height = 140
|
|
33
|
+
}) {
|
|
34
|
+
const {
|
|
35
|
+
classes
|
|
36
|
+
} = useStyles({
|
|
37
|
+
height,
|
|
38
|
+
backgroundImage
|
|
39
|
+
});
|
|
40
|
+
return /*#__PURE__*/_jsx("div", {
|
|
41
|
+
className: classes.banner,
|
|
42
|
+
children: /*#__PURE__*/_jsxs("div", {
|
|
43
|
+
className: classes.text,
|
|
44
|
+
children: [/*#__PURE__*/_jsx(Typography, {
|
|
45
|
+
variant: "h5",
|
|
46
|
+
sx: {
|
|
47
|
+
color: "white",
|
|
48
|
+
fontWeight: "bold",
|
|
49
|
+
mb: 1
|
|
50
|
+
},
|
|
51
|
+
children: title
|
|
52
|
+
}), /*#__PURE__*/_jsx(Typography, {
|
|
53
|
+
variant: "body2",
|
|
54
|
+
sx: {
|
|
55
|
+
color: "rgba(255,255,255,0.85)",
|
|
56
|
+
fontWeight: "bold"
|
|
57
|
+
},
|
|
58
|
+
children: description
|
|
59
|
+
})]
|
|
60
|
+
})
|
|
61
|
+
});
|
|
62
|
+
}
|
|
@@ -1,28 +1,25 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { LinearProgress } from "@mui/material";
|
|
3
|
-
import { withStyles } from "tss-react/mui";
|
|
4
3
|
import { alpha } from "@mui/system";
|
|
5
4
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
6
|
-
const ProgressBar = withStyles(LinearProgress, theme => ({
|
|
7
|
-
root: {
|
|
8
|
-
height: 8,
|
|
9
|
-
borderRadius: 4,
|
|
10
|
-
border: `1px solid ${theme.palette.success.main}`
|
|
11
|
-
},
|
|
12
|
-
colorPrimary: {
|
|
13
|
-
backgroundColor: alpha(theme.palette.success.light, 0.25)
|
|
14
|
-
},
|
|
15
|
-
barColorPrimary: {
|
|
16
|
-
backgroundColor: theme.palette.success.main
|
|
17
|
-
}
|
|
18
|
-
}));
|
|
19
5
|
function ColorLinearProgress({
|
|
20
6
|
value,
|
|
21
|
-
variant
|
|
7
|
+
variant,
|
|
8
|
+
...rest
|
|
22
9
|
}) {
|
|
23
|
-
return /*#__PURE__*/_jsx(
|
|
10
|
+
return /*#__PURE__*/_jsx(LinearProgress, {
|
|
24
11
|
variant: variant,
|
|
25
|
-
value: value
|
|
12
|
+
value: value,
|
|
13
|
+
...rest,
|
|
14
|
+
sx: {
|
|
15
|
+
height: 8,
|
|
16
|
+
borderRadius: 4,
|
|
17
|
+
border: theme => `1px solid ${theme.palette.success.main}`,
|
|
18
|
+
backgroundColor: theme => alpha(theme.palette.success.light, 0.25),
|
|
19
|
+
"& .MuiLinearProgress-bar": {
|
|
20
|
+
backgroundColor: theme => theme.palette.success.main
|
|
21
|
+
}
|
|
22
|
+
}
|
|
26
23
|
});
|
|
27
24
|
}
|
|
28
25
|
export default ColorLinearProgress;
|
|
@@ -1,21 +1,7 @@
|
|
|
1
1
|
import { alpha } from "@mui/material/styles";
|
|
2
|
-
import { withStyles } from "tss-react/mui";
|
|
3
2
|
import LinearProgress from "@mui/material/LinearProgress";
|
|
4
|
-
//import Tooltip from '@mui/material/Tooltip';
|
|
5
3
|
import { Box, Typography } from "@mui/material";
|
|
6
4
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
7
|
-
const RoundedLinearProgress = withStyles(LinearProgress, theme => ({
|
|
8
|
-
root: {
|
|
9
|
-
height: 12,
|
|
10
|
-
borderRadius: 4
|
|
11
|
-
},
|
|
12
|
-
colorPrimary: {
|
|
13
|
-
backgroundColor: alpha(theme.palette.success.light, 0.25)
|
|
14
|
-
},
|
|
15
|
-
barColorPrimary: {
|
|
16
|
-
backgroundColor: theme.palette.success.main
|
|
17
|
-
}
|
|
18
|
-
}));
|
|
19
5
|
function ExerciseProgressBar(props) {
|
|
20
6
|
const {
|
|
21
7
|
classes = {},
|
|
@@ -43,11 +29,19 @@ function ExerciseProgressBar(props) {
|
|
|
43
29
|
flexGrow: 1,
|
|
44
30
|
mx: 2
|
|
45
31
|
},
|
|
46
|
-
children: /*#__PURE__*/_jsx(
|
|
32
|
+
children: /*#__PURE__*/_jsx(LinearProgress, {
|
|
47
33
|
"aria-label": `${exercise}: ${numOfCorrectAnswers} / ${numOfQuestions}`,
|
|
48
34
|
variant: "determinate",
|
|
49
35
|
value: completed,
|
|
50
|
-
className: classes.progressBar
|
|
36
|
+
className: classes.progressBar,
|
|
37
|
+
sx: {
|
|
38
|
+
height: 12,
|
|
39
|
+
borderRadius: 4,
|
|
40
|
+
backgroundColor: theme => alpha(theme.palette.success.light, 0.25),
|
|
41
|
+
"& .MuiLinearProgress-bar": {
|
|
42
|
+
backgroundColor: theme => theme.palette.success.main
|
|
43
|
+
}
|
|
44
|
+
}
|
|
51
45
|
})
|
|
52
46
|
})]
|
|
53
47
|
})
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { Typography, Box, Divider } from "@mui/material";
|
|
2
|
+
import { makeStyles } from "tss-react/mui";
|
|
3
|
+
import MedalSelector from "../MedalSelector/MedalSelector";
|
|
4
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
5
|
+
const useStyles = makeStyles()(theme => ({
|
|
6
|
+
slot: {
|
|
7
|
+
display: "flex",
|
|
8
|
+
flexDirection: "column",
|
|
9
|
+
alignItems: "center",
|
|
10
|
+
textAlign: "center",
|
|
11
|
+
flex: 1
|
|
12
|
+
},
|
|
13
|
+
info: {
|
|
14
|
+
marginTop: theme.spacing(1)
|
|
15
|
+
}
|
|
16
|
+
}));
|
|
17
|
+
export default function MedalCard({
|
|
18
|
+
medal,
|
|
19
|
+
mascot
|
|
20
|
+
}) {
|
|
21
|
+
const {
|
|
22
|
+
classes
|
|
23
|
+
} = useStyles();
|
|
24
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
25
|
+
className: classes.slot,
|
|
26
|
+
children: [/*#__PURE__*/_jsxs("div", {
|
|
27
|
+
style: {
|
|
28
|
+
position: "relative"
|
|
29
|
+
},
|
|
30
|
+
children: [mascot && /*#__PURE__*/_jsx("div", {
|
|
31
|
+
style: {
|
|
32
|
+
position: "absolute",
|
|
33
|
+
bottom: "36%",
|
|
34
|
+
left: "50%",
|
|
35
|
+
transform: "translateX(-50%)",
|
|
36
|
+
zIndex: 0,
|
|
37
|
+
pointerEvents: "none"
|
|
38
|
+
},
|
|
39
|
+
children: mascot
|
|
40
|
+
}), /*#__PURE__*/_jsx("div", {
|
|
41
|
+
style: mascot ? {
|
|
42
|
+
position: "relative",
|
|
43
|
+
zIndex: 1
|
|
44
|
+
} : undefined,
|
|
45
|
+
children: /*#__PURE__*/_jsx(MedalSelector, {
|
|
46
|
+
color: medal ? medal.color : "placeholder",
|
|
47
|
+
width: "120px",
|
|
48
|
+
sx: medal ? {
|
|
49
|
+
filter: "drop-shadow(0px 4px 4px rgba(0,0,0,0.25))"
|
|
50
|
+
} : undefined
|
|
51
|
+
})
|
|
52
|
+
})]
|
|
53
|
+
}), medal && /*#__PURE__*/_jsxs(Box, {
|
|
54
|
+
className: classes.info,
|
|
55
|
+
sx: {
|
|
56
|
+
display: "flex",
|
|
57
|
+
flexDirection: "column",
|
|
58
|
+
flex: 1,
|
|
59
|
+
width: "100%"
|
|
60
|
+
},
|
|
61
|
+
children: [/*#__PURE__*/_jsxs(Box, {
|
|
62
|
+
sx: {
|
|
63
|
+
flex: 1
|
|
64
|
+
},
|
|
65
|
+
children: [/*#__PURE__*/_jsx(Typography, {
|
|
66
|
+
variant: "body2",
|
|
67
|
+
sx: {
|
|
68
|
+
fontWeight: "bold"
|
|
69
|
+
},
|
|
70
|
+
children: medal.gameType
|
|
71
|
+
}), Array.isArray(medal.topicName) ? medal.topicName.map((line, i) => /*#__PURE__*/_jsx(Typography, {
|
|
72
|
+
variant: "body2",
|
|
73
|
+
children: line
|
|
74
|
+
}, i)) : /*#__PURE__*/_jsx(Typography, {
|
|
75
|
+
variant: "body2",
|
|
76
|
+
children: medal.topicName
|
|
77
|
+
}), /*#__PURE__*/_jsx(Typography, {
|
|
78
|
+
variant: "body2",
|
|
79
|
+
color: "textSecondary",
|
|
80
|
+
sx: {
|
|
81
|
+
fontWeight: 500
|
|
82
|
+
},
|
|
83
|
+
children: medal.courseName
|
|
84
|
+
})]
|
|
85
|
+
}), /*#__PURE__*/_jsx(Divider, {
|
|
86
|
+
sx: {
|
|
87
|
+
my: 0.75,
|
|
88
|
+
width: 40,
|
|
89
|
+
mx: "auto"
|
|
90
|
+
}
|
|
91
|
+
}), /*#__PURE__*/_jsx(Typography, {
|
|
92
|
+
variant: "caption",
|
|
93
|
+
color: "textSecondary",
|
|
94
|
+
children: medal.date
|
|
95
|
+
})]
|
|
96
|
+
})]
|
|
97
|
+
});
|
|
98
|
+
}
|
|
@@ -3,6 +3,7 @@ import { Box } from "@mui/material";
|
|
|
3
3
|
import GoldMedal from "./GoldMedal";
|
|
4
4
|
import SilverMedal from "./SilverMedal";
|
|
5
5
|
import BronzeMedal from "./BronzeMedal";
|
|
6
|
+
import PlaceholderMedal from "./PlaceholderMedal";
|
|
6
7
|
import "./styles.css";
|
|
7
8
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
8
9
|
export default function MedalSelector({
|
|
@@ -24,6 +25,9 @@ export default function MedalSelector({
|
|
|
24
25
|
case "bronze":
|
|
25
26
|
badge = /*#__PURE__*/_jsx(BronzeMedal, {});
|
|
26
27
|
break;
|
|
28
|
+
case "placeholder":
|
|
29
|
+
badge = /*#__PURE__*/_jsx(PlaceholderMedal, {});
|
|
30
|
+
break;
|
|
27
31
|
default:
|
|
28
32
|
badge = null;
|
|
29
33
|
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { useId } from 'react';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
const PlaceholderMedal = props => {
|
|
4
|
+
const uid = useId();
|
|
5
|
+
const filterId = `filter0_i_placeholder_${uid}`;
|
|
6
|
+
const mask0Id = `mask0_placeholder_${uid}`;
|
|
7
|
+
const mask1Id = `mask1_placeholder_${uid}`;
|
|
8
|
+
return /*#__PURE__*/_jsxs("svg", {
|
|
9
|
+
viewBox: "0 0 128 128",
|
|
10
|
+
fill: "none",
|
|
11
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
12
|
+
...props,
|
|
13
|
+
children: [/*#__PURE__*/_jsxs("g", {
|
|
14
|
+
filter: `url(#${filterId})`,
|
|
15
|
+
children: [/*#__PURE__*/_jsx("mask", {
|
|
16
|
+
id: mask0Id,
|
|
17
|
+
style: {
|
|
18
|
+
maskType: 'luminance'
|
|
19
|
+
},
|
|
20
|
+
maskUnits: "userSpaceOnUse",
|
|
21
|
+
x: "0",
|
|
22
|
+
y: "0",
|
|
23
|
+
width: "128",
|
|
24
|
+
height: "129",
|
|
25
|
+
children: /*#__PURE__*/_jsx("path", {
|
|
26
|
+
d: "M0 0H128V128.001H0V0Z",
|
|
27
|
+
fill: "white"
|
|
28
|
+
})
|
|
29
|
+
}), /*#__PURE__*/_jsxs("g", {
|
|
30
|
+
mask: `url(#${mask0Id})`,
|
|
31
|
+
children: [/*#__PURE__*/_jsx("mask", {
|
|
32
|
+
id: mask1Id,
|
|
33
|
+
style: {
|
|
34
|
+
maskType: 'luminance'
|
|
35
|
+
},
|
|
36
|
+
maskUnits: "userSpaceOnUse",
|
|
37
|
+
x: "0",
|
|
38
|
+
y: "0",
|
|
39
|
+
width: "128",
|
|
40
|
+
height: "129",
|
|
41
|
+
children: /*#__PURE__*/_jsx("path", {
|
|
42
|
+
d: "M64 0L73.0104 7.10949L83.7772 3.13275L90.1503 12.6778L101.619 12.2228L104.73 23.2709L115.777 26.3823L115.322 37.8508L124.868 44.2228L120.892 54.9896L128 64L120.892 73.0116L124.868 83.7772L115.322 90.1503L115.777 101.619L104.73 104.73L101.619 115.778L90.1503 115.323L83.7772 124.868L73.0104 120.892L64 128.001L54.9896 120.892L44.2228 124.868L37.8497 115.323L26.3812 115.778L23.2698 104.73L12.2228 101.619L12.6778 90.1503L3.13163 83.7772L7.10837 73.0116L0 64L7.10837 54.9896L3.13163 44.2228L12.6778 37.8508L12.2228 26.3823L23.2698 23.2709L26.3812 12.2228L37.8497 12.6778L44.2228 3.13275L54.9896 7.10949L64 0Z",
|
|
43
|
+
fill: "white"
|
|
44
|
+
})
|
|
45
|
+
}), /*#__PURE__*/_jsx("g", {
|
|
46
|
+
mask: `url(#${mask1Id})`,
|
|
47
|
+
children: /*#__PURE__*/_jsx("path", {
|
|
48
|
+
d: "M0 0V128.001H128V0H0Z",
|
|
49
|
+
fill: "#DCD9D9"
|
|
50
|
+
})
|
|
51
|
+
})]
|
|
52
|
+
})]
|
|
53
|
+
}), /*#__PURE__*/_jsx("defs", {
|
|
54
|
+
children: /*#__PURE__*/_jsxs("filter", {
|
|
55
|
+
id: filterId,
|
|
56
|
+
x: "0",
|
|
57
|
+
y: "-4",
|
|
58
|
+
width: "128",
|
|
59
|
+
height: "132.001",
|
|
60
|
+
filterUnits: "userSpaceOnUse",
|
|
61
|
+
colorInterpolationFilters: "sRGB",
|
|
62
|
+
children: [/*#__PURE__*/_jsx("feFlood", {
|
|
63
|
+
floodOpacity: "0",
|
|
64
|
+
result: "BackgroundImageFix"
|
|
65
|
+
}), /*#__PURE__*/_jsx("feBlend", {
|
|
66
|
+
mode: "normal",
|
|
67
|
+
in: "SourceGraphic",
|
|
68
|
+
in2: "BackgroundImageFix",
|
|
69
|
+
result: "shape"
|
|
70
|
+
}), /*#__PURE__*/_jsx("feColorMatrix", {
|
|
71
|
+
in: "SourceAlpha",
|
|
72
|
+
type: "matrix",
|
|
73
|
+
values: "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",
|
|
74
|
+
result: "hardAlpha"
|
|
75
|
+
}), /*#__PURE__*/_jsx("feOffset", {
|
|
76
|
+
dy: "-4"
|
|
77
|
+
}), /*#__PURE__*/_jsx("feGaussianBlur", {
|
|
78
|
+
stdDeviation: "2"
|
|
79
|
+
}), /*#__PURE__*/_jsx("feComposite", {
|
|
80
|
+
in2: "hardAlpha",
|
|
81
|
+
operator: "arithmetic",
|
|
82
|
+
k2: "-1",
|
|
83
|
+
k3: "1"
|
|
84
|
+
}), /*#__PURE__*/_jsx("feColorMatrix", {
|
|
85
|
+
type: "matrix",
|
|
86
|
+
values: "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"
|
|
87
|
+
}), /*#__PURE__*/_jsx("feBlend", {
|
|
88
|
+
mode: "normal",
|
|
89
|
+
in2: "shape",
|
|
90
|
+
result: "effect1_innerShadow_placeholder"
|
|
91
|
+
})]
|
|
92
|
+
})
|
|
93
|
+
})]
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
export default PlaceholderMedal;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<g filter="url(#filter0_i_504_34002)">
|
|
3
|
+
<mask id="mask0_504_34002" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="128" height="129">
|
|
4
|
+
<path d="M0 0H128V128.001H0V0Z" fill="white"/>
|
|
5
|
+
</mask>
|
|
6
|
+
<g mask="url(#mask0_504_34002)">
|
|
7
|
+
<mask id="mask1_504_34002" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="128" height="129">
|
|
8
|
+
<path d="M64 0L73.0104 7.10949L83.7772 3.13275L90.1503 12.6778L101.619 12.2228L104.73 23.2709L115.777 26.3823L115.322 37.8508L124.868 44.2228L120.892 54.9896L128 64L120.892 73.0116L124.868 83.7772L115.322 90.1503L115.777 101.619L104.73 104.73L101.619 115.778L90.1503 115.323L83.7772 124.868L73.0104 120.892L64 128.001L54.9896 120.892L44.2228 124.868L37.8497 115.323L26.3812 115.778L23.2698 104.73L12.2228 101.619L12.6778 90.1503L3.13163 83.7772L7.10837 73.0116L0 64L7.10837 54.9896L3.13163 44.2228L12.6778 37.8508L12.2228 26.3823L23.2698 23.2709L26.3812 12.2228L37.8497 12.6778L44.2228 3.13275L54.9896 7.10949L64 0Z" fill="white"/>
|
|
9
|
+
</mask>
|
|
10
|
+
<g mask="url(#mask1_504_34002)">
|
|
11
|
+
<path d="M0 0V128.001H128V0H0Z" fill="#DCD9D9"/>
|
|
12
|
+
</g>
|
|
13
|
+
</g>
|
|
14
|
+
</g>
|
|
15
|
+
<defs>
|
|
16
|
+
<filter id="filter0_i_504_34002" x="0" y="-4" width="128" height="132.001" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
17
|
+
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
|
18
|
+
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
|
19
|
+
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
|
20
|
+
<feOffset dy="-4"/>
|
|
21
|
+
<feGaussianBlur stdDeviation="2"/>
|
|
22
|
+
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
|
23
|
+
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
|
|
24
|
+
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_504_34002"/>
|
|
25
|
+
</filter>
|
|
26
|
+
</defs>
|
|
27
|
+
</svg>
|