diff --git a/package.json b/package.json index 6c1dc36c..a8dba06f 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "moment": "^2.29.4", "moment-timezone": "^0.5.32", "react": "^17.0.2", + "react-confetti-explosion": "^2.1.2", "react-datepicker": "1.3.0", "react-dates": "^18.2.2", "react-dom": "^17.0.2", diff --git a/src/components/includes/WrappedCountdown.tsx b/src/components/includes/WrappedCountdown.tsx new file mode 100644 index 00000000..c8009d44 --- /dev/null +++ b/src/components/includes/WrappedCountdown.tsx @@ -0,0 +1,119 @@ +import React, { useState, useEffect } from "react"; +import "../../styles/WrappedCountdown.scss"; +import ConfettiExplosion from "react-confetti-explosion"; +import cone from "../../media/wrapped/cone.svg"; +import ribbonBall from "../../media/wrapped/ribbonBall.svg"; + +type WrappedDate = { + launchDate: Date; + startDate: Date; +}; +type RemainingTime = { + days: number; + hours: number; + minutes: number; + total: number +}; +// Declare interface to takes in the setter setDisplayWrapped as a prop +interface WrappedCountdownProps { + setDisplayWrapped: React.Dispatch>; // Define prop type for setter + wrappedDate: WrappedDate; +} +const WrappedCountdown: React.FC = ({ setDisplayWrapped, wrappedDate }) => { + const handleButtonClick = () => { + // Call the setter function to change the state in the parent + setDisplayWrapped(true); // Set to true to show the modal + }; + // Helper function to calculate the remaining time in days, hours, and minutes from start date to launch date + const calculateTimeRemaining = (dateProps: WrappedDate): RemainingTime => { + // Calculate the time remaining (in milliseconds) between the launch date and start date + const time = dateProps.launchDate.getTime() - new Date().getTime(); + const gap = time < 0 ? 0 : time; + // Calculate days, hours, and minutes remaining + const days = Math.floor(gap / (1000 * 60 * 60 * 24)); + const hours = Math.floor((gap / (1000 * 60 * 60)) % 24); + const minutes = Math.floor((gap / (1000 * 60)) % 60); + return { days, hours, minutes, total: gap }; + }; + // Initialize countdown state using the calculateTimeRemaining function + const [timeRemaining, setTimeRemaining] = useState(calculateTimeRemaining(wrappedDate)); + const [countDownClicked, setCountDownClicked] = useState(false); + const [confettiShown, setConfettiShown] = useState(false); + const [isZeroCounter, setIsZeroCounter] = useState(false); + + // Countdown timer effect + useEffect(() => { + const updatedTime = calculateTimeRemaining(wrappedDate); + setTimeRemaining(updatedTime); + + // Stop countdown and set `isZeroCounter` when time reaches zero + if (updatedTime.total <= 0) { + setIsZeroCounter(true); + } + }, [wrappedDate, timeRemaining]); + + // Trigger confetti with a delay only the first time `isZeroCounter` becomes true + useEffect(() => { + if (isZeroCounter && !confettiShown) { + setTimeout(() => { + setConfettiShown(true); // Show confetti after a delay + }, 1000); // Delay of 1 second + } + }, [isZeroCounter, confettiShown]); + + // Prepend the days, hours, and minutes if they're single digits + const prependZero = (num: number): string => (num < 10 ? `0${num}` : `${num}`); + + // Check that today is the start date or dates after the start date, then render the countdown if true + const isStartDate = () => { + const today = new Date(); + // To get the Date object with respect to Eastern Time, we must offset + return today.getTime() >= wrappedDate.startDate.getTime(); + }; + + return !isStartDate() ? null : countDownClicked ? ( +
setCountDownClicked(false)}> +
+
+ {!isZeroCounter ? ( + <> +
+
{prependZero(timeRemaining.days)}
+

DAYS

+
+
+
{prependZero(timeRemaining.hours)}
+

HOURS

+
+
+
{prependZero(timeRemaining.minutes)}
+

MINUTES

+
+
+

Queue Me In

+

WRAPPED

+
+ + ) : ( +
+
+
+

Queue Me In

+

WRAPPED

+
+
+ View Now +
+
+ {!confettiShown && } + icon +
+ )} +
+
+
+ ) : ( + icon setCountDownClicked(true)} /> + ); +}; +export default WrappedCountdown; diff --git a/src/components/pages/SplitView.tsx b/src/components/pages/SplitView.tsx index e6dab335..56d5287b 100644 --- a/src/components/pages/SplitView.tsx +++ b/src/components/pages/SplitView.tsx @@ -15,12 +15,14 @@ import TopBar from "../includes/TopBar"; import CalendarExportModal from "../includes/CalendarExportModal"; import { RootState } from "../../redux/store"; import { updateCourse, updateSession } from "../../redux/actions/course"; -import Browser from '../../media/browser.svg'; -import smsNotif from '../../media/smsNotif.svg' -import { addBanner } from '../../redux/actions/announcements'; -import Banner from '../includes/Banner'; -import FeedbackPrompt from '../includes/FeedbackPrompt'; -import Wrapped from '../includes/Wrapped'; +import Browser from "../../media/browser.svg"; +import smsNotif from "../../media/smsNotif.svg"; +import { addBanner } from "../../redux/actions/announcements"; +import Banner from "../includes/Banner"; +import FeedbackPrompt from "../includes/FeedbackPrompt"; +import Wrapped from "../includes/Wrapped"; +import WrappedCountdown from "../includes/WrappedCountdown"; +import { WRAPPED_START_DATE, WRAPPED_LAUNCH_DATE } from "../../constants"; // Also update in the main LESS file const MOBILE_BREAKPOINT = 920; @@ -115,7 +117,7 @@ const SplitView = ({ }, [courseHook, updateCourse]); useEffect(() => { updateSession(sessionHook); - }, [sessionHook, updateSession]) + }, [sessionHook, updateSession]); useEffect(() => { if (user && user.wrapped) { @@ -123,7 +125,7 @@ const SplitView = ({ } else { setDisplayWrapped(false); } - }, [user]) + }, [user]); // Handle browser back button history.listen((location) => { @@ -194,6 +196,9 @@ const SplitView = ({ } }, [addBanner, user]); + const start = new Date(WRAPPED_START_DATE); + const launch = new Date(WRAPPED_LAUNCH_DATE); + return ( <> @@ -258,8 +263,8 @@ const SplitView = ({
- Please make sure to enable browser notifications in your system - settings. + Please make sure to enable browser notifications in your system + settings.
)} @@ -270,6 +275,10 @@ const SplitView = ({ ))} + {displayFeedbackPrompt ? ( ) : null} - {displayWrapped ? ( - setDisplayWrapped(false)} /> - ) : null} + {displayWrapped ? setDisplayWrapped(false)} /> : null} ); }; diff --git a/src/constants.ts b/src/constants.ts index 5ae1c534..e5a74043 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -4,3 +4,7 @@ export const ALL_SEMESTERS = ['SP20', 'FA20', 'SP21', 'FA21', 'SP22', 'FA22', export const START_DATE = '2024-08-19' export const END_DATE = '2024-12-20' + +// These are the start date and launch date for QMI Wrap for the current semester +export const WRAPPED_START_DATE = "2024-11-12T00:00:00"; +export const WRAPPED_LAUNCH_DATE = "2024-11-22T00:00:00"; diff --git a/src/media/wrapped/cone.svg b/src/media/wrapped/cone.svg new file mode 100644 index 00000000..ecce8cbf --- /dev/null +++ b/src/media/wrapped/cone.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/media/wrapped/ribbonBall.svg b/src/media/wrapped/ribbonBall.svg new file mode 100644 index 00000000..f3149101 --- /dev/null +++ b/src/media/wrapped/ribbonBall.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/styles/WrappedCountdown.scss b/src/styles/WrappedCountdown.scss new file mode 100644 index 00000000..f8e92bb3 --- /dev/null +++ b/src/styles/WrappedCountdown.scss @@ -0,0 +1,128 @@ +.countdownUpdates { + position: fixed; + bottom: 35px; + right: 41px; +} +.countdownContainer { + padding: 20px; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 413px; + height: 139px; + border-radius: 12px; + background: linear-gradient(63deg, #668ae9 16.65%, #6db9ea 83.35%); /* Gradient background */ +} +.countdownContainer_boxes { + color: #5599db; + font-family: Roboto; + font-size: 50px; + font-style: normal; + font-weight: 400; + line-height: normal; + justify-content: center; + align-items: center; + text-align: center; + display: flex; + width: 63px; + height: 76px; + border-radius: 5px; + background: #fff; +} +.textContainer { + align-items: center; +} + +.ribbonBall { + position: fixed; + bottom: 36px; + right: 46.23px; + width: 68px; + height: 68px; + border-width: 100px; + cursor: pointer; + animation: rotation 1.3s ease-in-out infinite; +} + +@keyframes rotation { + + 0% { + transform: rotate(15deg); + } + 15% { + transform: rotate(-15deg); + } + 25% { + transform: rotate(0deg); + } +} + +.top { + margin: 0; + color: #fff; + font-family: Roboto; + font-size: 24.079px; + font-style: normal; + font-weight: 700; + line-height: normal; +} +.bottom { + margin: 0; + font-family: Roboto; + font-size: 24.079px; + font-style: normal; + font-weight: 400; + line-height: normal; + background: linear-gradient(180deg, #fff 0%, #fff 100%); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} +.counter_sub { + margin-top: 10px; + color: #fff; + font-family: Roboto; + font-size: 12px; + font-style: normal; + font-weight: 500; + line-height: normal; + letter-spacing: -0.6px; +} +.viewWrap { + cursor: pointer; + margin-top: 7px; + width: 154.619px; + height: 37.669px; + border-radius: 5px; + background: #fff; + color: #5599db; + font-family: Roboto; + font-size: 20px; + font-style: normal; + font-weight: 500; + line-height: normal; + display: flex; + justify-content: center; + align-items: center; + text-align: center; +} + +.post { + display: flex; + flex-direction: column; +} + +.cone { + z-index:10; + margin-top: 40px; + margin-right: 25px; +} + +.launch{ + margin-left: 20px; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} diff --git a/yarn.lock b/yarn.lock index 29f80a4c..8070096e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1644,6 +1644,13 @@ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b" integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== +"@emotion/is-prop-valid@^0.7.3": + version "0.7.3" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz#a6bf4fa5387cbba59d44e698a4680f481a8da6cc" + integrity sha512-uxJqm/sqwXw3YPA5GXX365OBcJGFtxUVkB6WyezqFHlNe9jqUWH5ur2O2M8dGBz61kn1g3ZBlzUunFQXQIClhA== + dependencies: + "@emotion/memoize" "0.7.1" + "@emotion/is-prop-valid@^1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.3.0.tgz#bd84ba972195e8a2d42462387581560ef780e4e2" @@ -1651,6 +1658,11 @@ dependencies: "@emotion/memoize" "^0.9.0" +"@emotion/memoize@0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.1.tgz#e93c13942592cf5ef01aa8297444dc192beee52f" + integrity sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg== + "@emotion/memoize@^0.8.1": version "0.8.1" resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" @@ -6168,6 +6180,15 @@ css-in-js-utils@^2.0.0: hyphenate-style-name "^1.0.2" isobject "^3.0.1" +css-jss@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/css-jss/-/css-jss-10.10.0.tgz#bd51fbd255cc24597ac0f0f32368394794d37ef3" + integrity sha512-YyMIS/LsSKEGXEaVJdjonWe18p4vXLo8CMA4FrW/kcaEyqdIGKCFXao31gbJddXEdIxSXFFURWrenBJPlKTgAA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "^10.10.0" + jss-preset-default "^10.10.0" + css-loader@3.4.2: version "3.4.2" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202" @@ -9417,7 +9438,7 @@ hoist-non-react-statics@^2.3.1: resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== -hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.2.1, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: +hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.2.0, hoist-non-react-statics@^3.2.1, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -11206,6 +11227,15 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" +jss-plugin-camel-case@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz#27ea159bab67eb4837fa0260204eb7925d4daa1c" + integrity sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw== + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "10.10.0" + jss-plugin-camel-case@^10.5.1: version "10.9.0" resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.9.0.tgz#4921b568b38d893f39736ee8c4c5f1c64670aaf7" @@ -11215,6 +11245,23 @@ jss-plugin-camel-case@^10.5.1: hyphenate-style-name "^1.0.3" jss "10.9.0" +jss-plugin-compose@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-compose/-/jss-plugin-compose-10.10.0.tgz#00d7a79adf7fcfe4927a792febdf0deceb0a7cd2" + integrity sha512-F5kgtWpI2XfZ3Z8eP78tZEYFdgTIbpA/TMuX3a8vwrNolYtN1N4qJR/Ob0LAsqIwCMLojtxN7c7Oo/+Vz6THow== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-default-unit@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz#db3925cf6a07f8e1dd459549d9c8aadff9804293" + integrity sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + jss-plugin-default-unit@^10.5.1: version "10.9.0" resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.9.0.tgz#bb23a48f075bc0ce852b4b4d3f7582bc002df991" @@ -11223,6 +11270,31 @@ jss-plugin-default-unit@^10.5.1: "@babel/runtime" "^7.3.1" jss "10.9.0" +jss-plugin-expand@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-expand/-/jss-plugin-expand-10.10.0.tgz#5debd80554174ca2d9b9e38d85d4cb6f3e0393ab" + integrity sha512-ymT62W2OyDxBxr7A6JR87vVX9vTq2ep5jZLIdUSusfBIEENLdkkc0lL/Xaq8W9s3opUq7R0sZQpzRWELrfVYzA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-extend@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-extend/-/jss-plugin-extend-10.10.0.tgz#94eb450847a8941777e77ea4533a579c1c578430" + integrity sha512-sKYrcMfr4xxigmIwqTjxNcHwXJIfvhvjTNxF+Tbc1NmNdyspGW47Ey6sGH8BcQ4FFQhLXctpWCQSpDwdNmXSwg== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-global@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz#1c55d3c35821fab67a538a38918292fc9c567efd" + integrity sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + jss-plugin-global@^10.5.1: version "10.9.0" resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.9.0.tgz#fc07a0086ac97aca174e37edb480b69277f3931f" @@ -11231,6 +11303,15 @@ jss-plugin-global@^10.5.1: "@babel/runtime" "^7.3.1" jss "10.9.0" +jss-plugin-nested@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz#db872ed8925688806e77f1fc87f6e62264513219" + integrity sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + jss-plugin-nested@^10.5.1: version "10.9.0" resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.9.0.tgz#cc1c7d63ad542c3ccc6e2c66c8328c6b6b00f4b3" @@ -11240,6 +11321,14 @@ jss-plugin-nested@^10.5.1: jss "10.9.0" tiny-warning "^1.0.2" +jss-plugin-props-sort@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz#67f4dd4c70830c126f4ec49b4b37ccddb680a5d7" + integrity sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + jss-plugin-props-sort@^10.5.1: version "10.9.0" resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.9.0.tgz#30e9567ef9479043feb6e5e59db09b4de687c47d" @@ -11248,6 +11337,15 @@ jss-plugin-props-sort@^10.5.1: "@babel/runtime" "^7.3.1" jss "10.9.0" +jss-plugin-rule-value-function@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz#7d99e3229e78a3712f78ba50ab342e881d26a24b" + integrity sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + jss-plugin-rule-value-function@^10.5.1: version "10.9.0" resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.9.0.tgz#379fd2732c0746fe45168011fe25544c1a295d67" @@ -11257,6 +11355,33 @@ jss-plugin-rule-value-function@^10.5.1: jss "10.9.0" tiny-warning "^1.0.2" +jss-plugin-rule-value-observable@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-observable/-/jss-plugin-rule-value-observable-10.10.0.tgz#d17b28c4401156bbe4cd0c4a73a80aad70613e8b" + integrity sha512-ZLMaYrR3QE+vD7nl3oNXuj79VZl9Kp8/u6A1IbTPDcuOu8b56cFdWRZNZ0vNr8jHewooEeq2doy8Oxtymr2ZPA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + symbol-observable "^1.2.0" + +jss-plugin-template@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-template/-/jss-plugin-template-10.10.0.tgz#072cda74a94c91b02d3a895d9e2408fd978ce033" + integrity sha512-ocXZBIOJOA+jISPdsgkTs8wwpK6UbsvtZK5JI7VUggTD6LWKbtoxUzadd2TpfF+lEtlhUmMsCkTRNkITdPKa6w== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz#c01428ef5a89f2b128ec0af87a314d0c767931c7" + integrity sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg== + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.8" + jss "10.10.0" + jss-plugin-vendor-prefixer@^10.5.1: version "10.9.0" resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.9.0.tgz#aa9df98abfb3f75f7ed59a3ec50a5452461a206a" @@ -11266,6 +11391,36 @@ jss-plugin-vendor-prefixer@^10.5.1: css-vendor "^2.0.8" jss "10.9.0" +jss-preset-default@10.10.0, jss-preset-default@^10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-preset-default/-/jss-preset-default-10.10.0.tgz#c8209449a0f6d232526c2ba3a3a6ec69ee97e023" + integrity sha512-GL175Wt2FGhjE+f+Y3aWh+JioL06/QWFgZp53CbNNq6ZkVU0TDplD8Bxm9KnkotAYn3FlplNqoW5CjyLXcoJ7Q== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + jss-plugin-camel-case "10.10.0" + jss-plugin-compose "10.10.0" + jss-plugin-default-unit "10.10.0" + jss-plugin-expand "10.10.0" + jss-plugin-extend "10.10.0" + jss-plugin-global "10.10.0" + jss-plugin-nested "10.10.0" + jss-plugin-props-sort "10.10.0" + jss-plugin-rule-value-function "10.10.0" + jss-plugin-rule-value-observable "10.10.0" + jss-plugin-template "10.10.0" + jss-plugin-vendor-prefixer "10.10.0" + +jss@10.10.0, jss@^10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss/-/jss-10.10.0.tgz#a75cc85b0108c7ac8c7b7d296c520a3e4fbc6ccc" + integrity sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw== + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^3.0.2" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + jss@10.9.0, jss@^10.5.1: version "10.9.0" resolved "https://registry.yarnpkg.com/jss/-/jss-10.9.0.tgz#7583ee2cdc904a83c872ba695d1baab4b59c141b" @@ -14618,6 +14773,14 @@ react-app-polyfill@^1.0.6: regenerator-runtime "^0.13.3" whatwg-fetch "^3.0.0" +react-confetti-explosion@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/react-confetti-explosion/-/react-confetti-explosion-2.1.2.tgz#dfbccf28985ce6938143ceb1023b9facfb0a5835" + integrity sha512-4UzDFBajAGXmF9TSJoRMO2QOBCIXc66idTxH8l7Mkul48HLGtk+tMzK9HYDYsy7Zmw5sEGchi2fbn4AJUuLrZw== + dependencies: + lodash "^4.17.21" + react-jss "^10.9.2" + react-datepicker@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/react-datepicker/-/react-datepicker-1.3.0.tgz#200978cf25c4736f97df4ccab9693e167466bf3a" @@ -14678,6 +14841,11 @@ react-dev-utils@^10.2.1: strip-ansi "6.0.0" text-table "0.2.0" +react-display-name@^0.2.4: + version "0.2.5" + resolved "https://registry.yarnpkg.com/react-display-name/-/react-display-name-0.2.5.tgz#304c7cbfb59ee40389d436e1a822c17fe27936c6" + integrity sha512-I+vcaK9t4+kypiSgaiVWAipqHRXYmZIuAiS8vzFvXHHXVigg/sMKwlRgLy6LH2i3rmP+0Vzfl5lFsFRwF1r3pg== + react-dom@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" @@ -14721,6 +14889,23 @@ react-is@^18.2.0, react-is@^18.3.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== +react-jss@^10.9.2: + version "10.10.0" + resolved "https://registry.yarnpkg.com/react-jss/-/react-jss-10.10.0.tgz#d08ab3257b0eed01e15d6d8275840055c279b0da" + integrity sha512-WLiq84UYWqNBF6579/uprcIUnM1TSywYq6AIjKTTTG5ziJl9Uy+pwuvpN3apuyVwflMbD60PraeTKT7uWH9XEQ== + dependencies: + "@babel/runtime" "^7.3.1" + "@emotion/is-prop-valid" "^0.7.3" + css-jss "10.10.0" + hoist-non-react-statics "^3.2.0" + is-in-browser "^1.1.3" + jss "10.10.0" + jss-preset-default "10.10.0" + prop-types "^15.6.0" + shallow-equal "^1.2.0" + theming "^3.3.0" + tiny-warning "^1.0.2" + react-lifecycles-compat@^3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" @@ -15958,6 +16143,11 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" +shallow-equal@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da" + integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA== + shallowequal@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" @@ -16455,7 +16645,7 @@ string-length@^3.1.0: astral-regex "^1.0.0" strip-ansi "^5.2.0" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -16481,6 +16671,15 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -16557,7 +16756,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -16592,6 +16791,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -16753,7 +16959,7 @@ svgo@^1.0.0, svgo@^1.2.2: unquote "~1.1.1" util.promisify "~1.0.0" -symbol-observable@^1.0.4: +symbol-observable@^1.0.4, symbol-observable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== @@ -16892,6 +17098,16 @@ text-table@0.2.0, text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +theming@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/theming/-/theming-3.3.0.tgz#dacabf04aa689edde35f1e1c117ec6de73fbf870" + integrity sha512-u6l4qTJRDaWZsqa8JugaNt7Xd8PPl9+gonZaIe28vAhqgHMIG/DOyFPqiKN/gQLQYj05tHv+YQdNILL4zoiAVA== + dependencies: + hoist-non-react-statics "^3.3.0" + prop-types "^15.5.8" + react-display-name "^0.2.4" + tiny-warning "^1.0.2" + throat@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" @@ -18119,7 +18335,7 @@ workerpool@6.1.0: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -18146,6 +18362,15 @@ wrap-ansi@^6.0.1: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"