diff --git a/fest-web-client b/fest-web-client index df5cc5c..5439d23 160000 --- a/fest-web-client +++ b/fest-web-client @@ -1 +1 @@ -Subproject commit df5cc5c73ca7e703da5583c2e844f19016f5be6d +Subproject commit 5439d23b31df32dc490e8166587d7eb6ccc77e4f diff --git a/next.config.js b/next.config.js index 7c86232..0267330 100644 --- a/next.config.js +++ b/next.config.js @@ -1,6 +1,9 @@ /** @type {import('next').NextConfig} */ const nextConfig = { basePath: '', + images: { + domains: ['localhost'], + }, }; export default nextConfig; diff --git a/package.json b/package.json index c87898d..2af6c91 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,9 @@ "version": "0.1.0", "private": true, "type": "module", + "workspaces": [ + "fest-web-client/*" + ], "scripts": { "dev": "next dev", "build": "next build", @@ -12,6 +15,7 @@ "format": "prettier --write 'src/**/*.{ts,tsx,css,json}' --config ./.prettierrc" }, "dependencies": { + "axios": "^1.6.2", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.1", "framer-motion": "^10.16.4", @@ -19,6 +23,7 @@ "react": "^18", "react-dom": "^18", "react-full-page": "^0.1.12", + "react-markdown": "^9.0.1", "swiper": "^11.0.4" }, "devDependencies": { diff --git a/public/auth-callback.html b/public/auth-callback.html new file mode 100644 index 0000000..a0db2e4 --- /dev/null +++ b/public/auth-callback.html @@ -0,0 +1,131 @@ + + + + + + + Delta Inductions | LOGIN REDIRECT + + + + + + + +
+
+ + + +

Redirecting back to the main site...

+
+
+ + + + \ No newline at end of file diff --git a/src/app/clusters/clusters.module.css b/src/app/clusters/clusters.module.css new file mode 100644 index 0000000..79d07a9 --- /dev/null +++ b/src/app/clusters/clusters.module.css @@ -0,0 +1,88 @@ +.clusterBG { + background: url('../../assets/images/ClusterBG.png'); + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} + +.portal{ + width: 30rem; + position: absolute; + top: 5rem; + animation: portalAnim 0.3s; +} + +@keyframes portalAnim { + 0%{ + top: -1rem; + opacity: 0; + } + 100%{ + top: 5rem; + opacity: 1; + } +} + +.title{ + margin-top: 7rem; +} + +.hourglass{ + width: 8rem; +} + +.textBox{ + min-width: 13rem; + position: absolute; + bottom: 3rem; + left: 50%; + transform: translateX(-50%); + animation: fadeIn 0.3s; + transition: 0.3s; +} + +@keyframes fadeIn { + 0%{ + opacity: 0; + } + 100%{ + opacity: 1; + } +} + +.clusterName{ + font-family: 'Orbitron'; + z-index: 100; + position: absolute; + font-size: 1.4rem; + bottom: 4rem; + left: 50%; + transform: translateX(-50%); + transition: 0.3s; +} + +.cover:hover > div .clusterName { + font-size: 1.5rem; + text-shadow: 1px 1px 30px white; + bottom: 4.5rem; +} + +.cover:hover > div .textBox { + min-width: 15rem; + bottom: 3.3rem; +} + +@media only screen and (max-width: 992px) { + .cover{ + transform: scale(0.7); + } + .portal{ + width: 15rem; + left: 50%; + transform: translateX(-50%); + margin-top: 2rem; + } + .hourCover{ + padding-right: 10rem; + } + } \ No newline at end of file diff --git a/src/app/clusters/page.tsx b/src/app/clusters/page.tsx new file mode 100644 index 0000000..5df131f --- /dev/null +++ b/src/app/clusters/page.tsx @@ -0,0 +1,196 @@ +/* eslint-disable */ + +'use client'; +import { NavBar } from '@/components'; +import Image from 'next/image'; +import styles from './clusters.module.css'; +import portal from '@/assets/images/Portal.png'; +import hourglassBlue from '@/assets/images/HourGlass_blue.svg'; +import hourglassYellow from '@/assets/images/HourGlass_yellow.svg'; +import textBox from '@/assets/images/clusterTextBox.png'; +import { motion } from 'framer-motion'; +import React, { useEffect, useState } from 'react'; +import { useRouter } from 'next/navigation'; +import { getClusterNames } from '@/utils/events_cms'; + +const Clusters = () => { + const router = useRouter(); + const [isHovering, setIsHovered] = useState(-1); + const onMouseEnter = (id: number) => setIsHovered(id); + const onMouseLeave = () => setIsHovered(-1); + const [position, setPositon] = useState([ + { x: '20%', y: '45%', opacity: 1 }, + { x: '35%', y: '50%', opacity: 1 }, + { x: '55%', y: '50%', opacity: 1 }, + { x: '70%', y: '45%', opacity: 1 }, + { x: '30%', y: '70%', opacity: 1 }, + { x: '45%', y: '75%', opacity: 1 }, + { x: '60%', y: '70%', opacity: 1 }, + ]); + const [positionMobile, setPositonMobile] = useState([ + { x: '10%', y: '35%', opacity: 1 }, + { x: '60%', y: '35%', opacity: 1 }, + { x: '10%', y: '50%', opacity: 1 }, + { x: '60%', y: '50%', opacity: 1 }, + { x: '10%', y: '65%', opacity: 1 }, + { x: '60%', y: '65%', opacity: 1 }, + { x: '35%', y: '80%', opacity: 1 }, + ]); + + //@ts-ignore + const [details, setDetails] = useState([]); + + const getDetails = async () => { + let res = await getClusterNames(); + setDetails(res); + }; + + useEffect(() => { + getDetails(); + }, []); + + return ( +
+
+ +
+ +
+ +

+ CLUSTERS +

+ portal +
+
+ {position.map((e, ind) => ( + { + onMouseEnter(ind); + }} + transition={{ delay: 0.2 + ind * 0.1 }} + onClick={() => { + const dummy = [...position]; + dummy[ind] = { x: '45%', y: '30%', opacity: 0 }; + setPositon(dummy); + setTimeout(() => { + router.push( + `/eventcluster/${ + details.length > ind ? details[ind].id : 0 + }/${details.length > ind ? details[ind].name : ''}`, + ); + }, 1000); + }} + initial={{ left: '45%', opacity: 0 }} + animate={{ left: e.x, top: e.y, opacity: e.opacity }} + style={{ position: 'absolute' }} + className={styles.cover} + > + + textBox +

+ {details.length > ind ? details[ind].name : 'ROBOREX'} +

+
+ + {isHovering == ind ? ( + portal + ) : ( + portal + )} +
+ ))} +
+
+ {positionMobile.map((e, ind) => ( + { + onMouseEnter(ind); + }} + transition={{ delay: 0.2 + ind * 0.1 }} + onClick={() => { + const dummy = [...positionMobile]; + dummy[ind] = { x: '45%', y: '30%', opacity: 0 }; + setPositonMobile(dummy); + setTimeout(() => { + router.push( + `/eventcluster/${ + details.length > ind ? details[ind].id : 0 + }/${details.length > ind ? details[ind].name : ''}`, + ); + }, 1000); + }} + initial={{ left: '45%', opacity: 0 }} + animate={{ left: e.x, top: e.y, opacity: e.opacity }} + style={{ position: 'absolute' }} + className={styles.cover} + > + + textBox +

+ {details.length > ind ? details[ind].name : 'ROBOREX'} +

+
+ + {isHovering == ind ? ( + portal + ) : ( + portal + )} +
+ ))} +
+
+
+ ); +}; + +export default Clusters; diff --git a/src/app/eventcluster/page.tsx b/src/app/eventcluster/[event]/[name]/page.tsx similarity index 74% rename from src/app/eventcluster/page.tsx rename to src/app/eventcluster/[event]/[name]/page.tsx index 462abf4..5ec6161 100644 --- a/src/app/eventcluster/page.tsx +++ b/src/app/eventcluster/[event]/[name]/page.tsx @@ -1,10 +1,11 @@ +'use client'; import { ClusterCarousel, NavBar } from '@/components'; import Back from '@/assets/images/Back.png'; import BackEnlarge from '@/assets/images/BackEnlarge.png'; import ImageChanger from '@/components/BackButton/back'; -import styles from './eventcluster.module.css'; +import styles from '../../eventcluster.module.css'; -const events = () => { +const events = ({ params }: { params: { event: number; name: string } }) => { return (
@@ -12,10 +13,10 @@ const events = () => {

- CLUSTER NAME + {params.name.replace('%20', ' ')}

- +
); diff --git a/src/app/events/[clusterId]/[name]/[eventId]/page.tsx b/src/app/events/[clusterId]/[name]/[eventId]/page.tsx new file mode 100644 index 0000000..279b95f --- /dev/null +++ b/src/app/events/[clusterId]/[name]/[eventId]/page.tsx @@ -0,0 +1,26 @@ +'use client'; +import { NavBar } from '@/components'; +import Back from '@/assets/images/Back.png'; +import BackEnlarge from '@/assets/images/BackEnlarge.png'; +import ImageChanger from '@/components/BackButton/back'; +import Carousel from '@/components/Carousel/carousel'; +import styles from '../../../carousel.module.css'; + +const events = ({ params }: { params: { clusterId: number; name: string; eventId: number } }) => { + return ( +
+ + +

+ {params.name.replace('%20', ' ')} +

+
+ +
+
+ ); +}; + +export default events; diff --git a/src/app/events/page.tsx b/src/app/events/page.tsx deleted file mode 100644 index ee31995..0000000 --- a/src/app/events/page.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { NavBar } from '@/components'; -import Back from '@/assets/images/Back.png'; -import BackEnlarge from '@/assets/images/BackEnlarge.png'; -import ImageChanger from '@/components/BackButton/back'; -import Carousel from '@/components/Carousel/carousel'; -import styles from './carousel.module.css'; - -const events = () => { - return ( -
- - -

- CLUSTER NAME -

-
- -
-
- ); -}; - -export default events; diff --git a/src/app/gallery/page.tsx b/src/app/gallery/page.tsx index 3d6d535..c313272 100644 --- a/src/app/gallery/page.tsx +++ b/src/app/gallery/page.tsx @@ -9,11 +9,23 @@ import 'swiper/css/bundle'; import { NavBar, SideBar } from '@/components'; import Image from 'next/image'; import virat from '../../assets/images/virat.jpg'; -import { WheelEvent, TouchEvent, useState, useRef } from 'react'; +import { WheelEvent, TouchEvent, useState, useRef, useEffect } from 'react'; import { useRouter } from 'next/navigation'; +import { getGallery } from '@/utils/events_cms'; +import { CMS_URL } from '@/config/config'; const History = () => { - const slides = [1, 2, 3, 4, 5, 6, 7, 8, 9]; + const [images, setImages] = useState([]); + + const getImages = async () => { + const res = await getGallery(); + setImages(res); + }; + + useEffect(() => { + getImages(); + }, []); + const breakpoints = { 100: { slidesPerView: 1, @@ -129,23 +141,35 @@ const History = () => { breakpoints={breakpoints} className="h-[100%] w-[100%]" > - {slides.map(slide => ( - - history - - ))} + {images.map( + ( + data: { url: number; eventId: number; eventName: string }, + ind: number, + ) => ( + + { + router.push( + `/eventcluster/${data ? data.eventId : 0}/${ + data ? data.eventName : '' + }`, + ); + }} + objectFit="cover" + objectPosition="center" + className={ + 'max-sm:rounded-xl md:opacity-60 ' + 'carousel-torch' + } + alt="history" + /> + + ), + )} diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx new file mode 100644 index 0000000..269bb22 --- /dev/null +++ b/src/app/login/page.tsx @@ -0,0 +1,9 @@ +'use client'; + +import { AuthLayout } from '@/components'; + +const AuthPage = () => { + return ; +}; + +export default AuthPage; diff --git a/src/assets/images/ClusterBG.png b/src/assets/images/ClusterBG.png new file mode 100644 index 0000000..3b973a9 Binary files /dev/null and b/src/assets/images/ClusterBG.png differ diff --git a/src/assets/images/HourGlass_blue.svg b/src/assets/images/HourGlass_blue.svg new file mode 100644 index 0000000..d5c6dbe --- /dev/null +++ b/src/assets/images/HourGlass_blue.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/HourGlass_yellow.svg b/src/assets/images/HourGlass_yellow.svg new file mode 100644 index 0000000..5a1fa2c --- /dev/null +++ b/src/assets/images/HourGlass_yellow.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/Keyboard arrow right.svg b/src/assets/images/Keyboard arrow right.svg new file mode 100644 index 0000000..131f66e --- /dev/null +++ b/src/assets/images/Keyboard arrow right.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/images/Portal.png b/src/assets/images/Portal.png new file mode 100644 index 0000000..4fa75b5 Binary files /dev/null and b/src/assets/images/Portal.png differ diff --git a/src/assets/images/arrow_back_auth.svg b/src/assets/images/arrow_back_auth.svg new file mode 100644 index 0000000..f0ed780 --- /dev/null +++ b/src/assets/images/arrow_back_auth.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/images/auth-bg-vert.svg b/src/assets/images/auth-bg-vert.svg new file mode 100644 index 0000000..fe8428f --- /dev/null +++ b/src/assets/images/auth-bg-vert.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/auth-bg.svg b/src/assets/images/auth-bg.svg new file mode 100644 index 0000000..d84ce76 --- /dev/null +++ b/src/assets/images/auth-bg.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/button-bg.svg b/src/assets/images/button-bg.svg new file mode 100644 index 0000000..f002318 --- /dev/null +++ b/src/assets/images/button-bg.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/images/clusterTextBox.png b/src/assets/images/clusterTextBox.png new file mode 100644 index 0000000..665eb31 Binary files /dev/null and b/src/assets/images/clusterTextBox.png differ diff --git a/src/assets/images/sandclock_textbox.svg b/src/assets/images/sandclock_textbox.svg new file mode 100644 index 0000000..30a4e6d --- /dev/null +++ b/src/assets/images/sandclock_textbox.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/AboutCard/AboutCard.tsx b/src/components/AboutCard/AboutCard.tsx index d8db967..ddc3f23 100644 --- a/src/components/AboutCard/AboutCard.tsx +++ b/src/components/AboutCard/AboutCard.tsx @@ -1,8 +1,8 @@ import React from 'react'; import AboutContent from './AboutContent.json'; -const AboutCard: React.FC = ({ cardRef }) => { - const content = AboutContent.content; +const AboutCard = () => { + const content = AboutContent.content + AboutContent.content2; return (
= ({ formType }) => { + const [form, setForm] = React.useState(formType); + return ( +
+
+
+ + Arrow Left + Home + +
+ Pragyan Logo +
+
+
+
+
+
+ SYSTEM{' '} + + {form === 'LOGIN' ? 'LOGIN' : 'SIGN UP'} + +
+
+
+
+ {form === 'LOGIN' ? ( + + ) : ( + + )} +
+
+
+
+
+
+ ); +}; + +export default AuthLayout; diff --git a/src/components/AuthLayout/form.module.css b/src/components/AuthLayout/form.module.css new file mode 100644 index 0000000..e4a9783 --- /dev/null +++ b/src/components/AuthLayout/form.module.css @@ -0,0 +1,258 @@ +.formContainer { + width: fit-content; + color: #cacac9; + width: 100%; + max-width: 50%; + display: flex; + justify-content: center; + flex-direction: column; + align-items: center; + background-image: url('../../assets/images/auth-bg.svg'); + background-size: 100% 100%; + padding: 6rem; + font-family: 'Orbitron', sans-serif; + min-height: 70%; +} + +.signupFields { + margin-bottom: 0.5rem !important; +} + + +.signUpFormContainer { + padding-top: 2rem; + padding-bottom: 2rem; +} + +.formFields { + display: flex; + flex-direction: column; + width: 100%; + justify-content: center; + align-items: center; +} + +.formField { + width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + margin-bottom: 8%; +} + +.formField:last-child { + margin-bottom: 3%; +} + +.formLabel { + font-size: 1rem; + margin-bottom: 0.5rem; +} + +.formInputBorder { + clip-path: polygon(0 0, 100% 0, 100% 70%, 98% 90%, 2% 90%, 0% 70%); + height: calc(2.5rem + 2px); + width: calc(100%); + background-color: #95f2ff; +} + +.formInput { + background-color: black; + background-image: linear-gradient(180deg, rgba(36, 49, 51, 0) 18%, #55797e 154%); + height: 2.5rem; + width: 100%; + color: #a3a4a3; + padding: 0rem 1rem; + clip-path: polygon(0 0, 100% 0, 100% 70%, 98% 90%, 2% 90%, 0% 70%); +} + +.formRadioInputs { + display: flex; + align-items: center; + justify-content: space-around; + margin-top: 0.5rem; +} + +.formRadioInput { + display: flex; + align-items: center; +} + +.formRadioInput > label { + margin-right: 0.5rem; +} + +div.formInput { + display: flex; + align-items: center; + font-size: 0.8rem; + height: 2rem; +} + +.formInput:focus { + outline: none; +} + +.disabledInput { + background: #4b4b4b; + border-left: 1rem solid #2a2a2a; + border-right: 1rem solid #2a2a2a; +} + +.formFieldExtras { + width: 100%; + display: flex; + flex-direction: row; + justify-content: space-between; + color: #eaeaea; + margin-bottom: 10%; +} + +.forgotPassword { + font-size: 0.8rem; + font-weight: 700; + display: inline; +} + +.forgotPassword > div { + margin-top: 5px; +} + +.forgotPassword > div:hover { + cursor: pointer; + text-decoration: underline; +} + +.formPageNav { + display: flex; + align-items: center; +} + +.formPageNavArrow:hover { + cursor: pointer; + filter: brightness(1.2); +} + +.formPageNavArrowLeft { + transform: rotate(180deg); + margin-right: 0.8rem; +} + +.formFieldSubmitContainer { + display: flex; + flex-direction: row; + justify-content: space-between; + width: 100%; +} + +.newHere { + color: #eaeaea; + font-size: 0.7rem; + margin-right: 5px; +} + +.authRedirect { + color: #6cbace; + font-weight: 600; + width: fit-content; + font-family: 'ROG'; +} + +.authRedirect:hover { + cursor: pointer; + text-decoration: underline; +} + +.buttonContainer { + width: 100%; + display: flex; + justify-content: space-between; +} + +.submitButton { + border: none; + background: url('../../assets/images/button-bg.svg'); + background-size: 100% 100%; + color: #cacac9; + font-size: 1rem; + font-weight: 600; + height: 2.2rem; + width: 50%; +} + +.submitButton:hover { + cursor: pointer; +} + +.signUpButton { + height: 2rem; +} + +.resetFormContainer { + display: flex; + flex-direction: column; + color: #cacac9; + padding: 2.5rem; + border: 1px solid #e8333b80; + margin: 1px; +} + +.registerButton { + background-color: transparent; + border: none; + background: url('../../assets/images/button-bg.svg'); + background-size: 100% 100%; + position: relative; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + margin-top: 1rem; + color: #cacac9; + font-size: 1.1rem; + padding: 0.8rem 0.8rem; + font-weight: 600; +} + +@media screen and (max-width: 1300px) { + .formContainer { + max-width: 80%; + } +} + +@media screen and (max-width: 850px) { + .formContainer { + max-width: 100%; + } + .resetFormContainer { + padding: 1rem; + } +} + +@media screen and (max-width: 500px) { + .formContainer { + background: url('../../assets/images/auth-bg-vert.svg'); + background-size: 100% 100%; + padding: 4.5rem; + } + .formLabel { + font-size: 0.85rem; + } + .resetFormContainer { + margin: 1.5rem; + } + .buttonContainer { + flex-direction: column; + gap: 1rem; + align-items: center; + } + .submitButton { + width: 100%; + } +} + +@media screen and (max-width: 500px) { + .registerFormContainer { + max-width: 80%; + } +} diff --git a/src/components/AuthLayout/input.tsx b/src/components/AuthLayout/input.tsx new file mode 100644 index 0000000..a2ee596 --- /dev/null +++ b/src/components/AuthLayout/input.tsx @@ -0,0 +1,52 @@ +import styles from './form.module.css'; + +export function FormInput({ + onChange, + name, + inputClassName, + wrapperClassName, + label, + inputType, +}: FormProps) { + return ( +
+
{label}
+
+ +
+
+ ); +} + +export function FormSelect({ + onChange, + initialValue, + inputClassName, + wrapperClassName, + label, + options, +}: FormProps) { + return ( +
+
{label}
+
+ +
+
+ ); +} diff --git a/src/components/AuthLayout/login.tsx b/src/components/AuthLayout/login.tsx new file mode 100644 index 0000000..629cb59 --- /dev/null +++ b/src/components/AuthLayout/login.tsx @@ -0,0 +1,306 @@ +/* eslint-disable */ +'use client'; + +import React from 'react'; +// import Modal from "react-modal"; +import styles from './form.module.css'; +// import DAuthLogin from '@/utils/dauthlogin'; +// import { Recaptcha } from "../../ReCaptcha"; +// import DAuthLogin from "../../DauthLogin/DauthLogin"; +import { FormInput } from './input'; +import Link from 'next/link'; +import { useCallback, useState, useContext } from 'react'; +import { UserApi } from '../../../fest-web-client/client/src'; +import { authConfig } from '@/utils/ApiConfig'; +import { useRouter } from 'next/navigation'; +import { userContext } from '@/contexts/UserContext'; +import { DAUTH_CLIENT_ID, DAUTH_REDIRECT_URI, API_URL } from '@/config/config'; + +enum AuthStatusEnum { + PRE, + START, + WAITING, + ACCEPTED, + REJECTED, + AUTH, + ERROR, +} + +export const Login: React.FC = ({ setForm }) => { + const [loginForm, setLoginForm] = React.useState({ + userEmail: '', + userPassword: '', + }); + + const isMobile = false; + + const userApi = new UserApi(authConfig); + const [authStatus, setAuthStatus] = useState(AuthStatusEnum.PRE); + const { setuserID, setIsLoggedIn } = useContext(userContext); + + const router = useRouter(); + + const generateDauthAuthorizeUrl = () => { + const dauthAuthorizeURL = new URL('https://auth.delta.nitt.edu/authorize'); + + const dauthQueryParameters = { + client_id: DAUTH_CLIENT_ID, + redirect_uri: DAUTH_REDIRECT_URI, + response_type: 'code', + state: 'code', + grant_type: 'authorization_code', + scope: 'email+openid+profile+user', + nonce: '', + }; + + const appendQueryParametersToURL = (url: URL, queryParams: Object) => { + Object.keys(queryParams).forEach(query => { + url.searchParams.append(query, (queryParams as any)[query]); + }); + }; + + appendQueryParametersToURL(dauthAuthorizeURL, dauthQueryParameters); + + return dauthAuthorizeURL; + }; + + const sendAuthCodeToServer = useCallback(async (code: string) => { + try { + setAuthStatus(AuthStatusEnum.WAITING); + //backend url + const authApi = new UserApi(authConfig); + authApi + .dAuthUserLogin(code) + .then(res => console.log(res)) + .catch(e => console.log(e)); + } catch (err) { + console.log(err); + setAuthStatus(AuthStatusEnum.ERROR); + } + }, []); + + const handleLogin = useCallback(() => { + try { + setAuthStatus(AuthStatusEnum.WAITING); + //backend url + console.log(loginForm); + + const authApi = new UserApi(authConfig); + authApi + .authUserLogin({ + user_email: loginForm.userEmail, + user_password: loginForm.userPassword, + }) + .then(res => { + console.log('successfully logged In'); + }) + .catch(e => console.log(e)); + } catch (err) { + console.log(err); + setAuthStatus(AuthStatusEnum.ERROR); + } + }, [loginForm]); + + const BASE_URL = typeof window !== 'undefined' ? window.location.origin : null; + + const receiveMessage = useCallback( + async (event: MessageEvent) => { + if (event.origin !== BASE_URL) { + return; + } + const { data } = event; + if (data.source === 'dauth-login-callback') { + if (!data.code) { + setAuthStatus(AuthStatusEnum.REJECTED); + } else { + setAuthStatus(AuthStatusEnum.ACCEPTED); + sendAuthCodeToServer(data.code); + } + } + }, + [BASE_URL, sendAuthCodeToServer], + ); + + const [windowObjectReference, setWindowObjectReference] = useState(null); + const [previousUrl, setPreviousUrl] = useState(null); + + const openSignInWindow = useCallback( + (url: string, name: string) => { + window.removeEventListener('message', receiveMessage); + + const strWindowFeatures = isMobile + ? '_blank' + : 'toolbar=no, menubar=no, width=600, height=700, top=100, left=100'; + + if (windowObjectReference === null || windowObjectReference.closed) { + setWindowObjectReference(window.open(url, name, strWindowFeatures)); + } else if (previousUrl !== url) { + setWindowObjectReference(window.open(url, name, strWindowFeatures)); + windowObjectReference?.focus(); + } else { + windowObjectReference.focus(); + } + setAuthStatus(AuthStatusEnum.WAITING); + + window.addEventListener('message', receiveMessage, false); + + setPreviousUrl(url); + }, + [previousUrl, receiveMessage, windowObjectReference], + ); + + const generateDauthStringAndOpenUrl = useCallback(() => { + const dauthURL = generateDauthAuthorizeUrl(); + openSignInWindow(dauthURL.toString(), 'dauthURL'); + setAuthStatus(AuthStatusEnum.START); + }, [openSignInWindow]); + + // const [modalIsOpen, setIsOpen] = React.useState(false); + // const [forgotPasswordEmail, setForgotPasswordEmail] = React.useState(""); + // const [forgotPasswordRecaptcha, setForgotPasswordRecaptcha] = + // React.useState(""); + + // const handleRecaptcha = (_: string, value: string) => { + // setForgotPasswordRecaptcha(value); + // }; + + //const router = useRouter(); + + const handleFormChange = (field: string, value: string) => { + setLoginForm({ ...loginForm, [field]: value }); + }; + + // const handleForgotPassword = () => { + // if (!forgotPasswordRecaptcha) { + // // TODO: customErrorToast("Please verify that you are not a robot"); + // return; + // } + // fetch(`${BACKEND_URL}/auth/sendPasswordResetLink`, { + // method: "POST", + // headers: { + // "Content-Type": "application/json", + // }, + // body: JSON.stringify({ + // email: forgotPasswordEmail, + // recaptcha_code: forgotPasswordRecaptcha, + // }), + // }) + // .then((res) => res.json()) + // .then((data) => { + // if (data.status_code === 200) { + // customSuccessToast( + // "Password reset link sent to your email" + // ); + // setForgotPasswordEmail(""); + // } else customErrorToast(data.message); + // setIsOpen(false); + // }); + // }; + + const handleFormSubmit = () => { + console.log(loginForm.userPassword); + if (!loginForm.userPassword) console.log('Please enter your password'); + else { + handleLogin(); + } + }; + + return ( + <> +
+
+ {/*
+
EMAIL *
+ { + handleFormChange("user_email", e.target.value); + }} + /> +
*/} + { + handleFormChange('userEmail', e.target.value); + }} + /> + { + handleFormChange('userPassword', e.target.value); + }} + /> +
+ {loginForm.userEmail} + {loginForm.userPassword} +
+
setIsOpen(true)} + > +
Forgot Password?
+
+
+ New Here? +
{ + setForm('SIGN UP'); + }} + > + Sign Up +
+
+
+
+
+ + +
+
+
{/* */}
+
+ {/* setIsOpen(false)} + ariaHideApp={false} + > +
+
+
+
Email*
+ { + setForgotPasswordEmail(e.target.value); + }} + /> +
+
+ +
+
+ +
+
*/} + + ); +}; diff --git a/src/components/AuthLayout/signup.tsx b/src/components/AuthLayout/signup.tsx new file mode 100644 index 0000000..782f748 --- /dev/null +++ b/src/components/AuthLayout/signup.tsx @@ -0,0 +1,468 @@ +/* eslint-disable */ +import React from 'react'; +import styles from './form.module.css'; +import Image from 'next/image'; +// import { customErrorToast, customSuccessToast } from "../../Toaster"; +import ArrowSolid from '@/assets/images/Keyboard arrow right.svg'; +// import { Recaptcha } from "../../ReCaptcha"; +// import { API_URL } from '@/config/config'; +import { FormInput, FormSelect } from './input'; +import { authConfig } from '@/utils/ApiConfig'; +import { UserApi } from '../../../fest-web-client/client/src'; + +export const SignUp: React.FC = ({ setForm }) => { + const userApi = new UserApi(authConfig); + const [formPage, setFormPage] = React.useState(1); + const [colleges, setColleges] = React.useState([]); + const [confirmPassword, setConfirmPassword] = React.useState(''); + const [registerForm, setRegisterForm] = React.useState({ + userName: 'username', + userEmail: '', + userFullName: '', + userPassword: '', + userSex: 'MALE', + userNationality: '', + userAddress: '', + userPincode: '', + userState: '', + userPhno: '', + userDegree: 'BTech', + userYear: 2020, + userCollege: 'NIT TRICHY', + userOtherCollege: '', + userCity: '', + userReferralCode: '', + userSponsor: 'no', + recaptcha_code: '', + is_app: 0, + }); + + React.useEffect(() => { + if (colleges && colleges.length > 0) return; + const fetchColleges = async () => { + // const response = await fetch(`${API_URL}/colleges`); + // if (response.ok) { + // const data = await response.json(); + // if (!Array.isArray(data.message)) { + // // customErrorToast("Error fetching college list"); + // } else { + // data.message = [{ id: 0, college_name: 'Other' }].concat(data.message); + // setColleges(data.message); + // setRegisterForm(form => ({ + // ...form, + // userCollege: data.message[0].college_name, + // })); + // } + // } else { + // // customErrorToast( + // // "Error connecting to the backend :( Check your connection and refresh the page" + // // ); + // } + }; + fetchColleges(); + }, [colleges]); + + const handleFormFields = (field: string, value: string): void => { + setRegisterForm(form => ({ ...form, [field]: value })); + }; + + const handleFormSubmit = (): void => { + // if (registerForm.recaptcha_code === '') { + // // customErrorToast("Please verify that you are not a robot"); + // return; + // } + console.log('submitting'); + userApi + .authUserRegister({ + user_name: registerForm.userName, + user_othercollege: registerForm.userCollege, + user_referral_code: registerForm.userReferralCode, + user_password: registerForm.userPassword, + user_email: registerForm.userEmail, + user_fullname: registerForm.userFullName, + user_sex: registerForm.userSex, + user_nationality: registerForm.userNationality, + user_address: registerForm.userAddress, + user_pincode: registerForm.userPincode, + user_state: registerForm.userState, + user_city: registerForm.userCity, + user_phone: registerForm.userPhno, + user_degree: registerForm.userDegree, + user_year: registerForm.userYear, + user_college: registerForm.userCollege, + }) + .then(res => console.log(res)) + .catch(e => console.log(e)); + // fetch(`${API_URL}/user/register`, { + // method: 'POST', + // headers: { + // 'Content-Type': 'application/json', + // }, + // body: JSON.stringify(registerForm), + // }) + // .then(res => res.json()) + // .then(data => { + // if (data.status_code === 200) { + // // customSuccessToast( + // // "Successfully created an account. Login with the given credentials" + // // ); + // setForm('LOGIN'); + // } else { + // // customErrorToast(data.message); + // } + // }); + // .catch(() => + // customErrorToast( + // "Registration failed :( Check your network connection and try again" + // ) + // ); + }; + + const validateFormPage = (page: number): void => { + switch (page) { + case 1: + // if ( + // !registerForm.userEmail || + // !registerForm.userEmail.match( + // /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/, + // ) + // ) { + // // customErrorToast("Please enter a valid email address"); + // break; + // } else if (!registerForm.userPassword || registerForm.userPassword.length < 8) { + // // customErrorToast( + // // "Password must be atleast 8 characters long" + // // ); + // break; + // } else if (registerForm.userPassword !== confirmPassword) { + // // customErrorToast("Passwords do not match"); + // break; + // } + setFormPage(2); + break; + case 2: + // if (!registerForm.userEmail) { + // // customErrorToast("Please enter a username"); + // break; + // } else if (!registerForm.userFullName) { + // // customErrorToast("Please enter your full name"); + // break; + // } else if ( + // !registerForm.userPhno || + // !/^\+?(0|[1-9]\d*)$/.test(registerForm.userPhno) + // ) { + // // customErrorToast("Please enter a valid phone number"); + // break; + // } + setFormPage(3); + break; + case 3: + // if (registerForm.userCollege === 'Other' && !registerForm.userOtherCollege) { + // // customErrorToast("Please enter your college name"); + // break; + // } + // if (registerForm.userCollege !== 'Other') { + // setRegisterForm(form => ({ + // ...form, + // userOtherCollege: '', + // })); + // } + setFormPage(4); + break; + case 4: + // if (!registerForm.userNationality) { + // // customErrorToast("Please enter your country"); + // break; + // } + setFormPage(5); + break; + case 5: + // if (!registerForm.userState) { + // // customErrorToast("Please enter your state"); + // break; + // } else if (!registerForm.userCity) { + // // customErrorToast("Please enter your city"); + // break; + // } else if (!registerForm.userAddress) { + // // customErrorToast("Please enter your address"); + // break; + // } + setFormPage(6); + break; + case 6: + // if ( + // !registerForm.userPincode || + // !/^\+?(0|[1-9]\d*)$/.test(registerForm.userPincode) + // ) { + // // customErrorToast("Please enter a valid pincode"); + // break; + // } + setFormPage(7); + default: + break; + } + }; + + // TODO:(P4) Change all form input to FormInput component + return ( +
+
+ {formPage === 1 && ( + <> + { + handleFormFields('userEmail', e.target.value); + }} + /> + { + handleFormFields('userPassword', e.target.value); + }} + /> + { + setConfirmPassword(e.target.value); + }} + /> + + )} + {formPage === 2 && ( + <> + { + handleFormFields('userEmail', e.target.value); + }} + /> + { + handleFormFields('userFullName', e.target.value); + }} + /> + { + handleFormFields('userPhno', e.target.value); + }} + /> + + )} + {formPage === 3 && ( + <> + { + handleFormFields('userSex', e.target.value); + }} + /> + college.college_name) + : ['NIT Trichy'] + } + wrapperClassName={styles.signupFields} + onChange={e => { + handleFormFields('userEmail', e.target.value); + }} + /> + { + handleFormFields('userCollege', e.target.value); + }} + /> + + )} + {formPage === 4 && ( + <> + { + handleFormFields('userDegree', e.target.value); + }} + /> + { + handleFormFields('userYear', e.target.value); + }} + /> + { + handleFormFields('userNationality', e.target.value); + }} + /> + + )} + {formPage === 5 && ( + <> + { + handleFormFields('userState', e.target.value); + }} + /> + { + handleFormFields('userCity', e.target.value); + }} + /> + { + handleFormFields('userAddress', e.target.value); + }} + /> + + )} + {formPage === 6 && ( + <> + { + handleFormFields('userPincode', e.target.value); + }} + /> + { + handleFormFields('userReferralCode', e.target.value); + }} + /> + + )} + {formPage === 7 && ( + <> + { + handleFormFields('user_voucher_name', e.target.value); + }} + /> + {/* */} +
Bro Captch Bro
+ + )} +
+
+
+
+ {formPage === 1 && ( + <> + Already have an account? + setForm('LOGIN')}> + Sign In + + + )} + {formPage === 7 && ( +
+ +
+ )} +
+
+ {formPage > 1 && ( + Navigation Arrow Right setFormPage(formPage - 1)} + /> + )} + {formPage < 7 && ( + Navigation Arrow Right validateFormPage(formPage)} + /> + )} +
+
+
+ ); +}; diff --git a/src/components/AuthLayout/type.d.ts b/src/components/AuthLayout/type.d.ts new file mode 100644 index 0000000..a2ba068 --- /dev/null +++ b/src/components/AuthLayout/type.d.ts @@ -0,0 +1,64 @@ +/* eslint-disable */ + +interface AuthLayoutProps { + formType: 'LOGIN' | 'SIGN UP'; +} + +type FormType = 'LOGIN' | 'SIGN UP'; + +interface SignupFormProps { + setForm: (form: FormType) => void; +} + +interface FormProps { + onChange?: React.ChangeEventHandler; + name?: string; + inputClassName?: string; + wrapperClassName?: string; + label: string; + inputType?: string; + options?: string[]; + initialValue?: string; +} + +interface LoginFormRequest { + userEmail: string; + userPassword: string; +} + +interface RegisterFormType { + userName: string; + userEmail: string; + userFullName: string; + userPassword: string; + userSex: string; + userNationality: string; + userAddress: string; + userPincode: string; + userState: string; + userPhno: string; + userDegree: string; + userYear: number; + userCollege: string; + userOtherCollege?: string; + userCity: string; + userSponsor?: string; + userVoucherName?: string; + userReferralCode?: string; + recaptcha_code?: string; + is_app?: number; +} + +interface College { + id: number; + college_name: string; +} + +interface LoginFormType { + user_email: string; + user_pass: string; +} + +interface ReCaptchaState { + handleFormFields: (field: string, value: string) => void; +} diff --git a/src/components/BackButton/back.tsx b/src/components/BackButton/back.tsx index 6c60497..fd8c714 100644 --- a/src/components/BackButton/back.tsx +++ b/src/components/BackButton/back.tsx @@ -3,24 +3,29 @@ import { useState } from 'react'; import Image, { StaticImageData } from 'next/image'; import styles from '../../app/events/carousel.module.css'; +import { useRouter } from 'next/navigation'; interface ImageChangerProps { - defaultImage: StaticImageData; - hoverImage: StaticImageData; + defaultImage: StaticImageData; + hoverImage: StaticImageData; } const ImageChanger = (props: ImageChangerProps) => { - const [isHovered, setIsHovered] = useState(false); + const [isHovered, setIsHovered] = useState(false); + const router = useRouter(); - return ( - Back to cluster setIsHovered(true)} - onMouseLeave={() => setIsHovered(false)} - /> - ); + return ( + Back to cluster { + router.back(); + }} + onMouseEnter={() => setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + /> + ); }; export default ImageChanger; diff --git a/src/components/Carousel/caro.module.css b/src/components/Carousel/caro.module.css index a79c84b..9311661 100644 --- a/src/components/Carousel/caro.module.css +++ b/src/components/Carousel/caro.module.css @@ -139,6 +139,10 @@ transition: 0.2s; } +.content::-webkit-scrollbar { + display: none; +} + .tabs{ height: 50%; transition: color 0.3s ease-in-out; diff --git a/src/components/Carousel/carousel.tsx b/src/components/Carousel/carousel.tsx index e67df63..5ef45b7 100644 --- a/src/components/Carousel/carousel.tsx +++ b/src/components/Carousel/carousel.tsx @@ -9,11 +9,27 @@ import 'swiper/css/navigation'; import 'swiper/css/keyboard'; import styles from './caro.module.css'; import SlideData from './slideData'; +import { getClusterDetails } from '@/utils/events_cms'; +import { useEffect, useState } from 'react'; SwiperCore.use([Navigation, Keyboard]); -const Carousel = () => { - const slides = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; +const Carousel = ({ id, eventId }: { id: number; eventId: number }) => { + const [details, setDetails] = useState([]); + const [initialSlide, setInitialSlide] = useState(0); + const getDetails = async () => { + const res = await getClusterDetails(id); + setDetails(res); + res.forEach((data: { ind: number }, ind: number) => { + if (data.ind == eventId) { + setInitialSlide(ind); + } + }); + }; + + useEffect(() => { + getDetails(); + }, []); return ( { nextEl: `.${styles.rightArrow}`, prevEl: `.${styles.leftArrow}`, }} + initialSlide={initialSlide} keyboard={{ enabled: true }} className="w-full h-full flex justify-center" > - {slides.map(slide => ( - - + {details.map((slide, ind) => ( + + ))} diff --git a/src/components/Carousel/slideData.tsx b/src/components/Carousel/slideData.tsx index fc6b778..747f2af 100644 --- a/src/components/Carousel/slideData.tsx +++ b/src/components/Carousel/slideData.tsx @@ -1,104 +1,57 @@ +/* eslint-disable */ + 'use client'; import Image from 'next/image'; import React, { useEffect, useState } from 'react'; import EventImage from '../../assets/images/randomEventPic.jpg'; import MapDrop from '../../assets/images/MapDrop.png'; import styles from './caro.module.css'; +import { CMS_URL } from '@/config/config'; +import Markdown from 'react-markdown'; +import { EventApi } from '../../../fest-web-client/client/src'; +import { apiConfig } from '@/utils/ApiConfig'; -const SlideData = () => { +//@ts-ignore +const SlideData = ({ details }: { details: any }) => { const [index, setIndex] = useState(1); const [isActive, setIsActive] = useState(1); - const [data, setData] = useState( -

- Duis id est sint sint sunt enim ipsum officia voluptate incididunt laboris. Dolor - laboris pariatur laborum enim ea est. Et laborum elit culpa mollit. Ex reprehenderit - adipisicing esse aliquip non. -

, - ); + const [data, setData] = useState(details.content[0]); + console.log(details); + const handleRegister = () => { + try { + //backend url + const authApi = new EventApi(apiConfig); + authApi + .eventRegister({ + event_id: details.id, + team_members: ['TODO'], + tema_name: 'todo', + }) + .then(res => { + console.log(res); + }) + .catch(e => console.log(e)); + } catch (err) { + console.log(err); + } + }; useEffect(() => { switch (index) { case 1: - setData( -

- This event is designed for those who are ardent puzzle and quiz enthusiasts. - The event will evaluate the participant’s wit by testing them on a plethora - of genres and domains as they attempt to maximise their scores. -
-
# The event will have only one round, with different levels based on - various topics (for example, What’s the good word, Greek Mythology, - Football, etc.).
# The levels are divided into three sections.
{' '} - # Section-1 normal questions(Q&A), Section-2 riddles Section-3 labyrinth - Each section has 8 levels, consisting of three questions of the same genre. -

, - ); + setData(details.content[0]); setIsActive(1); break; case 2: - setData( -

- M-Decoder is a one-of-a-kind mathematical event conducted by Pragyan in - collaboration with Spider and Maximus Clubs of NIT Trichy! Do you find - yourself working out everyday problems in your head? Does the sound of a - fascinating new conundrum get you excited? Imagine yourself in a room filled - with puzzles. The only way to get out is by solving all of them in the most - efficient way possible. Featuring a range of intriguing puzzles, paramount - problems, and mind-blowing riddles, M-Decoder surely seeks to bring out the - Edward Nygma in you. -

, - ); + setData(details.content[1]); setIsActive(2); break; case 3: - setData( -

- Pariatur elit ex enim dolor. Elit veniam mollit aliquip elit. Aliqua enim - veniam exercitation consectetur eu Lorem sint cillum occaecat excepteur enim - aute. Magna enim occaecat ex culpa proident sunt pariatur tempor dolor qui - non sunt Lorem. Officia sit tempor enim nisi reprehenderit incididunt - cupidatat id.Eiusmod tempor voluptate ad mollit. Consectetur velit ad veniam - irure minim proident ullamco enim labore tempor laboris elit voluptate. Quis - ea reprehenderit laborum ea tempor ea quis consequat. Commodo cillum labore - amet adipisicing excepteur consectetur cupidatat consectetur enim tempor - adipisicing cillum. Ut minim nisi consectetur culpa est. In sunt anim - adipisicing duis tempor enim velit reprehenderit minim aliquip. Duis - occaecat minim tempor sunt qui.Ut ea do ut fugiat. Commodo consectetur - officia laborum enim. Id nulla incididunt Lorem Lorem officia ea. Veniam - velit ex exercitation ullamco dolor proident eiusmod dolore sint pariatur - excepteur culpa est. Ex incididunt exercitation sunt labore laborum ipsum - quis nostrud minim sit. Sint adipisicing dolor et consectetur est laborum - amet consectetur ipsum consectetur anim irure consectetur velit. Tempor ut - velit dolore velit sint velit velit cupidatat nostrud. Enim fugiat cupidatat - aute nulla eiusmod veniam. Nisi mollit tempor laborum do enim id incididunt - exercitation. Quis consectetur aute excepteur dolore velit - consectetur.Aliquip adipisicing ad sint proident in pariatur ad fugiat enim - proident. Ullamco aute aliqua adipisicing in voluptate minim labore - consectetur non eu minim proident qui. Eiusmod amet in non velit. Dolor - velit nisi anim do in est id do.Excepteur qui eu irure ex Lorem ex id - exercitation sunt adipisicing reprehenderit aliquip nisi consequat. - Excepteur enim eiusmod mollit irure nostrud ullamco magna sunt cillum id. - Voluptate commodo enim veniam amet cupidatat elit veniam quis nisi sit - consequat tempor laboris. Sit Lorem consectetur mollit Lorem mollit aliqua - cupidatat aliqua elit tempor. Commodo dolore proident amet laborum sit nulla - ipsum do Lorem commodo proident sint nisi. Excepteur ad adipisicing nisi - aute qui consectetur id dolor consectetur ipsum commodo ipsum laborum.Dolor - sit aliqua magna duis Lorem irure duis consequat ex esse laboris ullamco - magna ea. Labore incididunt magna eu labore id proident proident dolore. - Reprehenderit sint do minim irure pariatur minim dolor ad excepteur dolore - sunt et qui. Consectetur exercitation officia cupidatat est. -

, - ); + setData(details.content[2]); setIsActive(3); break; case 4: - setData( -

- Minim ullamco et mollit consequat deserunt enim commodo proident. Officia - mollit mollit ullamco nostrud magna enim reprehenderit aliquip. Do - reprehenderit fugiat exercitation exercitation officia est in irure est - fugiat pariatur proident ut. -

, - ); + setData(details.content[3]); setIsActive(4); break; } @@ -114,10 +67,12 @@ const SlideData = () => { className={`flex justify-center flex-col items-center w-1/3 h-full p-7 ${styles.slideIntro1}`} >
- EVENT NAME + {details.name}
image about event @@ -125,14 +80,14 @@ const SlideData = () => {
- 11/09/2001 + {details.date}
Location - ORION + {details.location}
@@ -141,10 +96,12 @@ const SlideData = () => { className={`flex justify-center items-center flex-col w-1/3 h-full p-7 max-lg:hidden ${styles.slideIntro}`} >
- EVENT NAME + {details.name}
image about event @@ -189,30 +146,33 @@ const SlideData = () => {
- {data} + {data}
- 11/09/2001 + {details.date}
Location - ORION + {details.location}
-
+
handleRegister()} + >
- PRIZE MONEY : $100,000 + PRIZE MONEY : {details.price}
diff --git a/src/components/ClusterCarousel/ClusterCarousel.tsx b/src/components/ClusterCarousel/ClusterCarousel.tsx index 086db4e..95b9090 100644 --- a/src/components/ClusterCarousel/ClusterCarousel.tsx +++ b/src/components/ClusterCarousel/ClusterCarousel.tsx @@ -1,11 +1,14 @@ +/* eslint-disable */ + 'use client'; import { Swiper, SwiperSlide } from 'swiper/react'; -import { Autoplay, Pagination, Navigation } from 'swiper/modules'; +import { Pagination, Navigation } from 'swiper/modules'; import 'swiper/css'; import 'swiper/css/navigation'; import 'swiper/css/keyboard'; +import { useRouter } from 'next/navigation'; import Image from 'next/image'; import leftPortal from '../../assets/images/leftPortal.png'; @@ -14,10 +17,22 @@ import temp from '../../assets/images/temp.png'; import leftArrow from '../../assets/images/leftArrow.png'; import rightArrow from '../../assets/images/rightArrow.png'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; +import { getClusterDetails } from '@/utils/events_cms'; + +const ClusterCarousel = ({ id, name }: { id: number; name: string }) => { + const [details, setDetails] = useState([]); + const [index, setIndex] = useState(0); + const getDetails = async () => { + let res = await getClusterDetails(id); + setDetails(res); + }; + const router = useRouter(); + + useEffect(() => { + getDetails(); + }, []); -const ClusterCarousel = () => { - const slides = [1, 2, 3, 4, 5, 6, 7, 8, 9]; const breakpoints = { 100: { slidesPerView: 1, @@ -64,11 +79,15 @@ const ClusterCarousel = () => { }; const goToNextSlide = () => { + if (swiper) swiper.activeIndex = 1; swiper?.slideNext(); + setIndex((index + 1) % details.length); }; const goToPreviousSlide = () => { + if (swiper) swiper.activeIndex = 1; swiper?.slidePrev(); + setIndex((index - 1 + details.length) % details.length); }; return ( @@ -76,36 +95,48 @@ const ClusterCarousel = () => { < handleSlideChange(swiper?.activeIndex)} > - {slides.map(slide => ( - -
- cluster -
-
- ))} + {details.map( + ( + data: { image: { url: string; height: number; width: number }; id: number }, + ind: number, + ) => ( + +
+ cluster { + router.push(`/events/${id}/${name}/${data.id}`); + }} + /> +
+
+ ), + )}
<
@@ -116,7 +147,7 @@ const ClusterCarousel = () => { <
- BATMAN + {details[index] ? details[index].name : 'Loading'}
({ + isLoggedIn: false, + loadingAuth: true, + userID: undefined, + userName: undefined, + qrCode: undefined, + setUserName: () => undefined, + setIsLoggedIn: () => false, + setuserID: () => undefined, + userData: null, +}); + +const UserContextProvider = ({ children }: {children : ReactNode}) => { + const [userID, setuserID] = useState(); + const [userName, setUserName] = useState(); + const [qrCode, setQr] = useState(""); + const [isLoggedIn, setIsLoggedIn] = useState(false); + const [loadingAuth, setLoadingAuth] = useState(true); + const [userData, setUserData] = useState(null); + + const isAuth = useCallback(() => { + setLoadingAuth(true); + fetch(`${API_URL}/user/details`, { + method: "GET", + credentials: "include", + headers: { + "Content-Type": "application/json", + }, + }) + .then((res) => res.json()) + .then((response) => { + if (response.status_code === 401) { + setIsLoggedIn(false); + } else { + setIsLoggedIn(true); + } + setLoadingAuth(false); + setUserData(response.message); + }) + .catch((e) => { + console.log(e); + setLoadingAuth(false); + }); + }, [userID]); + + const getQr = useCallback(() => { + fetch(`${API_URL}/pr/qr`, { + method: "POST", + credentials: "include", + headers: { + "Content-Type": "application/json", + }, + }) + .then((res) => res.json()) + .then((data) => { + if (data.status_code === 200) { + setQr(data.message); + } else setQr(""); + }) + .catch((e) => console.log(e)); + }, [loadingAuth, isLoggedIn]); + + useEffect(() => { + isAuth(); + getQr(); + }, [isAuth]); + + return ( + + {children} + + ); +}; + +export default UserContextProvider; \ No newline at end of file diff --git a/src/contexts/types.d.ts b/src/contexts/types.d.ts new file mode 100644 index 0000000..f0affe1 --- /dev/null +++ b/src/contexts/types.d.ts @@ -0,0 +1,29 @@ +interface UserContext { + setIsLoggedIn: React.Dispatch>; + setuserID: React.Dispatch>; + setUserName: React.Dispatch>; + loadingAuth: boolean; + isLoggedIn: boolean; + userID: number | undefined; + userName: string | undefined; + qrCode: string | undefined; + userData: { + user_name: string; + user_email: string; + sex: string; + nationality: string; + address: string; + city: string; + state: string; + pincode: string; + phno: string; + degree: string; + yearOfStudy: string; + college: string; + othercollege: string; + sponsor: string; + voucher_name: string; + referral_code: string; + acco: string | null; + } | null; +} \ No newline at end of file diff --git a/src/utils/ApiConfig.ts b/src/utils/ApiConfig.ts new file mode 100644 index 0000000..7947c3e --- /dev/null +++ b/src/utils/ApiConfig.ts @@ -0,0 +1,60 @@ +import { Configuration } from '../../fest-web-client/client/src'; +import { API_URL, HOME_URL, PREFER_DEV_OVERRIDE } from '../config/config'; +export class ApiError extends Error { + status: number; + message: string; + + constructor(status: number, message: string) { + super(message); + this.status = status; + this.message = message; + } +} + +export const apiConfig = new Configuration({ + basePath: API_URL, + headers: PREFER_DEV_OVERRIDE ? { Prefer: PREFER_DEV_OVERRIDE } : {}, + middleware: [ + { + pre: async context => { + const headers = context.init.headers; + context.init.headers = { + ...headers, + }; + context.init.credentials = 'include'; + return context; + }, + post: async context => { + const statusCode = context.response.status; + if (statusCode === 401 || statusCode === 403) { + localStorage.removeItem('token'); + window.location.href = `${HOME_URL}/login`; + window.history.forward(); + window.location.reload(); + } + if (statusCode >= 400) { + const body = await context.response.json(); + throw new ApiError(statusCode, body?.message ?? 'Unknown error'); + } + return context.response; + }, + }, + ], +}); + +export const authConfig = new Configuration({ + basePath: API_URL, + headers: PREFER_DEV_OVERRIDE ? { Prefer: PREFER_DEV_OVERRIDE } : {}, + middleware: [ + { + post: async context => { + const status = context.response.status; + if (status >= 400) { + const body = await context.response.json(); + throw new ApiError(status, body?.message ?? 'Unknown error'); + } + return context.response; + }, + }, + ], +}); diff --git a/src/utils/dauthlogin.ts b/src/utils/dauthlogin.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/utils/events_cms.ts b/src/utils/events_cms.ts new file mode 100644 index 0000000..8314ae8 --- /dev/null +++ b/src/utils/events_cms.ts @@ -0,0 +1,68 @@ +/* eslint-disable */ +import axios from 'axios'; +import { CMS_URL } from '@/config/config'; + +export const getClusterDetails = async (id: number) => { + let res = await axios.get( + `${CMS_URL}/api/clusters/${id}?populate[Cluster_Details][populate][Events][populate]=*`, + ); + let detail = res.data.data; + //@ts-ignore + let details: any = []; + detail = detail.attributes.Cluster_Details; + let events = detail.Events; + //@ts-ignore + events.forEach((content: any) => { + details.push({ + content: [ + content.Description, + content.Judging_criteria, + content.Rules, + content.Contact, + ], + date: content.date, + location: content.location, + name: content.name, + price: content.price_money, + id: content.id, + image: content.Image.data?.attributes, + }); + }); + return details; +}; + +export const getClusterNames = async () => { + let res = await axios.get(`${CMS_URL}/api/clusters?populate=*`); + let detailArray = res.data.data; + //@ts-ignore + let details: any = []; + // eslint-disable @typescript-eslint/ban-ts-comment + //@ts-ignore + detailArray.forEach((data: any) => { + let detail = data.attributes.Cluster_Details; + details.push({ name: detail.Cluster_Name, id: data.id }); + }); + + return details; +}; + +export const getGallery = async () => { + let res = await axios.get(`${CMS_URL}/api/galleries?populate=*`); + let detailArray = res.data.data; + //@ts-ignore + let details: any = []; + // eslint-disable @typescript-eslint/ban-ts-comment + //@ts-ignore + detailArray.forEach((data: any) => { + let detail = data.attributes.gallery; + let dummy = detail.data[0].attributes; + details.push({ + url: dummy.url, + width: dummy.width, + height: dummy.height, + eventId: data.attributes.Event_ID, + eventName: data.attributes.Event_Name, + }); + }); + return details; +}; diff --git a/tsconfig.json b/tsconfig.json index d7e05e5..52ea54a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,7 +19,8 @@ } ], "paths": { - "@/*": ["./src/*"] + "@/*": ["./src/*"], + "@client" : ["./fest-web-client"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], diff --git a/yarn.lock b/yarn.lock index 3dea53f..32e1cd7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -216,6 +216,32 @@ dependencies: tslib "^2.4.0" +"@types/debug@^4.0.0": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/estree-jsx@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.3.tgz#f8aa833ec986d82b8271a294a92ed1565bf2c66a" + integrity sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w== + dependencies: + "@types/estree" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/hast@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.3.tgz#7f75e6b43bc3f90316046a287d9ad3888309f7e1" + integrity sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ== + dependencies: + "@types/unist" "*" + "@types/json-schema@^7.0.12": version "7.0.14" resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz" @@ -226,6 +252,18 @@ resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/mdast@^4.0.0": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.3.tgz#1e011ff013566e919a4232d1701ad30d70cab333" + integrity sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg== + dependencies: + "@types/unist" "*" + +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + "@types/node@^20": version "20.8.2" resolved "https://registry.npmjs.org/@types/node/-/node-20.8.2.tgz" @@ -262,6 +300,16 @@ resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz" integrity sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ== +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" + integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== + +"@types/unist@^2.0.0": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" + integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== + "@typescript-eslint/eslint-plugin@^6.8.0": version "6.8.0" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz" @@ -392,7 +440,7 @@ "@typescript-eslint/types" "6.8.0" eslint-visitor-keys "^3.4.1" -"@ungap/structured-clone@^1.2.0": +"@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== @@ -567,6 +615,11 @@ asynciterator.prototype@^1.0.0: dependencies: has-symbols "^1.0.3" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + autoprefixer@^10: version "10.4.16" resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz" @@ -589,6 +642,15 @@ axe-core@^4.6.2: resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz" integrity sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g== +axios@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" + integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + axobject-query@^3.1.1: version "3.2.1" resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz" @@ -596,6 +658,11 @@ axobject-query@^3.1.1: dependencies: dequal "^2.0.3" +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" @@ -680,6 +747,11 @@ caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.300015 resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001543.tgz" integrity sha512-qxdO8KPWPQ+Zk6bvNpPeQIOH47qZSYdFZd6dXQzb2KzhnSXju4Kd7H1PkSJx6NICSMgo/IhRZRhhfPTHYpJUCA== +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== + chalk@5.3.0: version "5.3.0" resolved "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz" @@ -693,6 +765,26 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + +character-reference-invalid@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== + chokidar@^3.5.3: version "3.5.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" @@ -745,6 +837,18 @@ colorette@^2.0.20: resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + commander@11.0.0: version "11.0.0" resolved "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz" @@ -774,6 +878,11 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +css-mediaquery@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/css-mediaquery/-/css-mediaquery-0.1.2.tgz#6a2c37344928618631c54bd33cedd301da18bea0" + integrity sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q== + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" @@ -789,7 +898,7 @@ damerau-levenshtein@^1.0.8: resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -debug@4.3.4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@4.3.4, debug@^4.0.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -803,6 +912,13 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +decode-named-character-reference@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + dependencies: + character-entities "^2.0.0" + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" @@ -849,11 +965,23 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, de has-property-descriptors "^1.0.0" object-keys "^1.1.1" -dequal@^2.0.3: +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +dequal@^2.0.0, dequal@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +devlop@^1.0.0, devlop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== + dependencies: + dequal "^2.0.0" + didyoumean@^1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" @@ -1234,6 +1362,11 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-util-is-identifier-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd" + integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" @@ -1274,6 +1407,11 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" @@ -1348,6 +1486,11 @@ flatted@^3.2.7: resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== +follow-redirects@^1.15.0: + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" @@ -1355,6 +1498,15 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + fraction.js@^4.3.6: version "4.3.6" resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz" @@ -1566,6 +1718,39 @@ has@^1.0.3: resolved "https://registry.npmjs.org/has/-/has-1.0.4.tgz" integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== +hast-util-to-jsx-runtime@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz#3ed27caf8dc175080117706bf7269404a0aa4f7c" + integrity sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^1.0.0" + unist-util-position "^5.0.0" + vfile-message "^4.0.0" + +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + dependencies: + "@types/hast" "^3.0.0" + +html-url-attributes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-url-attributes/-/html-url-attributes-3.0.0.tgz#fc4abf0c3fb437e2329c678b80abb3c62cff6f08" + integrity sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow== + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" @@ -1581,6 +1766,11 @@ husky@^8.0.3: resolved "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz" integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== +hyphenate-style-name@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + ignore@^5.2.0, ignore@^5.2.4: version "5.2.4" resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" @@ -1612,6 +1802,11 @@ inherits@2: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inline-style-parser@0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.2.tgz#d498b4e6de0373458fc610ff793f6b14ebf45633" + integrity sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ== + internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" @@ -1621,6 +1816,19 @@ internal-slot@^1.0.5: has "^1.0.3" side-channel "^1.0.4" +is-alphabetical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== + +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== + dependencies: + is-alphabetical "^2.0.0" + is-decimal "^2.0.0" + is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" @@ -1678,6 +1886,11 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: dependencies: has-tostringtag "^1.0.0" +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== + is-docker@^2.0.0: version "2.2.1" resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" @@ -1719,6 +1932,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-hexadecimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== + is-inside-container@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz" @@ -1753,6 +1971,11 @@ is-path-inside@^3.0.3: resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" @@ -1989,6 +2212,11 @@ log-update@^5.0.1: strip-ansi "^7.0.1" wrap-ansi "^8.0.1" +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" @@ -2003,6 +2231,117 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +matchmediaquery@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/matchmediaquery/-/matchmediaquery-0.3.1.tgz#8247edc47e499ebb7c58f62a9ff9ccf5b815c6d7" + integrity sha512-Hlk20WQHRIm9EE9luN1kjRjYXAQToHOIAHPJn9buxBwuhfTHoKUcX+lXBbxc85DVQfXYbEQ4HcwQdd128E3qHQ== + dependencies: + css-mediaquery "^0.1.2" + +mdast-util-from-markdown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz#52f14815ec291ed061f2922fd14d6689c810cb88" + integrity sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + mdast-util-to-string "^4.0.0" + micromark "^4.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-decode-string "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-stringify-position "^4.0.0" + +mdast-util-mdx-expression@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz#4968b73724d320a379110d853e943a501bfd9d87" + integrity sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-jsx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.0.0.tgz#f73631fa5bb7a36712ff1e9cedec0cafed03401c" + integrity sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-remove-position "^5.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +mdast-util-mdxjs-esm@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97" + integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-phrasing@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz#468cbbb277375523de807248b8ad969feb02a5c7" + integrity sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA== + dependencies: + "@types/mdast" "^4.0.0" + unist-util-is "^6.0.0" + +mdast-util-to-hast@^13.0.0: + version "13.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz#74c0a9f014bb2340cae6118f6fccd75467792be7" + integrity sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" + trim-lines "^3.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + +mdast-util-to-markdown@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz#9813f1d6e0cdaac7c244ec8c6dabfdb2102ea2b4" + integrity sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^4.0.0" + mdast-util-to-string "^4.0.0" + micromark-util-decode-string "^2.0.0" + unist-util-visit "^5.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== + dependencies: + "@types/mdast" "^4.0.0" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" @@ -2013,6 +2352,200 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +micromark-core-commonmark@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz#50740201f0ee78c12a675bf3e68ffebc0bf931a3" + integrity sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA== + dependencies: + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-factory-destination "^2.0.0" + micromark-factory-label "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-title "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-html-tag-name "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-destination@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz#857c94debd2c873cba34e0445ab26b74f6a6ec07" + integrity sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-label@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz#17c5c2e66ce39ad6f4fc4cbf40d972f9096f726a" + integrity sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw== + dependencies: + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-space@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz#5e7afd5929c23b96566d0e1ae018ae4fcf81d030" + integrity sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-title@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz#726140fc77892af524705d689e1cf06c8a83ea95" + integrity sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-whitespace@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz#9e92eb0f5468083381f923d9653632b3cfb5f763" + integrity sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-character@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.0.1.tgz#52b824c2e2633b6fb33399d2ec78ee2a90d6b298" + integrity sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-chunked@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz#e51f4db85fb203a79dbfef23fd41b2f03dc2ef89" + integrity sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-classify-character@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz#8c7537c20d0750b12df31f86e976d1d951165f34" + integrity sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-combine-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz#75d6ab65c58b7403616db8d6b31315013bfb7ee5" + integrity sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ== + dependencies: + micromark-util-chunked "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-decode-numeric-character-reference@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz#2698bbb38f2a9ba6310e359f99fcb2b35a0d2bd5" + integrity sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-decode-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz#7dfa3a63c45aecaa17824e656bcdb01f9737154a" + integrity sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" + integrity sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA== + +micromark-util-html-tag-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz#ae34b01cbe063363847670284c6255bb12138ec4" + integrity sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw== + +micromark-util-normalize-identifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz#91f9a4e65fe66cc80c53b35b0254ad67aa431d8b" + integrity sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-resolve-all@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz#189656e7e1a53d0c86a38a652b284a252389f364" + integrity sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA== + dependencies: + micromark-util-types "^2.0.0" + +micromark-util-sanitize-uri@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" + integrity sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-subtokenize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz#9f412442d77e0c5789ffdf42377fa8a2bcbdf581" + integrity sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-symbol@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" + integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== + +micromark-util-types@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" + integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== + +micromark@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.0.tgz#84746a249ebd904d9658cfabc1e8e5f32cbc6249" + integrity sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + micromatch@4.0.5, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" @@ -2021,6 +2554,18 @@ micromatch@4.0.5, micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" @@ -2263,6 +2808,20 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-entities@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.1.tgz#4e2a01111fb1c986549b944af39eeda258fc9e4e" + integrity sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w== + dependencies: + "@types/unist" "^2.0.0" + character-entities "^2.0.0" + character-entities-legacy "^3.0.0" + character-reference-invalid "^2.0.0" + decode-named-character-reference "^1.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + is-hexadecimal "^2.0.0" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" @@ -2388,7 +2947,7 @@ prettier@3.0.3: resolved "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz" integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== -prop-types@^15.8.1: +prop-types@^15.6.1, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -2397,6 +2956,16 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +property-information@^6.0.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.0.tgz#6bc4c618b0c2d68b3bb8b552cbb97f8e300a0f82" + integrity sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ== + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + punycode@^2.1.0: version "2.3.0" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" @@ -2427,6 +2996,32 @@ react-is@^16.13.1: resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-markdown@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-9.0.1.tgz#c05ddbff67fd3b3f839f8c648e6fb35d022397d1" + integrity sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg== + dependencies: + "@types/hast" "^3.0.0" + devlop "^1.0.0" + hast-util-to-jsx-runtime "^2.0.0" + html-url-attributes "^3.0.0" + mdast-util-to-hast "^13.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.0.0" + unified "^11.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +react-responsive@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/react-responsive/-/react-responsive-9.0.2.tgz#34531ca77a61e7a8775714016d21241df7e4205c" + integrity sha512-+4CCab7z8G8glgJoRjAwocsgsv6VA2w7JPxFWHRc7kvz8mec1/K5LutNC2MG28Mn8mu6+bu04XZxHv5gyfT7xQ== + dependencies: + hyphenate-style-name "^1.0.0" + matchmediaquery "^0.3.0" + prop-types "^15.6.1" + shallow-equal "^1.2.1" + react@^18: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" @@ -2474,6 +3069,27 @@ regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: define-properties "^1.2.0" set-function-name "^2.0.0" +remark-parse@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + micromark-util-types "^2.0.0" + unified "^11.0.0" + +remark-rehype@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.0.0.tgz#7f21c08738bde024be5f16e4a8b13e5d7a04cf6b" + integrity sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" @@ -2588,6 +3204,11 @@ set-function-name@^2.0.0, set-function-name@^2.0.1: functions-have-names "^1.2.3" has-property-descriptors "^1.0.0" +shallow-equal@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da" + integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" @@ -2632,6 +3253,11 @@ source-map-js@^1.0.2: resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" @@ -2693,6 +3319,14 @@ string.prototype.trimstart@^1.0.7: define-properties "^1.2.0" es-abstract "^1.22.1" +stringify-entities@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" + integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -2727,6 +3361,13 @@ strip-json-comments@^3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +style-to-object@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.5.tgz#5e918349bc3a39eee3a804497d97fcbbf2f0d7c0" + integrity sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ== + dependencies: + inline-style-parser "0.2.2" + styled-jsx@5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz" @@ -2836,6 +3477,16 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" + integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== + ts-api-utils@^1.0.1: version "1.0.3" resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz" @@ -2932,6 +3583,65 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +unified@^11.0.0: + version "11.0.4" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.4.tgz#f4be0ac0fe4c88cb873687c07c64c49ed5969015" + integrity sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ== + dependencies: + "@types/unist" "^3.0.0" + bail "^2.0.0" + devlop "^1.0.0" + extend "^3.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^6.0.0" + +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-remove-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz#fea68a25658409c9460408bc6b4991b965b52163" + integrity sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q== + dependencies: + "@types/unist" "^3.0.0" + unist-util-visit "^5.0.0" + +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-visit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + untildify@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz" @@ -2957,6 +3667,23 @@ util-deprecate@^1.0.2: resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +vfile-message@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" + integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + +vfile@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.1.tgz#1e8327f41eac91947d4fe9d237a2dd9209762536" + integrity sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + watchpack@2.4.0: version "2.4.0" resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" @@ -3055,3 +3782,8 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zwitch@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==