From 808ec6315b8ed6006a2d8855a9ef56749967e892 Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Wed, 21 Jun 2023 14:54:22 +0100 Subject: [PATCH] Updated the Finish screen along with other tweaks --- .vscode/extensions.json | 3 +- package.json | 2 +- src/components/Exercises/FillBlanks.tsx | 3 +- src/components/Exercises/MatchSentences.tsx | 32 +-- src/components/Exercises/MultipleChoice.tsx | 3 +- src/components/Exercises/Speaking.tsx | 4 +- src/components/Exercises/WriteBlanks.tsx | 3 +- src/components/Exercises/Writing.tsx | 4 +- src/components/Medium/ModuleTitle.tsx | 17 +- src/components/Solutions/MatchSentences.tsx | 18 +- src/exams/Finish.tsx | 239 ++++++++++++++------ src/exams/Listening.tsx | 8 +- src/exams/Reading.tsx | 8 +- src/exams/Speaking.tsx | 8 +- src/exams/Writing.tsx | 8 +- src/interfaces/exam.ts | 1 + src/pages/exam.tsx | 39 +++- src/utils/score.ts | 12 +- tailwind.config.js | 8 +- yarn.lock | 51 ++--- 20 files changed, 313 insertions(+), 158 deletions(-) diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 8e8adf9e..fd1d9bf0 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,6 +1,5 @@ { "recommendations": [ - "arcanis.vscode-zipfs", "dbaeumer.vscode-eslint" ] -} +} \ No newline at end of file diff --git a/package.json b/package.json index a710638e..2de35684 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "axios": "^1.3.5", "chart.js": "^4.2.1", "clsx": "^1.2.1", - "daisyui": "^2.50.0", + "daisyui": "^3.1.5", "eslint": "8.33.0", "eslint-config-next": "13.1.6", "firebase": "9.19.1", diff --git a/src/components/Exercises/FillBlanks.tsx b/src/components/Exercises/FillBlanks.tsx index 2aae1609..d8ff1dff 100644 --- a/src/components/Exercises/FillBlanks.tsx +++ b/src/components/Exercises/FillBlanks.tsx @@ -88,8 +88,9 @@ export default function FillBlanks({ const calculateScore = () => { const total = text.match(/({{\d+}})/g)?.length || 0; const correct = answers.filter((x) => solutions.find((y) => x.id === y.id)?.solution === x.solution.toLowerCase() || false).length; + const missing = total - answers.filter((x) => solutions.find((y) => x.id === y.id)).length; - return {total, correct}; + return {total, correct, missing}; }; const renderLines = (line: string) => { diff --git a/src/components/Exercises/MatchSentences.tsx b/src/components/Exercises/MatchSentences.tsx index 1f2e9709..8220af51 100644 --- a/src/components/Exercises/MatchSentences.tsx +++ b/src/components/Exercises/MatchSentences.tsx @@ -6,6 +6,7 @@ import clsx from "clsx"; import {Fragment, useState} from "react"; import LineTo from "react-lineto"; import {CommonProps} from "."; +import Button from "../Low/Button"; export default function MatchSentences({id, options, type, prompt, sentences, userSolutions, onNext, onBack}: MatchSentencesExercise & CommonProps) { const [selectedQuestion, setSelectedQuestion] = useState(); @@ -14,8 +15,9 @@ export default function MatchSentences({id, options, type, prompt, sentences, us const calculateScore = () => { const total = sentences.length; const correct = answers.filter((x) => sentences.find((y) => y.id === x.question)?.solution === x.option || false).length; + const missing = total - answers.filter((x) => sentences.find((y) => y.id === x.question)).length; - return {total, correct}; + return {total, correct, missing}; }; const selectOption = (option: string) => { @@ -92,23 +94,21 @@ export default function MatchSentences({id, options, type, prompt, sentences, us -
- - + + +
); diff --git a/src/components/Exercises/MultipleChoice.tsx b/src/components/Exercises/MultipleChoice.tsx index 912d9c25..c66f506c 100644 --- a/src/components/Exercises/MultipleChoice.tsx +++ b/src/components/Exercises/MultipleChoice.tsx @@ -59,8 +59,9 @@ export default function MultipleChoice({id, prompt, type, questions, userSolutio const calculateScore = () => { const total = questions.length; const correct = answers.filter((x) => questions.find((y) => y.id === x.question)?.solution === x.option || false).length; + const missing = total - answers.filter((x) => questions.find((y) => y.id === x.question)).length; - return {total, correct}; + return {total, correct, missing}; }; const next = () => { diff --git a/src/components/Exercises/Speaking.tsx b/src/components/Exercises/Speaking.tsx index 38efc5fd..55b19322 100644 --- a/src/components/Exercises/Speaking.tsx +++ b/src/components/Exercises/Speaking.tsx @@ -180,14 +180,14 @@ export default function Speaking({id, title, text, type, prompts, onNext, onBack diff --git a/src/components/Exercises/WriteBlanks.tsx b/src/components/Exercises/WriteBlanks.tsx index 5763e5b9..e42d55a4 100644 --- a/src/components/Exercises/WriteBlanks.tsx +++ b/src/components/Exercises/WriteBlanks.tsx @@ -57,8 +57,9 @@ export default function WriteBlanks({id, prompt, type, maxWords, solutions, user ?.solution.map((y) => y.toLowerCase()) .includes(x.solution.toLowerCase()) || false, ).length; + const missing = total - answers.filter((x) => solutions.find((y) => x.id === y.id)).length; - return {total, correct}; + return {total, correct, missing}; }; const renderLines = (line: string) => { diff --git a/src/components/Exercises/Writing.tsx b/src/components/Exercises/Writing.tsx index 69dbf864..6d7222da 100644 --- a/src/components/Exercises/Writing.tsx +++ b/src/components/Exercises/Writing.tsx @@ -58,14 +58,14 @@ export default function Writing({id, prompt, info, type, wordCounter, attachment diff --git a/src/components/Medium/ModuleTitle.tsx b/src/components/Medium/ModuleTitle.tsx index 011dd0a6..e36a32f3 100644 --- a/src/components/Medium/ModuleTitle.tsx +++ b/src/components/Medium/ModuleTitle.tsx @@ -9,18 +9,21 @@ interface Props { module: Module; exerciseIndex: number; totalExercises: number; + disableTimer?: boolean; } -export default function ModuleTitle({minTimer, module, exerciseIndex, totalExercises}: Props) { +export default function ModuleTitle({minTimer, module, exerciseIndex, totalExercises, disableTimer = false}: Props) { const [timer, setTimer] = useState(minTimer * 60); useEffect(() => { - const timerInterval = setInterval(() => setTimer((prev) => prev - 1), 1000); + if (!disableTimer) { + const timerInterval = setInterval(() => setTimer((prev) => prev - 1), 1000); - return () => { - clearInterval(timerInterval); - }; - }, [minTimer]); + return () => { + clearInterval(timerInterval); + }; + } + }, [disableTimer, minTimer]); const moduleIcon: {[key in Module]: ReactNode} = { reading: , @@ -57,7 +60,7 @@ export default function ModuleTitle({minTimer, module, exerciseIndex, totalExerc Question {exerciseIndex}/{totalExercises} - + diff --git a/src/components/Solutions/MatchSentences.tsx b/src/components/Solutions/MatchSentences.tsx index a798efed..f37a8265 100644 --- a/src/components/Solutions/MatchSentences.tsx +++ b/src/components/Solutions/MatchSentences.tsx @@ -6,6 +6,7 @@ import {errorButtonStyle, infoButtonStyle} from "@/constants/buttonStyles"; import {mdiArrowLeft, mdiArrowRight} from "@mdi/js"; import Icon from "@mdi/react"; import {Fragment} from "react"; +import Button from "../Low/Button"; export default function MatchSentencesSolutions({options, prompt, sentences, userSolutions, onNext, onBack}: MatchSentencesExercise & CommonProps) { return ( @@ -63,19 +64,14 @@ export default function MatchSentencesSolutions({options, prompt, sentences, use -
- - + + +
); diff --git a/src/exams/Finish.tsx b/src/exams/Finish.tsx index f0770cc7..4c45aa82 100644 --- a/src/exams/Finish.tsx +++ b/src/exams/Finish.tsx @@ -1,92 +1,199 @@ -import ProfileLevel from "@/components/ProfileLevel"; -import {errorButtonStyle, infoButtonStyle} from "@/constants/buttonStyles"; +import Button from "@/components/Low/Button"; +import ModuleTitle from "@/components/Medium/ModuleTitle"; import {Module} from "@/interfaces"; import {User} from "@/interfaces/user"; -import {ICONS} from "@/resources/modules"; -import {mdiArrowLeft, mdiArrowRight} from "@mdi/js"; -import Icon from "@mdi/react"; +import useExamStore from "@/stores/examStore"; +import {calculateBandScore} from "@/utils/score"; import clsx from "clsx"; import Link from "next/link"; -import router from "next/router"; +import {useRouter} from "next/router"; +import {useEffect, useState} from "react"; +import {BsArrowCounterclockwise, BsBook, BsEyeFill, BsHeadphones, BsMegaphone, BsPen, BsShareFill} from "react-icons/bs"; + +interface Score { + module: Module; + correct: number; + total: number; + missing: number; +} interface Props { user: User; modules: Module[]; - scores: { - module?: Module; - correct: number; - total: number; - }[]; + scores: Score[]; onViewResults: () => void; } export default function Finish({user, scores, modules, onViewResults}: Props) { - const renderModuleScore = (module: Module) => { - const moduleScores = scores.filter((x) => x.module === module); - if (moduleScores.length === 0) { - return <>0; - } + const [selectedModule, setSelectedModule] = useState(modules[0]); + const [selectedScore, setSelectedScore] = useState(scores.find((x) => x.module === modules[0])!); - return moduleScores.map((x, index) => ( - - {x.correct} / {x.total} - - )); - }; + const exams = useExamStore((state) => state.exams); - const renderModuleTotal = (module: Module) => { - const moduleScores = scores.filter((x) => x.module === module); - if (moduleScores.length === 0) { - return <>0; - } + useEffect(() => setSelectedScore(scores.find((x) => x.module === selectedModule)!), [scores, selectedModule]); - const total = moduleScores.reduce((accumulator, current) => accumulator + current.total, 0); - const correct = moduleScores.reduce((accumulator, current) => accumulator + current.correct, 0); - - return ( - - {correct} / {total} | {Math.floor((correct / total) * 100)}% - - ); + const moduleColors: {[key in Module]: {progress: string; inner: string}} = { + reading: { + progress: "text-ielts-reading", + inner: "bg-ielts-reading-light", + }, + listening: { + progress: "text-ielts-listening", + inner: "bg-ielts-listening-light", + }, + writing: { + progress: "text-ielts-writing", + inner: "bg-ielts-writing-light", + }, + speaking: { + progress: "text-ielts-speaking", + inner: "bg-ielts-speaking-light", + }, }; return ( -
-
- -
-
- {modules.map((module) => ( + <> +
+ x.module === selectedModule)!.exercises.length} + exerciseIndex={exams.find((x) => x.module === selectedModule)!.exercises.length} + minTimer={exams.find((x) => x.module === selectedModule)!.minTimer} + disableTimer + /> +
+ {modules.includes("reading") && ( +
setSelectedModule("reading")} + className={clsx( + "flex gap-2 items-center rounded-xl p-4 cursor-pointer hover:shadow-lg transition duration-300 ease-in-out hover:bg-ielts-reading hover:text-white", + selectedModule === "reading" ? "bg-ielts-reading text-white" : "bg-mti-gray-smoke text-ielts-reading", + )}> + + Reading +
+ )} + {modules.includes("listening") && ( +
setSelectedModule("listening")} + className={clsx( + "flex gap-2 items-center rounded-xl p-4 cursor-pointer hover:shadow-lg transition duration-300 ease-in-out hover:bg-ielts-listening hover:text-white", + selectedModule === "listening" ? "bg-ielts-listening text-white" : "bg-mti-gray-smoke text-ielts-listening", + )}> + + Listening +
+ )} + {modules.includes("writing") && ( +
setSelectedModule("writing")} + className={clsx( + "flex gap-2 items-center rounded-xl p-4 cursor-pointer hover:shadow-lg transition duration-300 ease-in-out hover:bg-ielts-writing hover:text-white", + selectedModule === "writing" ? "bg-ielts-writing text-white" : "bg-mti-gray-smoke text-ielts-writing", + )}> + + Writing +
+ )} + {modules.includes("speaking") && ( +
setSelectedModule("speaking")} + className={clsx( + "flex gap-2 items-center rounded-xl p-4 cursor-pointer hover:shadow-lg transition duration-300 ease-in-out hover:bg-ielts-speaking hover:text-white", + selectedModule === "speaking" ? "bg-ielts-speaking text-white" : "bg-mti-gray-smoke text-ielts-speaking", + )}> + + Speaking +
+ )} +
+
+ + Congratulations on your exam performance! You achieved an impressive{" "} + + level {calculateBandScore(selectedScore.correct, selectedScore.total, selectedModule, user.focus)} + + , demonstrating excellent mastery of the assessed knowledge. +
+
+ If you disagree with the result, you can request a review by a qualified teacher. We are committed to the accuracy and + transparency of the results. Please contact us for further information. +
+
+ Congratulations again on your outstanding achievement! We are here to support you on your academic journey. +
+
+
-
- - {module.toUpperCase()} -
-
{renderModuleScore(module)}
-
TOTAL: {renderModuleTotal(module)}
+ className={clsx( + "w-48 h-48 rounded-full flex flex-col items-center justify-center", + moduleColors[selectedModule].inner, + )}> + Level + + {calculateBandScore(selectedScore.correct, selectedScore.total, selectedModule, user.focus)} +
- ))} -
-
- - - - +
+
+
+ {selectedScore.total.toString().padStart(2, "0")} + Correct +
+
+
+
+
+ + {(selectedScore.total - selectedScore.correct).toString().padStart(2, "0")} + + Wrong +
+
+
-
-
+ + +
+
+
+ + Play Again +
+
+ + Review Answers +
+
+ + + + +
+ ); } diff --git a/src/exams/Listening.tsx b/src/exams/Listening.tsx index 59c73d3e..36847401 100644 --- a/src/exams/Listening.tsx +++ b/src/exams/Listening.tsx @@ -80,7 +80,13 @@ export default function Listening({exam, showSolutions = false, onFinish}: Props return ( <>
- + {exerciseIndex === -1 && renderAudioPlayer()} {exerciseIndex > -1 && exerciseIndex < exam.exercises.length && diff --git a/src/exams/Reading.tsx b/src/exams/Reading.tsx index 6b852488..0fc9b4f0 100644 --- a/src/exams/Reading.tsx +++ b/src/exams/Reading.tsx @@ -142,7 +142,13 @@ export default function Reading({exam, showSolutions = false, onFinish}: Props) <>
setShowTextModal(false)} /> - + {exerciseIndex === -1 && renderText()} {exerciseIndex > -1 && exerciseIndex < exam.exercises.length && diff --git a/src/exams/Speaking.tsx b/src/exams/Speaking.tsx index 7d037a55..72240116 100644 --- a/src/exams/Speaking.tsx +++ b/src/exams/Speaking.tsx @@ -59,7 +59,13 @@ export default function Speaking({exam, showSolutions = false, onFinish}: Props) return ( <>
- + {exerciseIndex > -1 && exerciseIndex < exam.exercises.length && !showSolutions && diff --git a/src/exams/Writing.tsx b/src/exams/Writing.tsx index 894aabcf..d56b3b3e 100644 --- a/src/exams/Writing.tsx +++ b/src/exams/Writing.tsx @@ -59,7 +59,13 @@ export default function Writing({exam, showSolutions = false, onFinish}: Props) return ( <>
- + {exerciseIndex > -1 && exerciseIndex < exam.exercises.length && !showSolutions && diff --git a/src/interfaces/exam.ts b/src/interfaces/exam.ts index 3720d07e..fca13565 100644 --- a/src/interfaces/exam.ts +++ b/src/interfaces/exam.ts @@ -35,6 +35,7 @@ export interface UserSolution { score: { correct: number; total: number; + missing: number; }; exercise: string; } diff --git a/src/pages/exam.tsx b/src/pages/exam.tsx index 3262b1ae..b03e6a7c 100644 --- a/src/pages/exam.tsx +++ b/src/pages/exam.tsx @@ -148,6 +148,43 @@ export default function Page() { setModuleIndex((prev) => prev + 1); }; + const aggregateScoresByModule = (answers: UserSolution[]): {module: Module; total: number; missing: number; correct: number}[] => { + const scores: {[key in Module]: {total: number; missing: number; correct: number}} = { + reading: { + total: 0, + correct: 0, + missing: 0, + }, + listening: { + total: 0, + correct: 0, + missing: 0, + }, + writing: { + total: 0, + correct: 0, + missing: 0, + }, + speaking: { + total: 0, + correct: 0, + missing: 0, + }, + }; + + answers.forEach((x) => { + scores[x.module!] = { + total: scores[x.module!].total + x.score.total, + correct: scores[x.module!].correct + x.score.correct, + missing: scores[x.module!].missing + x.score.missing, + }; + }); + + return Object.keys(scores) + .filter((x) => scores[x as Module].total > 0) + .map((x) => ({module: x as Module, ...scores[x as Module]})); + }; + const renderScreen = () => { if (selectedModules.length === 0) { return ; @@ -163,7 +200,7 @@ export default function Page() { setModuleIndex(0); setExam(exams[0]); }} - scores={userSolutions.map((x) => ({...x.score, module: x.module}))} + scores={aggregateScoresByModule(userSolutions)} /> ); } diff --git a/src/utils/score.ts b/src/utils/score.ts index c7fd92e3..e9e90ccd 100644 --- a/src/utils/score.ts +++ b/src/utils/score.ts @@ -36,7 +36,7 @@ const academicMarking: {[key: number]: number} = { 10: 2.5, }; -const moduleMarkings: {[key in "reading" | "listening"]: {[key in Type]: {[key: number]: number}}} = { +const moduleMarkings: {[key in Module]: {[key in Type]: {[key: number]: number}}} = { reading: { academic: academicMarking, general: readingGeneralMarking, @@ -45,9 +45,17 @@ const moduleMarkings: {[key in "reading" | "listening"]: {[key in Type]: {[key: academic: academicMarking, general: academicMarking, }, + writing: { + academic: academicMarking, + general: readingGeneralMarking, + }, + speaking: { + academic: academicMarking, + general: academicMarking, + }, }; -export const calculateBandScore = (correct: number, total: number, module: "reading" | "listening", type: Type) => { +export const calculateBandScore = (correct: number, total: number, module: Module, type: Type) => { const marking = moduleMarkings[module][type]; const percentage = (correct * 100) / total; diff --git a/tailwind.config.js b/tailwind.config.js index 3acd9603..e50594bf 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -22,10 +22,10 @@ module.exports = { black: "#353338", }, ielts: { - reading: {DEFAULT: "#1EB3FF", transparent: "rgba(255, 99, 132, 0.5)"}, - listening: {DEFAULT: "#FF790A", transparent: "rgba(54, 162, 235, 0.5)"}, - writing: {DEFAULT: "#3D9F11", transparent: "rgba(255, 206, 86, 0.5)"}, - speaking: {DEFAULT: "#EF5DA8", transparent: "rgba(75, 192, 192, 0.5)"}, + reading: {DEFAULT: "#1EB3FF", light: "#F0F9FF", transparent: "rgba(255, 99, 132, 0.5)"}, + listening: {DEFAULT: "#FF790A", light: "#FFF1E5", transparent: "rgba(54, 162, 235, 0.5)"}, + writing: {DEFAULT: "#3D9F11", light: "#E8FCDF", transparent: "rgba(255, 206, 86, 0.5)"}, + speaking: {DEFAULT: "#EF5DA8", light: "#FEF6FA", transparent: "rgba(75, 192, 192, 0.5)"}, }, }, }, diff --git a/yarn.lock b/yarn.lock index d75a39e0..6d8c1b37 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1338,26 +1338,15 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@^1.0.0, color-name@~1.1.4: +color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^4.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" - integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== - dependencies: - color-convert "^2.0.1" - color-string "^1.9.0" +colord@^2.9: + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== combined-stream@^1.0.8: version "1.0.8" @@ -1390,7 +1379,7 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -css-selector-tokenizer@^0.8.0: +css-selector-tokenizer@^0.8: version "0.8.0" resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz#88267ef6238e64f2215ea2764b3e2cf498b845dd" integrity sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg== @@ -1408,14 +1397,14 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== -daisyui@^2.50.0: - version "2.52.0" - resolved "https://registry.yarnpkg.com/daisyui/-/daisyui-2.52.0.tgz#1e22abd655bf4a5cb466e1a1f264bb597e9ec254" - integrity sha512-LQTA5/IVXAJHBMFoeaEMfd7/akAFPPcdQPR3O9fzzcFiczneJFM73CFPnScmW2sOgn/D83cvkP854ep2T9OfTg== +daisyui@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/daisyui/-/daisyui-3.1.5.tgz#49cb961d03504beebd238d58f0169dbe81103c95" + integrity sha512-3nk5L//IU31ISzsonKEFG8ris8hS/MRAc+PrOTOyRbssjv1fYmNKSdIrOhG6op2ED3RyJL4p6I81JUwd7RWqTw== dependencies: - color "^4.2" - css-selector-tokenizer "^0.8.0" - postcss-js "^4.0.0" + colord "^2.9" + css-selector-tokenizer "^0.8" + postcss-js "^4" tailwindcss "^3" damerau-levenshtein@^1.0.8: @@ -2323,11 +2312,6 @@ is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: get-intrinsic "^1.2.0" is-typed-array "^1.1.10" -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -2962,7 +2946,7 @@ postcss-import@^15.1.0: read-cache "^1.0.0" resolve "^1.1.7" -postcss-js@^4.0.0, postcss-js@^4.0.1: +postcss-js@^4, postcss-js@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== @@ -3360,13 +3344,6 @@ signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"