feat/dashboard-page #3

Merged
glazk0 merged 5 commits from feat/dashboard-page into main 2023-05-01 16:45:44 +02:00
18 changed files with 249 additions and 586 deletions

View file

@ -1,4 +1,5 @@
import Leaderboard from '@/ui/Leaderboard'; import Leaderboard from '@/ui/Leaderboard';
import { cookies } from 'next/headers';
export const metadata = { export const metadata = {
title: 'Tableau des scores', title: 'Tableau des scores',
@ -6,5 +7,6 @@ export const metadata = {
}; };
export default async function Page() { export default async function Page() {
return <Leaderboard />; const token = cookies().get('token')?.value;
return <Leaderboard token={token!} />;
} }

View file

@ -1,104 +1,99 @@
'use client'; 'use client';
import { useContext } from 'react';
import { UserContext } from '@/context/user'; import { UserContext } from '@/context/user';
import Card from '@/ui/Card'; import Card from '@/ui/Card';
import { useContext } from 'react';
export default function Page() { export default function Page() {
const { data: me, isLoading } = useContext(UserContext); const { data: me, isLoading } = useContext(UserContext);
return ( return (
<div className="flex h-full w-full flex-col space-y-4"> <section className="w-full flex-col space-y-4">
<div className="w-full"> <header>
<section className="flex flex-col space-y-4"> <h1 className="text-xl font-semibold">Tableau de bord</h1>
<header> <p className="text-highlight-secondary">Ceci est la page d&apos;accueil du dashboard</p>
<h3 className="text-xl font-semibold">Tableau de bord</h3> </header>
<p className="text-muted">Ceci est la page d&apos;accueil du dashboard</p> <main className="flex-col space-y-4">
</header> <div className="w-full flex-col justify-between space-x-0 space-y-4 md:flex md:flex-row md:space-x-6 md:space-y-0">
<main className="flex-col justify-between space-x-0 space-y-4 md:flex md:flex-row md:space-x-6 md:space-y-0"> <Card
<Card isLoading={isLoading}
isLoading={isLoading} icon="pie-chart-line"
icon="pie-chart-line" title="Puzzles résolus"
title="Puzzles résolus" data={me?.completions ?? 0}
data={me?.completions || 0} link="/dashboard/puzzles"
/>
<Card
isLoading={isLoading}
icon="award-line"
title="Badges obtenus"
data={me?.badges?.length || 'Aucun'}
/>
<Card
isLoading={isLoading}
icon="bar-chart-line"
title="Rang actuel"
data={me?.rank || 'Non classé'}
/>
</main>
</section>
</div>
<div className="h-full w-full flex-col justify-between space-x-0 space-y-4 md:flex md:flex-row md:space-x-6 md:space-y-0">
<section className="flex h-full w-full flex-col space-y-4">
<header>
<h3 className="text-xl font-semibold">Guides</h3>
</header>
<main className="h-full w-full flex-col justify-between space-x-0 space-y-4 rounded-lg border border-highlight-primary bg-primary-700 md:flex md:flex-row md:space-x-6 md:space-y-0">
Work in progress
</main>
</section>
<section className="flex h-full w-full flex-col space-y-4">
<header>
<h3 className="text-xl font-semibold">Historiques</h3>
</header>
<main className="h-full w-full flex-col justify-between space-x-0 space-y-4 rounded-lg border border-highlight-primary bg-primary-700 md:flex md:flex-row md:space-x-6 md:space-y-0">
Work in progress
</main>
</section>
</div>
{/* TODO fix ça c'est pas responsive */}
{/* <section className="flex-col space-y-4">
<header>
<h3 className="text-xl font-semibold">Statistiques</h3>
<p className="text-muted">Ceci est la page d&apos;accueil du dashboard</p>
</header>
<main className="flex-col justify-between space-x-0 space-y-4 sm:flex sm:flex-row sm:space-x-6 sm:space-y-0">
<CardTable
puzzles={[
{ name: 'Jour 0 | Save Conway Gadgetski', id: 1', content: '' },
{ name: 'Jour 1 | Next', id: 2', content: '' },
{ name: 'Jour 2 | Previous', id: '3', content: '' },
{ name: 'Jour 3 | Next 1 loop', id: '4', content: '' },
{ name: 'Jour 4 | Next no loop + recursion', id: '5', content: '' },
{ name: 'Jour 5 | N first rows', id: '6', content: '' },
{ name: 'Week-end | Game of Life', id: '7', content: '' },
{ name: 'Jour 0 | Save Conway Gadgetski', id: '1', content: '' },
{ name: 'Jour 1 | Next', id: '2', content: '' },
{ name: 'Jour 2 | Previous', id: '3', content: '' },
{ name: 'Jour 3 | Next 1 loop', id: '4', content: '' },
{ name: 'Jour 4 | Next no loop + recursion', id: '5', content: '' },
{ name: 'Jour 5 | N first rows', id: '6', content: '' },
{ name: 'Week-end | Game of Life', id: '7', content: '' },
{ name: 'Jour 0 | Save Conway Gadgetski', id: '1', content: '' },
{ name: 'Jour 1 | Next', id: '2', content: '' },
{ name: 'Jour 2 | Previous', id: '3', content: '' },
{ name: 'Jour 3 | Next 1 loop', id: '4', content: '' },
{ name: 'Jour 4 | Next no loop + recursion', id: '5', content: '' },
{ name: 'Jour 5 | N first rows', id: '6', content: '' },
{ name: 'Week-end | Game of Life', id: '7', content: '' }
]}
/> />
<CardTable <Card
puzzles={[ isLoading={isLoading}
{ name: 'Jour 0 | Save Conway Gadgetski', id: '1', content: '' }, icon="award-line"
{ name: 'Jour 1 | Next', id: '2', content: '' }, title="Badges obtenus"
{ name: 'Jour 2 | Previous', id: '3', content: '' }, data={me?.badges?.length ?? 'Aucun'}
{ name: 'Jour 3 | Next 1 loop', id: '4', content: '' }, link="/dashboard/badges"
{ name: 'Jour 4 | Next no loop + recursion', id: '5', content: '' },
{ name: 'Jour 5 | N first rows', id: '6', content: '' },
{ name: 'Week-end | Game of Life', id: '7', content: '' }
]}
/> />
</main> <Card
</section> */} isLoading={isLoading}
</div> icon="bar-chart-line"
title="Rang actuel"
data={me?.rank ?? 'Non classé'}
link="/dashboard/leaderboard"
/>
</div>
<div className="grid grid-cols-1 gap-4">
<div className="flex flex-col space-y-4">
<header>
<h2 className="text-lg font-semibold">Derniers puzzles</h2>
<p className="text-highlight-secondary">
Voici les derniers puzzles que vous avez résolus ou essayer de résoudres
</p>
</header>
<div className="h-full max-h-96 overflow-y-scroll rounded-lg border-2 border-highlight-primary bg-primary-700 p-4 shadow-md">
<ul className="flex flex-col space-y-2">
{me?.completionsList && me.completionsList.length > 0 ? (
me?.completionsList
.sort(
(a, b) =>
a.score - b.score ||
a.tries - b.tries ||
a.puzzleName.localeCompare(b.puzzleName)
)
.map((completion, key) => {
return (
<li key={key} className="flex justify-between space-x-2">
<div className="flex items-center space-x-4">
<div className="flex items-center space-x-2">
<span className="text-lg">{completion.puzzleName}</span>
</div>
</div>
<div className="flex items-center space-x-4">
<div className="flex flex-col">
<span className="text-sm font-semibold">
Essai{completion.tries > 1 ? 's' : ''}
</span>
<span className="text-right text-lg text-highlight-secondary">
{completion.tries}
</span>
</div>
<div className="flex flex-col">
<span className="text-sm font-semibold">Score</span>
<span className="text-right text-lg text-highlight-secondary">
{completion.score}
</span>
</div>
</div>
</li>
);
})
) : (
<li className="m-auto flex items-center justify-center">
<span className="text-lg text-highlight-secondary">
{isLoading ? 'Chargement en cours...' : 'Aucun puzzles'}
</span>
</li>
)}
</ul>
</div>
</div>
</div>
</main>
</section>
); );
} }

View file

@ -8,7 +8,7 @@ export default function Page() {
useEffect(() => { useEffect(() => {
router.push('/'); router.push('/');
}, []); }, [router]);
return <></>; return <></>;
} }

View file

@ -1,12 +0,0 @@
import axios from 'axios';
const fetcher = axios.create({
baseURL: process.env.NEXT_PUBLIC_API_URL,
headers: {
'Content-Type': 'application/json',
Accept: 'application/json'
},
insecureHTTPParser: true
});
export default fetcher;

View file

@ -20,33 +20,33 @@ export type NavItem = {
* @type {NavItem[]} * @type {NavItem[]}
*/ */
export const navItems: NavItem[] = [ export const navItems: NavItem[] = [
// { {
// name: 'Dashboard', name: 'Dashboard',
// slug: '', slug: 'dashboard',
// icon: 'dashboard-line', icon: 'dashboard-line',
// disabled: false disabled: false
// }, },
{ {
name: 'Classement', name: 'Classement',
slug: 'leaderboard', slug: 'dashboard/leaderboard',
icon: 'line-chart-line', icon: 'line-chart-line',
disabled: false disabled: false
}, },
{ {
name: 'Puzzles', name: 'Puzzles',
slug: 'puzzles', slug: 'dashboard/puzzles',
icon: 'code-s-slash-line', icon: 'code-s-slash-line',
disabled: false disabled: false
}, },
{ {
name: 'Badges', name: 'Badges',
slug: 'badges', slug: 'dashboard/badges',
icon: 'award-fill', icon: 'award-fill',
disabled: false disabled: false
}, },
{ {
name: 'Paramètres', name: 'Paramètres',
slug: 'settings', slug: 'dashboard/settings',
icon: 'equalizer-line', icon: 'equalizer-line',
disabled: false disabled: false
} }

View file

@ -38,6 +38,7 @@ export type Player = {
tries: number; tries: number;
completions: number; completions: number;
rank: number; rank: number;
completionsList: Completion[];
badges: Badge[] | null; badges: Badge[] | null;
}; };
@ -46,3 +47,9 @@ export type Badge = {
level: number; level: number;
logo?: string; logo?: string;
}; };
export type Completion = {
puzzleName: string;
tries: number;
score: number;
};

View file

@ -1,4 +1,5 @@
import { NextResponse, type NextRequest } from 'next/server'; import { NextResponse, type NextRequest } from 'next/server';
import { getURL } from './lib/utils'; import { getURL } from './lib/utils';
/** /**
@ -26,7 +27,7 @@ export async function middleware(req: NextRequest) {
return res; return res;
} }
if (isAuth && req.nextUrl.pathname === '/logout') { if (isAuth && req.nextUrl.pathname.includes('logout')) {
res.cookies.set('token', '', { res.cookies.set('token', '', {
path: '/', path: '/',
expires: new Date(0) expires: new Date(0)
@ -34,21 +35,15 @@ export async function middleware(req: NextRequest) {
} }
if (isAuth && req.nextUrl.pathname.includes('sign')) { if (isAuth && req.nextUrl.pathname.includes('sign')) {
return NextResponse.redirect(getURL('/dashboard/puzzles')); return NextResponse.redirect(getURL('/dashboard'));
} }
// TODO REMOVE
if (isAuth && req.nextUrl.pathname.match(/^\/dashboard\/?$/)) {
return NextResponse.redirect(getURL('/dashboard/puzzles'));
}
return res; return res;
} }
export const config = { export const config = {
matcher: [ matcher: [
// On exclut les routes de l'API, les fichiers statiques, les images, les assets, le favicon et le service worker. // On exclut les routes de l'API, les fichiers statiques, les images, les assets, le favicon et le service worker.
'/((?!api|_next/static|_next/image|assets|favicon|sw.js).*)' '/((?!api|_next/static|_next/image|favicon.ico|assets|sw.js).*)'
] ]
}; };

View file

@ -22,18 +22,16 @@
"dependencies": { "dependencies": {
"@radix-ui/react-dialog": "^1.0.3", "@radix-ui/react-dialog": "^1.0.3",
"@radix-ui/react-popover": "^1.0.5", "@radix-ui/react-popover": "^1.0.5",
"axios": "^1.3.4",
"boring-avatars": "^1.7.0", "boring-avatars": "^1.7.0",
"clsx": "^1.2.1", "clsx": "^1.2.1",
"edge-csrf": "^1.0.3",
"framer-motion": "^10.12.4", "framer-motion": "^10.12.4",
"js-cookie": "^3.0.1", "js-cookie": "^3.0.1",
"next": "13.2.3", "next": "13.3.1",
"react": "18.2.0", "react": "18.2.0",
"react-confetti": "^6.1.0",
"react-dom": "18.2.0", "react-dom": "18.2.0",
"react-hook-form": "^7.43.1", "react-hook-form": "^7.43.1",
"react-markdown": "^8.0.5", "react-markdown": "^8.0.5",
"react-use": "^17.4.0",
"remark-breaks": "^3.0.2", "remark-breaks": "^3.0.2",
"remark-gfm": "^3.0.1", "remark-gfm": "^3.0.1",
"remixicon": "^2.5.0", "remixicon": "^2.5.0",
@ -51,12 +49,12 @@
"@typescript-eslint/parser": "^5.50.0", "@typescript-eslint/parser": "^5.50.0",
"autoprefixer": "^10.4.13", "autoprefixer": "^10.4.13",
"eslint": "8.33.0", "eslint": "8.33.0",
"eslint-config-next": "13.2.3", "eslint-config-next": "13.3.1",
"eslint-config-prettier": "^8.6.0", "eslint-config-prettier": "^8.6.0",
"eslint-plugin-prettier": "^4.2.1", "eslint-plugin-prettier": "^4.2.1",
"postcss": "^8.4.21", "postcss": "^8.4.21",
"prettier": "^2.8.3", "prettier": "^2.8.3",
"prettier-plugin-tailwindcss": "^0.2.2", "prettier-plugin-tailwindcss": "^0.2.7",
"tailwindcss": "^3.2.4", "tailwindcss": "^3.2.4",
"typescript": "4.9.5" "typescript": "4.9.5"
} }

437
pnpm-lock.yaml generated
View file

@ -7,15 +7,15 @@ dependencies:
'@radix-ui/react-popover': '@radix-ui/react-popover':
specifier: ^1.0.5 specifier: ^1.0.5
version: 1.0.5(@types/react@18.0.27)(react-dom@18.2.0)(react@18.2.0) version: 1.0.5(@types/react@18.0.27)(react-dom@18.2.0)(react@18.2.0)
axios:
specifier: ^1.3.4
version: 1.3.5
boring-avatars: boring-avatars:
specifier: ^1.7.0 specifier: ^1.7.0
version: 1.7.0 version: 1.7.0
clsx: clsx:
specifier: ^1.2.1 specifier: ^1.2.1
version: 1.2.1 version: 1.2.1
edge-csrf:
specifier: ^1.0.3
version: 1.0.3(next@13.3.1)
framer-motion: framer-motion:
specifier: ^10.12.4 specifier: ^10.12.4
version: 10.12.4(react-dom@18.2.0)(react@18.2.0) version: 10.12.4(react-dom@18.2.0)(react@18.2.0)
@ -23,14 +23,11 @@ dependencies:
specifier: ^3.0.1 specifier: ^3.0.1
version: 3.0.1 version: 3.0.1
next: next:
specifier: 13.2.3 specifier: 13.3.1
version: 13.2.3(react-dom@18.2.0)(react@18.2.0) version: 13.3.1(react-dom@18.2.0)(react@18.2.0)
react: react:
specifier: 18.2.0 specifier: 18.2.0
version: 18.2.0 version: 18.2.0
react-confetti:
specifier: ^6.1.0
version: 6.1.0(react@18.2.0)
react-dom: react-dom:
specifier: 18.2.0 specifier: 18.2.0
version: 18.2.0(react@18.2.0) version: 18.2.0(react@18.2.0)
@ -40,9 +37,6 @@ dependencies:
react-markdown: react-markdown:
specifier: ^8.0.5 specifier: ^8.0.5
version: 8.0.6(@types/react@18.0.27)(react@18.2.0) version: 8.0.6(@types/react@18.0.27)(react@18.2.0)
react-use:
specifier: ^17.4.0
version: 17.4.0(react-dom@18.2.0)(react@18.2.0)
remark-breaks: remark-breaks:
specifier: ^3.0.2 specifier: ^3.0.2
version: 3.0.2 version: 3.0.2
@ -91,8 +85,8 @@ devDependencies:
specifier: 8.33.0 specifier: 8.33.0
version: 8.33.0 version: 8.33.0
eslint-config-next: eslint-config-next:
specifier: 13.2.3 specifier: 13.3.1
version: 13.2.3(eslint@8.33.0)(typescript@4.9.5) version: 13.3.1(eslint@8.33.0)(typescript@4.9.5)
eslint-config-prettier: eslint-config-prettier:
specifier: ^8.6.0 specifier: ^8.6.0
version: 8.8.0(eslint@8.33.0) version: 8.8.0(eslint@8.33.0)
@ -106,7 +100,7 @@ devDependencies:
specifier: ^2.8.3 specifier: ^2.8.3
version: 2.8.7 version: 2.8.7
prettier-plugin-tailwindcss: prettier-plugin-tailwindcss:
specifier: ^0.2.2 specifier: ^0.2.7
version: 0.2.7(prettier@2.8.7) version: 0.2.7(prettier@2.8.7)
tailwindcss: tailwindcss:
specifier: ^3.2.4 specifier: ^3.2.4
@ -212,36 +206,18 @@ packages:
resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
dev: true dev: true
/@next/env@13.2.3: /@next/env@13.3.1:
resolution: {integrity: sha512-FN50r/E+b8wuqyRjmGaqvqNDuWBWYWQiigfZ50KnSFH0f+AMQQyaZl+Zm2+CIpKk0fL9QxhLxOpTVA3xFHgFow==} resolution: {integrity: sha512-EDtCoedIZC7JlUQ3uaQpSc4aVmyhbLHmQVALg7pFfQgOTjgSnn7mKtA0DiCMkYvvsx6aFb5octGMtWrOtGXW9A==}
dev: false dev: false
/@next/eslint-plugin-next@13.2.3: /@next/eslint-plugin-next@13.3.1:
resolution: {integrity: sha512-QmMPItnU7VeojI1KnuwL9SLFWEwmaNHNlnOGpoTwdLoSiP9sc8KYiAHWEc4/44L+cAdCxcZYvn7frcRNP5l84Q==} resolution: {integrity: sha512-Hpd74UrYGF+bq9bBSRDXRsRfaWkPpcwjhvachy3sr/R/5fY6feC0T0s047pUthyqcaeNsqKOY1nUGQQJNm4WyA==}
dependencies: dependencies:
glob: 7.1.7 glob: 7.1.7
dev: true dev: true
/@next/swc-android-arm-eabi@13.2.3: /@next/swc-darwin-arm64@13.3.1:
resolution: {integrity: sha512-mykdVaAXX/gm+eFO2kPeVjnOCKwanJ9mV2U0lsUGLrEdMUifPUjiXKc6qFAIs08PvmTMOLMNnUxqhGsJlWGKSw==} resolution: {integrity: sha512-UXPtriEc/pBP8luSLSCZBcbzPeVv+SSjs9cH/KygTbhmACye8/OOXRZO13Z2Wq1G0gLmEAIHQAOuF+vafPd2lw==}
engines: {node: '>= 10'}
cpu: [arm]
os: [android]
requiresBuild: true
dev: false
optional: true
/@next/swc-android-arm64@13.2.3:
resolution: {integrity: sha512-8XwHPpA12gdIFtope+n9xCtJZM3U4gH4vVTpUwJ2w1kfxFmCpwQ4xmeGSkR67uOg80yRMuF0h9V1ueo05sws5w==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
requiresBuild: true
dev: false
optional: true
/@next/swc-darwin-arm64@13.2.3:
resolution: {integrity: sha512-TXOubiFdLpMfMtaRu1K5d1I9ipKbW5iS2BNbu8zJhoqrhk3Kp7aRKTxqFfWrbliAHhWVE/3fQZUYZOWSXVQi1w==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
@ -249,8 +225,8 @@ packages:
dev: false dev: false
optional: true optional: true
/@next/swc-darwin-x64@13.2.3: /@next/swc-darwin-x64@13.3.1:
resolution: {integrity: sha512-GZctkN6bJbpjlFiS5pylgB2pifHvgkqLAPumJzxnxkf7kqNm6rOGuNjsROvOWVWXmKhrzQkREO/WPS2aWsr/yw==} resolution: {integrity: sha512-lT36yYxosCfLtplFzJWgo0hrPu6/do8+msgM7oQkPeohDNdhjtjFUgOOwdSnPublLR6Mo2Ym4P/wl5OANuD2bw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
@ -258,26 +234,8 @@ packages:
dev: false dev: false
optional: true optional: true
/@next/swc-freebsd-x64@13.2.3: /@next/swc-linux-arm64-gnu@13.3.1:
resolution: {integrity: sha512-rK6GpmMt/mU6MPuav0/M7hJ/3t8HbKPCELw/Uqhi4732xoq2hJ2zbo2FkYs56y6w0KiXrIp4IOwNB9K8L/q62g==} resolution: {integrity: sha512-wRb76nLWJhonH8s3kxC/1tFguEkeOPayIwe9mkaz1G/yeS3OrjeyKMJsb4+Kdg0zbTo53bNCOl59NNtDM7yyyw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [freebsd]
requiresBuild: true
dev: false
optional: true
/@next/swc-linux-arm-gnueabihf@13.2.3:
resolution: {integrity: sha512-yeiCp/Odt1UJ4KUE89XkeaaboIDiVFqKP4esvoLKGJ0fcqJXMofj4ad3tuQxAMs3F+qqrz9MclqhAHkex1aPZA==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
requiresBuild: true
dev: false
optional: true
/@next/swc-linux-arm64-gnu@13.2.3:
resolution: {integrity: sha512-/miIopDOUsuNlvjBjTipvoyjjaxgkOuvlz+cIbbPcm1eFvzX2ltSfgMgty15GuOiR8Hub4FeTSiq3g2dmCkzGA==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
@ -285,8 +243,8 @@ packages:
dev: false dev: false
optional: true optional: true
/@next/swc-linux-arm64-musl@13.2.3: /@next/swc-linux-arm64-musl@13.3.1:
resolution: {integrity: sha512-sujxFDhMMDjqhruup8LLGV/y+nCPi6nm5DlFoThMJFvaaKr/imhkXuk8uCTq4YJDbtRxnjydFv2y8laBSJVC2g==} resolution: {integrity: sha512-qz3BzjJRZ16Iq/jrp+pjiYOc0jTjHlfmxQmZk9x/+5uhRP6/eWQSTAPVJ33BMo6oK5O5N4644OgTAbzXzorecg==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
@ -294,8 +252,8 @@ packages:
dev: false dev: false
optional: true optional: true
/@next/swc-linux-x64-gnu@13.2.3: /@next/swc-linux-x64-gnu@13.3.1:
resolution: {integrity: sha512-w5MyxPknVvC9LVnMenAYMXMx4KxPwXuJRMQFvY71uXg68n7cvcas85U5zkdrbmuZ+JvsO5SIG8k36/6X3nUhmQ==} resolution: {integrity: sha512-6mgkLmwlyWlomQmpl21I3hxgqE5INoW4owTlcLpNsd1V4wP+J46BlI/5zV5KWWbzjfncIqzXoeGs5Eg+1GHODA==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
@ -303,8 +261,8 @@ packages:
dev: false dev: false
optional: true optional: true
/@next/swc-linux-x64-musl@13.2.3: /@next/swc-linux-x64-musl@13.3.1:
resolution: {integrity: sha512-CTeelh8OzSOVqpzMFMFnVRJIFAFQoTsI9RmVJWW/92S4xfECGcOzgsX37CZ8K982WHRzKU7exeh7vYdG/Eh4CA==} resolution: {integrity: sha512-uqm5sielhQmKJM+qayIhgZv1KlS5pqTdQ99b+Z7hMWryXS96qE0DftTmMZowBcUL6x7s2vSXyH5wPtO1ON7LBg==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
@ -312,8 +270,8 @@ packages:
dev: false dev: false
optional: true optional: true
/@next/swc-win32-arm64-msvc@13.2.3: /@next/swc-win32-arm64-msvc@13.3.1:
resolution: {integrity: sha512-7N1KBQP5mo4xf52cFCHgMjzbc9jizIlkTepe9tMa2WFvEIlKDfdt38QYcr9mbtny17yuaIw02FXOVEytGzqdOQ==} resolution: {integrity: sha512-WomIiTj/v3LevltlibNQKmvrOymNRYL+a0dp5R73IwPWN5FvXWwSELN/kiNALig/+T3luc4qHNTyvMCp9L6U5Q==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
@ -321,8 +279,8 @@ packages:
dev: false dev: false
optional: true optional: true
/@next/swc-win32-ia32-msvc@13.2.3: /@next/swc-win32-ia32-msvc@13.3.1:
resolution: {integrity: sha512-LzWD5pTSipUXTEMRjtxES/NBYktuZdo7xExJqGDMnZU8WOI+v9mQzsmQgZS/q02eIv78JOCSemqVVKZBGCgUvA==} resolution: {integrity: sha512-M+PoH+0+q658wRUbs285RIaSTYnGBSTdweH/0CdzDgA6Q4rBM0sQs4DHmO3BPP0ltCO/vViIoyG7ks66XmCA5g==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
@ -330,8 +288,8 @@ packages:
dev: false dev: false
optional: true optional: true
/@next/swc-win32-x64-msvc@13.2.3: /@next/swc-win32-x64-msvc@13.3.1:
resolution: {integrity: sha512-aLG2MaFs4y7IwaMTosz2r4mVbqRyCnMoFqOcmfTi7/mAS+G4IMH0vJp4oLdbshqiVoiVuKrAfqtXj55/m7Qu1Q==} resolution: {integrity: sha512-Sl1F4Vp5Z1rNXWZYqJwMuWRRol4bqOB6+/d7KqkgQ4AcafKPN1PZmpkCoxv4UFHtFNIB7EotnuIhtXu3zScicQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@ -650,8 +608,8 @@ packages:
resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==}
dev: true dev: true
/@swc/helpers@0.4.14: /@swc/helpers@0.5.0:
resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} resolution: {integrity: sha512-SjY/p4MmECVVEWspzSRpQEM3sjR17sP8PbGxELWrT+YZMBfiUyt1MRUNjMV23zohwlG2HYtCQOsCwsTHguXkyg==}
dependencies: dependencies:
tslib: 2.5.0 tslib: 2.5.0
dev: false dev: false
@ -677,10 +635,6 @@ packages:
'@types/unist': 2.0.6 '@types/unist': 2.0.6
dev: false dev: false
/@types/js-cookie@2.2.7:
resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==}
dev: false
/@types/js-cookie@3.0.3: /@types/js-cookie@3.0.3:
resolution: {integrity: sha512-Xe7IImK09HP1sv2M/aI+48a20VX+TdRJucfq4vfRVy6nWN8PYPOEnlMRSgxJAgYQIXJVL8dZ4/ilAM7dWNaOww==} resolution: {integrity: sha512-Xe7IImK09HP1sv2M/aI+48a20VX+TdRJucfq4vfRVy6nWN8PYPOEnlMRSgxJAgYQIXJVL8dZ4/ilAM7dWNaOww==}
dev: true dev: true
@ -864,10 +818,6 @@ packages:
eslint-visitor-keys: 3.4.0 eslint-visitor-keys: 3.4.0
dev: true dev: true
/@xobotyi/scrollbar-width@1.9.5:
resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==}
dev: false
/acorn-jsx@5.3.2(acorn@8.8.2): /acorn-jsx@5.3.2(acorn@8.8.2):
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies: peerDependencies:
@ -993,10 +943,6 @@ packages:
resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==}
dev: true dev: true
/asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
dev: false
/autoprefixer@10.4.14(postcss@8.4.21): /autoprefixer@10.4.14(postcss@8.4.21):
resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
@ -1023,16 +969,6 @@ packages:
engines: {node: '>=4'} engines: {node: '>=4'}
dev: true dev: true
/axios@1.3.5:
resolution: {integrity: sha512-glL/PvG/E+xCWwV8S6nCHcrfg1exGx7vxyUIivIA1iL7BIh6bePylCfVHwp6k13ao7SATxB6imau2kqY+I67kw==}
dependencies:
follow-redirects: 1.15.2
form-data: 4.0.0
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
dev: false
/axobject-query@3.1.1: /axobject-query@3.1.1:
resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==}
dependencies: dependencies:
@ -1081,6 +1017,13 @@ packages:
update-browserslist-db: 1.0.10(browserslist@4.21.5) update-browserslist-db: 1.0.10(browserslist@4.21.5)
dev: true dev: true
/busboy@1.6.0:
resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
engines: {node: '>=10.16.0'}
dependencies:
streamsearch: 1.1.0
dev: false
/call-bind@1.0.2: /call-bind@1.0.2:
resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
dependencies: dependencies:
@ -1152,13 +1095,6 @@ packages:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
dev: true dev: true
/combined-stream@1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
dependencies:
delayed-stream: 1.0.0
dev: false
/comma-separated-tokens@2.0.3: /comma-separated-tokens@2.0.3:
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
dev: false dev: false
@ -1172,12 +1108,6 @@ packages:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
dev: true dev: true
/copy-to-clipboard@3.3.3:
resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
dependencies:
toggle-selection: 1.0.6
dev: false
/cross-spawn@7.0.3: /cross-spawn@7.0.3:
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
@ -1187,20 +1117,6 @@ packages:
which: 2.0.2 which: 2.0.2
dev: true dev: true
/css-in-js-utils@3.1.0:
resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==}
dependencies:
hyphenate-style-name: 1.0.4
dev: false
/css-tree@1.1.3:
resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
engines: {node: '>=8.0.0'}
dependencies:
mdn-data: 2.0.14
source-map: 0.6.1
dev: false
/cssesc@3.0.0: /cssesc@3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -1281,11 +1197,6 @@ packages:
object-keys: 1.1.1 object-keys: 1.1.1
dev: true dev: true
/delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
dev: false
/dequal@2.0.3: /dequal@2.0.3:
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'} engines: {node: '>=6'}
@ -1329,6 +1240,14 @@ packages:
esutils: 2.0.3 esutils: 2.0.3
dev: true dev: true
/edge-csrf@1.0.3(next@13.3.1):
resolution: {integrity: sha512-miYuAv+tLaKw+niVD8Os5zQcMOB4Sdc748DKz3w6VIkou+WU2GHCUeL3fn9NyNeHAfNsUrOTB9Y/zlBVmnSTEQ==}
peerDependencies:
next: ^13.0.0
dependencies:
next: 13.3.1(react-dom@18.2.0)(react@18.2.0)
dev: false
/electron-to-chromium@1.4.356: /electron-to-chromium@1.4.356:
resolution: {integrity: sha512-nEftV1dRX3omlxAj42FwqRZT0i4xd2dIg39sog/CnCJeCcL1TRd2Uh0i9Oebgv8Ou0vzTPw++xc+Z20jzS2B6A==} resolution: {integrity: sha512-nEftV1dRX3omlxAj42FwqRZT0i4xd2dIg39sog/CnCJeCcL1TRd2Uh0i9Oebgv8Ou0vzTPw++xc+Z20jzS2B6A==}
dev: true dev: true
@ -1345,12 +1264,6 @@ packages:
tapable: 2.2.1 tapable: 2.2.1
dev: true dev: true
/error-stack-parser@2.1.4:
resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==}
dependencies:
stackframe: 1.3.4
dev: false
/es-abstract@1.21.2: /es-abstract@1.21.2:
resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@ -1444,8 +1357,8 @@ packages:
engines: {node: '>=12'} engines: {node: '>=12'}
dev: false dev: false
/eslint-config-next@13.2.3(eslint@8.33.0)(typescript@4.9.5): /eslint-config-next@13.3.1(eslint@8.33.0)(typescript@4.9.5):
resolution: {integrity: sha512-kPulHiQEHGei9hIaaNGygHRc0UzlWM+3euOmYbxNkd2Nbhci5rrCDeMBMPSV8xgUssphDGmwDHWbk4VZz3rlZQ==} resolution: {integrity: sha512-DieA5djybeE3Q0IqnDXihmhgRSp44x1ywWBBpVRA9pSx+m5Icj8hFclx7ffXlAvb9MMLN6cgj/hqJ4lka/QmvA==}
peerDependencies: peerDependencies:
eslint: ^7.23.0 || ^8.0.0 eslint: ^7.23.0 || ^8.0.0
typescript: '>=3.3.1' typescript: '>=3.3.1'
@ -1453,7 +1366,7 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@next/eslint-plugin-next': 13.2.3 '@next/eslint-plugin-next': 13.3.1
'@rushstack/eslint-patch': 1.2.0 '@rushstack/eslint-patch': 1.2.0
'@typescript-eslint/parser': 5.57.1(eslint@8.33.0)(typescript@4.9.5) '@typescript-eslint/parser': 5.57.1(eslint@8.33.0)(typescript@4.9.5)
eslint: 8.33.0 eslint: 8.33.0
@ -1778,6 +1691,7 @@ packages:
/fast-deep-equal@3.1.3: /fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
dev: true
/fast-diff@1.2.0: /fast-diff@1.2.0:
resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==}
@ -1802,18 +1716,6 @@ packages:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
dev: true dev: true
/fast-loops@1.1.3:
resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==}
dev: false
/fast-shallow-equal@1.0.0:
resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==}
dev: false
/fastest-stable-stringify@2.0.2:
resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==}
dev: false
/fastq@1.15.0: /fastq@1.15.0:
resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
dependencies: dependencies:
@ -1854,31 +1756,12 @@ packages:
resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
dev: true dev: true
/follow-redirects@1.15.2:
resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==}
engines: {node: '>=4.0'}
peerDependencies:
debug: '*'
peerDependenciesMeta:
debug:
optional: true
dev: false
/for-each@0.3.3: /for-each@0.3.3:
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
dependencies: dependencies:
is-callable: 1.2.7 is-callable: 1.2.7
dev: true dev: true
/form-data@4.0.0:
resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
engines: {node: '>= 6'}
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
dev: false
/fraction.js@4.2.0: /fraction.js@4.2.0:
resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
dev: true dev: true
@ -2105,10 +1988,6 @@ packages:
resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==}
dev: false dev: false
/hyphenate-style-name@1.0.4:
resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==}
dev: false
/ignore@5.2.4: /ignore@5.2.4:
resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
engines: {node: '>= 4'} engines: {node: '>= 4'}
@ -2142,13 +2021,6 @@ packages:
resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==}
dev: false dev: false
/inline-style-prefixer@6.0.4:
resolution: {integrity: sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==}
dependencies:
css-in-js-utils: 3.1.0
fast-loops: 1.1.3
dev: false
/internal-slot@1.0.5: /internal-slot@1.0.5:
resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@ -2353,10 +2225,6 @@ packages:
hasBin: true hasBin: true
dev: true dev: true
/js-cookie@2.2.1:
resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==}
dev: false
/js-cookie@3.0.1: /js-cookie@3.0.1:
resolution: {integrity: sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==} resolution: {integrity: sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==}
engines: {node: '>=12'} engines: {node: '>=12'}
@ -2594,10 +2462,6 @@ packages:
'@types/mdast': 3.0.11 '@types/mdast': 3.0.11
dev: false dev: false
/mdn-data@2.0.14:
resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
dev: false
/merge2@1.4.1: /merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
@ -2860,18 +2724,6 @@ packages:
picomatch: 2.3.1 picomatch: 2.3.1
dev: true dev: true
/mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
dev: false
/mime-types@2.1.35:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
dependencies:
mime-db: 1.52.0
dev: false
/mini-svg-data-uri@1.4.4: /mini-svg-data-uri@1.4.4:
resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==}
hasBin: true hasBin: true
@ -2907,24 +2759,6 @@ packages:
thenify-all: 1.6.0 thenify-all: 1.6.0
dev: true dev: true
/nano-css@5.3.5(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==}
peerDependencies:
react: '*'
react-dom: '*'
dependencies:
css-tree: 1.1.3
csstype: 3.1.2
fastest-stable-stringify: 2.0.2
inline-style-prefixer: 6.0.4
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
rtl-css-js: 1.16.1
sourcemap-codec: 1.4.8
stacktrace-js: 2.0.2
stylis: 4.1.3
dev: false
/nanoid@3.3.6: /nanoid@3.3.6:
resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@ -2938,12 +2772,12 @@ packages:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
dev: true dev: true
/next@13.2.3(react-dom@18.2.0)(react@18.2.0): /next@13.3.1(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-nKFJC6upCPN7DWRx4+0S/1PIOT7vNlCT157w9AzbXEgKy6zkiPKEt5YyRUsRZkmpEqBVrGgOqNfwecTociyg+w==} resolution: {integrity: sha512-eByWRxPzKHs2oQz1yE41LX35umhz86ZSZ+mYyXBqn2IBi2hyUqxBA88avywdr4uyH+hCJczegGsDGWbzQA5Rqw==}
engines: {node: '>=14.6.0'} engines: {node: '>=14.18.0'}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
'@opentelemetry/api': ^1.4.0 '@opentelemetry/api': ^1.1.0
fibers: '>= 3.1.0' fibers: '>= 3.1.0'
node-sass: ^6.0.0 || ^7.0.0 node-sass: ^6.0.0 || ^7.0.0
react: ^18.2.0 react: ^18.2.0
@ -2959,27 +2793,24 @@ packages:
sass: sass:
optional: true optional: true
dependencies: dependencies:
'@next/env': 13.2.3 '@next/env': 13.3.1
'@swc/helpers': 0.4.14 '@swc/helpers': 0.5.0
busboy: 1.6.0
caniuse-lite: 1.0.30001476 caniuse-lite: 1.0.30001476
postcss: 8.4.14 postcss: 8.4.14
react: 18.2.0 react: 18.2.0
react-dom: 18.2.0(react@18.2.0) react-dom: 18.2.0(react@18.2.0)
styled-jsx: 5.1.1(react@18.2.0) styled-jsx: 5.1.1(react@18.2.0)
optionalDependencies: optionalDependencies:
'@next/swc-android-arm-eabi': 13.2.3 '@next/swc-darwin-arm64': 13.3.1
'@next/swc-android-arm64': 13.2.3 '@next/swc-darwin-x64': 13.3.1
'@next/swc-darwin-arm64': 13.2.3 '@next/swc-linux-arm64-gnu': 13.3.1
'@next/swc-darwin-x64': 13.2.3 '@next/swc-linux-arm64-musl': 13.3.1
'@next/swc-freebsd-x64': 13.2.3 '@next/swc-linux-x64-gnu': 13.3.1
'@next/swc-linux-arm-gnueabihf': 13.2.3 '@next/swc-linux-x64-musl': 13.3.1
'@next/swc-linux-arm64-gnu': 13.2.3 '@next/swc-win32-arm64-msvc': 13.3.1
'@next/swc-linux-arm64-musl': 13.2.3 '@next/swc-win32-ia32-msvc': 13.3.1
'@next/swc-linux-x64-gnu': 13.2.3 '@next/swc-win32-x64-msvc': 13.3.1
'@next/swc-linux-x64-musl': 13.2.3
'@next/swc-win32-arm64-msvc': 13.2.3
'@next/swc-win32-ia32-msvc': 13.2.3
'@next/swc-win32-x64-msvc': 13.2.3
transitivePeerDependencies: transitivePeerDependencies:
- '@babel/core' - '@babel/core'
- babel-plugin-macros - babel-plugin-macros
@ -3322,10 +3153,6 @@ packages:
resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==}
dev: false dev: false
/proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
dev: false
/punycode@2.3.0: /punycode@2.3.0:
resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
engines: {node: '>=6'} engines: {node: '>=6'}
@ -3340,16 +3167,6 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
dev: true dev: true
/react-confetti@6.1.0(react@18.2.0):
resolution: {integrity: sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==}
engines: {node: '>=10.18'}
peerDependencies:
react: ^16.3.0 || ^17.0.1 || ^18.0.0
dependencies:
react: 18.2.0
tween-functions: 1.2.0
dev: false
/react-dom@18.2.0(react@18.2.0): /react-dom@18.2.0(react@18.2.0):
resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
peerDependencies: peerDependencies:
@ -3455,40 +3272,6 @@ packages:
tslib: 2.5.0 tslib: 2.5.0
dev: false dev: false
/react-universal-interface@0.6.2(react@18.2.0)(tslib@2.5.0):
resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==}
peerDependencies:
react: '*'
tslib: '*'
dependencies:
react: 18.2.0
tslib: 2.5.0
dev: false
/react-use@17.4.0(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
dependencies:
'@types/js-cookie': 2.2.7
'@xobotyi/scrollbar-width': 1.9.5
copy-to-clipboard: 3.3.3
fast-deep-equal: 3.1.3
fast-shallow-equal: 1.0.0
js-cookie: 2.2.1
nano-css: 5.3.5(react-dom@18.2.0)(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.5.0)
resize-observer-polyfill: 1.5.1
screenfull: 5.2.0
set-harmonic-interval: 1.0.1
throttle-debounce: 3.0.1
ts-easing: 0.2.0
tslib: 2.5.0
dev: false
/react@18.2.0: /react@18.2.0:
resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -3568,10 +3351,6 @@ packages:
resolution: {integrity: sha512-q54ra2QutYDZpuSnFjmeagmEiN9IMo56/zz5dDNitzKD23oFRw77cWo4TsrAdmdkPiEn8mxlrTqxnkujDbEGww==} resolution: {integrity: sha512-q54ra2QutYDZpuSnFjmeagmEiN9IMo56/zz5dDNitzKD23oFRw77cWo4TsrAdmdkPiEn8mxlrTqxnkujDbEGww==}
dev: false dev: false
/resize-observer-polyfill@1.5.1:
resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
dev: false
/resolve-from@4.0.0: /resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -3607,12 +3386,6 @@ packages:
glob: 7.2.3 glob: 7.2.3
dev: true dev: true
/rtl-css-js@1.16.1:
resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==}
dependencies:
'@babel/runtime': 7.21.0
dev: false
/run-parallel@1.2.0: /run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
dependencies: dependencies:
@ -3640,11 +3413,6 @@ packages:
loose-envify: 1.4.0 loose-envify: 1.4.0
dev: false dev: false
/screenfull@5.2.0:
resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==}
engines: {node: '>=0.10.0'}
dev: false
/semver@6.3.0: /semver@6.3.0:
resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
hasBin: true hasBin: true
@ -3658,11 +3426,6 @@ packages:
lru-cache: 6.0.0 lru-cache: 6.0.0
dev: true dev: true
/set-harmonic-interval@1.0.1:
resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==}
engines: {node: '>=6.9'}
dev: false
/shebang-command@2.0.0: /shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -3697,50 +3460,10 @@ packages:
resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
/source-map@0.5.6:
resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==}
engines: {node: '>=0.10.0'}
dev: false
/source-map@0.6.1:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
dev: false
/sourcemap-codec@1.4.8:
resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
deprecated: Please use @jridgewell/sourcemap-codec instead
dev: false
/space-separated-tokens@2.0.2: /space-separated-tokens@2.0.2:
resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
dev: false dev: false
/stack-generator@2.0.10:
resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==}
dependencies:
stackframe: 1.3.4
dev: false
/stackframe@1.3.4:
resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==}
dev: false
/stacktrace-gps@3.1.2:
resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==}
dependencies:
source-map: 0.5.6
stackframe: 1.3.4
dev: false
/stacktrace-js@2.0.2:
resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==}
dependencies:
error-stack-parser: 2.1.4
stack-generator: 2.0.10
stacktrace-gps: 3.1.2
dev: false
/stop-iteration-iterator@1.0.0: /stop-iteration-iterator@1.0.0:
resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@ -3748,6 +3471,11 @@ packages:
internal-slot: 1.0.5 internal-slot: 1.0.5
dev: true dev: true
/streamsearch@1.1.0:
resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
engines: {node: '>=10.0.0'}
dev: false
/string.prototype.matchall@4.0.8: /string.prototype.matchall@4.0.8:
resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==}
dependencies: dependencies:
@ -3826,10 +3554,6 @@ packages:
react: 18.2.0 react: 18.2.0
dev: false dev: false
/stylis@4.1.3:
resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==}
dev: false
/sucrase@3.31.0: /sucrase@3.31.0:
resolution: {integrity: sha512-6QsHnkqyVEzYcaiHsOKkzOtOgdJcb8i54x6AV2hDwyZcY9ZyykGZVw6L/YN98xC0evwTP6utsWWrKRaa8QlfEQ==} resolution: {integrity: sha512-6QsHnkqyVEzYcaiHsOKkzOtOgdJcb8i54x6AV2hDwyZcY9ZyykGZVw6L/YN98xC0evwTP6utsWWrKRaa8QlfEQ==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -3933,11 +3657,6 @@ packages:
any-promise: 1.3.0 any-promise: 1.3.0
dev: true dev: true
/throttle-debounce@3.0.1:
resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==}
engines: {node: '>=10'}
dev: false
/tiny-glob@0.2.9: /tiny-glob@0.2.9:
resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==}
dependencies: dependencies:
@ -3952,10 +3671,6 @@ packages:
is-number: 7.0.0 is-number: 7.0.0
dev: true dev: true
/toggle-selection@1.0.6:
resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
dev: false
/trim-lines@3.0.1: /trim-lines@3.0.1:
resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
dev: false dev: false
@ -3964,10 +3679,6 @@ packages:
resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==}
dev: false dev: false
/ts-easing@0.2.0:
resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==}
dev: false
/ts-interface-checker@0.1.13: /ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
dev: true dev: true
@ -3998,10 +3709,6 @@ packages:
typescript: 4.9.5 typescript: 4.9.5
dev: true dev: true
/tween-functions@1.2.0:
resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==}
dev: false
/type-check@0.4.0: /type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}

View file

@ -7,9 +7,6 @@ const AppLink = forwardRef<HTMLAnchorElement, Parameters<typeof Link>[0]>((props
if (props.target === '_blank') { if (props.target === '_blank') {
return <a ref={ref} {...props} href={props.href.toString()} />; return <a ref={ref} {...props} href={props.href.toString()} />;
} }
if (props['aria-disabled']) {
return <span ref={ref} {...props} />;
}
return <Link ref={ref} {...props} href={props.href} />; return <Link ref={ref} {...props} href={props.href} />;
}); });

View file

@ -1,23 +1,28 @@
import { getURL } from '@/lib/utils';
import AppLink from './AppLink';
import Icon from './Icon'; import Icon from './Icon';
export default function Card({ export default function Card({
isLoading, isLoading,
icon, icon,
title, title,
data data,
link
}: { }: {
isLoading: boolean; isLoading: boolean;
icon: string; icon: string;
title: string; title: string;
data: any; data: any;
link?: string;
}) { }) {
if (isLoading) if (isLoading)
return ( return (
<div className="flex w-full items-center space-x-4 rounded-lg border-2 border-highlight-primary bg-primary-700 p-4 shadow-md"> <div className="flex w-full items-center space-x-4 rounded-lg border-2 border-highlight-primary bg-primary-700 p-4 shadow-md">
<Icon name={icon} className="text-2xl text-muted" /> <Icon name={icon} className="text-2xl text-muted" />
<div className="flex flex-col space-y-4"> <div className="flex flex-col space-y-4">
<span className="h-4 w-32 animate-pulse rounded bg-highlight-primary" /> <span className="h-[18px] w-32 animate-pulse rounded bg-highlight-primary" />
<span className="h-4 w-24 animate-pulse rounded bg-highlight-primary" /> <span className="h-[18px] w-24 animate-pulse rounded bg-highlight-primary" />
</div> </div>
</div> </div>
); );
@ -25,9 +30,19 @@ export default function Card({
return ( return (
<div className="flex w-full items-center space-x-4 rounded-lg border-2 border-highlight-primary bg-primary-700 p-4 shadow-md"> <div className="flex w-full items-center space-x-4 rounded-lg border-2 border-highlight-primary bg-primary-700 p-4 shadow-md">
<Icon name={icon} className="text-2xl text-muted" /> <Icon name={icon} className="text-2xl text-muted" />
<div className="flex flex-col"> <div className="flex w-full items-center justify-between">
<h3 className="text-xl font-semibold">{data}</h3> <div className="flex-col">
<p className="text-muted">{title}</p> <h2 className="text-xl font-semibold">{data}</h2>
<p className="text-muted">{title}</p>
</div>
{link && (
<AppLink
className="text-highlight-secondary transition-colors duration-150 hover:text-brand"
href={getURL(link)}
>
<Icon name="arrow-right-line" />
</AppLink>
)}
</div> </div>
</div> </div>
); );

View file

@ -1,45 +0,0 @@
import { type Puzzle } from '@/lib/puzzles';
import AppLink from './AppLink';
export default function CardTable({ puzzles }: { puzzles: Puzzle[] }) {
return (
<></>
// <div className="relative flex h-96 w-full overflow-scroll">
// <table className="w-full table-auto border-collapse rounded-lg border-2 border-highlight-primary bg-primary-700 text-left text-sm text-muted shadow-md">
// {/* <thead className="z-1 sticky -top-1 bg-primary-600 text-xs uppercase text-white ">
// <tr>
// <th className="px-6 py-3">Exercice</th>
// <th className="px-6 py-3">Tentative</th>
// <th className="px-6 py-3">Score</th>
// <th className="px-6 py-3">Dernier essai</th>
// <th className="px-6 py-3">
// <span className="sr-only">Reprendre</span>
// </th>
// </tr>
// </thead> */}
// <tbody className="overflow-scroll">
// {puzzles.length &&
// puzzles.map((puzzle) => (
// <tr key={puzzle.id} className="bg-primary-700 hover:bg-primary-800 ">
// <th scope="row" className="whitespace-nowrap px-6 py-4 font-medium text-white">
// {puzzle.name}
// </th>
// <td className="px-6 py-4">30</td>
// <td className="px-6 py-4">300</td>
// <td className="px-6 py-4">10/10/2010</td>
// <td className="px-6 py-4 text-right">
// <AppLink
// href={`dashboard/puzzles/${puzzle.id}`}
// className="font-medium text-brand hover:underline"
// >
// Reprendre
// </AppLink>
// </td>
// </tr>
// ))}
// </tbody>
// </table>
// </div>
);
}

View file

@ -1,37 +1,40 @@
'use client'; 'use client';
import { AnimatePresence, motion } from 'framer-motion'; import { AnimatePresence, motion } from 'framer-motion';
import useSWRSubscription, { type SWRSubscription } from 'swr/subscription';
import { type ScoreEvent } from '@/lib/leaderboard'; import { useLeaderboardEvent } from '@/lib/hooks/use-leaderboard';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';
import Podium from '@/ui/events/podium/Podium'; import Podium from '@/ui/events/podium/Podium';
import { Timer } from './Timer'; import { Timer } from './Timer';
import { type ScoreEvent } from '@/lib/leaderboard';
import useSWRSubscription, { type SWRSubscription } from 'swr/subscription';
const SCORE_COLORS = ['text-yellow-400', 'text-gray-400', 'text-orange-400']; const SCORE_COLORS = ['text-yellow-400', 'text-gray-400', 'text-orange-400'];
export default function Leaderboard() { export default function Leaderboard({ token }: { token: string }) {
// TODO CHANGER CECI // TODO CHANGER CECI
const CHAPITRE_EVENT = 1; const CHAPITRE_EVENT = 1;
const subscription: SWRSubscription<string, ScoreEvent, Error> = (key, { next }) => { // const subscription: SWRSubscription<string, ScoreEvent, Error> = (key, { next }) => {
const socket = new WebSocket(key); // const socket = new WebSocket(key);
socket.addEventListener('message', (event) => { // socket.addEventListener('message', (event) => {
next(null, JSON.parse(event.data)); // next(null, JSON.parse(event.data));
}); // });
socket.addEventListener('error', (event) => { // socket.addEventListener('error', (event) => {
console.error(event); // console.error(event);
}); // });
return () => socket.close(); // return () => socket.close();
}; // };
const { data } = useSWRSubscription( // const { data } = useSWRSubscription(
`wss://${process.env.NEXT_PUBLIC_API_URL?.split('//')[1]}/rleaderboard/${CHAPITRE_EVENT}`, // `wss://${process.env.NEXT_PUBLIC_API_URL?.split('//')[1]}/rleaderboard/${CHAPITRE_EVENT}`,
subscription // subscription
); // );
const { data, isLoading } = useLeaderboardEvent({ token: token, id: CHAPITRE_EVENT });
const scores = [data?.groups] const scores = [data?.groups]
.flat() .flat()
@ -60,8 +63,8 @@ export default function Leaderboard() {
const tries = group.players.reduce((a, b) => a + b.tries, 0) || 0; const tries = group.players.reduce((a, b) => a + b.tries, 0) || 0;
return ( return (
<motion.li <motion.li
layout
initial={{ opacity: 0, y: -10 }} initial={{ opacity: 0, y: -10 }}
// @ts-ignore TODO Je sais pas c'est quoi cette merde
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -10 }} exit={{ opacity: 0, y: -10 }}
transition={{ duration: 0.5 }} transition={{ duration: 0.5 }}
@ -69,13 +72,18 @@ export default function Leaderboard() {
className="flex justify-between space-x-2" className="flex justify-between space-x-2"
> >
<div className="flex items-center space-x-4"> <div className="flex items-center space-x-4">
<span className={cn('font-semibold', SCORE_COLORS[group.rank - 1])}> <span
className={cn(
'font-semibold text-highlight-secondary',
SCORE_COLORS[group.rank - 1]
)}
>
{group.rank} {group.rank}
</span> </span>
<div className="flex items-center space-x-2"> <div className="flex items-center space-x-2">
<div className="flex flex-col gap-x-2 sm:flex-row sm:items-center"> <div className="flex flex-col gap-x-2 sm:flex-row sm:items-center">
<span className="text-lg">{group.name}</span> <span className="text-lg">{group.name}</span>
<span className="text-sm text-muted"> <span className="text-sm text-highlight-secondary">
{group.players && group.players.length > 1 {group.players && group.players.length > 1
? group.players ? group.players
.map((player) => player.pseudo || 'Anonyme') .map((player) => player.pseudo || 'Anonyme')
@ -89,15 +97,15 @@ export default function Leaderboard() {
<div className="flex items-center space-x-4"> <div className="flex items-center space-x-4">
{/* <div className="flex flex-col"> {/* <div className="flex flex-col">
<span className="text-sm font-semibold">Puzzle{puzzles > 1 ? 's' : ''}</span> <span className="text-sm font-semibold">Puzzle{puzzles > 1 ? 's' : ''}</span>
<span className="text-lg text-muted">{puzzles}</span> <span className="text-lg text-highlight-secondary">{puzzles}</span>
</div> */} </div> */}
<div className="flex flex-col"> <div className="flex flex-col">
<span className="text-sm font-semibold">Essai{tries > 1 ? 's' : ''}</span> <span className="text-sm font-semibold">Essai{tries > 1 ? 's' : ''}</span>
<span className="text-lg text-muted">{tries}</span> <span className="text-lg text-highlight-secondary">{tries}</span>
</div> </div>
<div className="flex flex-col"> <div className="flex flex-col">
<span className="text-sm font-semibold">Score</span> <span className="text-sm font-semibold">Score</span>
<span className="text-lg text-muted"> <span className="text-lg text-highlight-secondary">
{group.players.reduce((a, b) => a + b.score, 0)} {group.players.reduce((a, b) => a + b.score, 0)}
</span> </span>
</div> </div>

View file

@ -257,14 +257,14 @@ function PuzzleProp({ puzzle, chapter }: { puzzle: Puzzle; chapter: Chapter }) {
{puzzle.tags {puzzle.tags
.filter((tag) => !['easy', 'medium', 'hard'].includes(tag.name)) .filter((tag) => !['easy', 'medium', 'hard'].includes(tag.name))
.map((tag, i) => ( .map((tag, i) => (
<span key={i} className="inline-block rounded-md bg-primary-900 px-2 py-1"> <span key={i} className="inline-block rounded-md bg-primary-800 px-2 py-1">
{tag.name} {tag.name}
</span> </span>
))} ))}
</div> </div>
)} )}
<Icon <Icon
className="-translate-x-2 transform-gpu duration-300 group-hover:translate-x-0" className="-translate-x-2 transform-gpu text-highlight-secondary duration-300 group-hover:translate-x-0 group-hover:text-brand"
name="arrow-right-line" name="arrow-right-line"
/> />
</div> </div>
@ -292,7 +292,7 @@ function PuzzleProp({ puzzle, chapter }: { puzzle: Puzzle; chapter: Chapter }) {
</div> </div>
)} )}
<Icon <Icon
className="-translate-x-2 transform-gpu duration-300 group-hover:translate-x-0" className="-translate-x-2 transform-gpu text-highlight-secondary duration-300 group-hover:translate-x-0"
name="arrow-right-line" name="arrow-right-line"
/> />
</div> </div>

View file

@ -1,7 +1,5 @@
import clsx from 'clsx'; import clsx from 'clsx';
import { useEffect, useReducer } from 'react'; import { useEffect, useReducer } from 'react';
import { useWindowSize } from 'react-use';
import Confetti from 'react-confetti';
type State = { type State = {
hours: number; hours: number;
@ -24,8 +22,6 @@ function reducer(state: State, action: Action): State {
} }
export function Timer({ targetDate, className }: { targetDate: Date; className?: string }) { export function Timer({ targetDate, className }: { targetDate: Date; className?: string }) {
const { width, height } = useWindowSize();
const [timeRemaining, dispatch] = useReducer(reducer, { const [timeRemaining, dispatch] = useReducer(reducer, {
hours: 0, hours: 0,
minutes: 0, minutes: 0,
@ -52,7 +48,6 @@ export function Timer({ targetDate, className }: { targetDate: Date; className?:
if (timeRemaining.hours < 0) { if (timeRemaining.hours < 0) {
return ( return (
<> <>
{/* <Confetti width={width} height={height} /> */}
<span className={clsx(className)}>Terminé</span> <span className={clsx(className)}>Terminé</span>
</> </>
); );

View file

@ -13,7 +13,7 @@ export default function ToHTML({ data, className }: { data: string; className?:
a: ({ node, ...props }) => ( a: ({ node, ...props }) => (
<a <a
{...props} {...props}
className="inline text-brand-accent hover:text-brand hover:underline" className="inline text-brand transition-colors duration-150 hover:text-brand-accent hover:underline"
// MAKE thIS SHIT DOWNLOADABLE // MAKE thIS SHIT DOWNLOADABLE
target="_blank" target="_blank"
rel="noopener" rel="noopener"

View file

@ -37,6 +37,7 @@ export default function UserAuthForm() {
avatar: '' avatar: ''
} }
}); });
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const router = useRouter(); const router = useRouter();
const pathname = usePathname()!; const pathname = usePathname()!;
@ -101,6 +102,7 @@ export default function UserAuthForm() {
<form <form
className="flex w-52 flex-col justify-center space-y-4 sm:w-72" className="flex w-52 flex-col justify-center space-y-4 sm:w-72"
onSubmit={handleSubmit(onSubmit)} onSubmit={handleSubmit(onSubmit)}
method="POST"
> >
{!isSignIn && ( {!isSignIn && (
<> <>

View file

@ -90,13 +90,12 @@ function NavItem({
onClick?: () => void; onClick?: () => void;
}) { }) {
const segment = useSelectedLayoutSegment(); const segment = useSelectedLayoutSegment();
const pathname = segment?.split('/').pop() || '';
const isHttp = item.slug.includes('http'); const isHttp = item.slug.includes('http');
const isActive = pathname === item.slug || (item.slug === '' && !segment); const pathname = item.slug.split('/').pop();
const isActive = segment === pathname || (segment === null && pathname === 'dashboard');
return ( return (
<AppLink <AppLink
aria-disabled={item.disabled} href={isHttp ? item.slug : `/${item.slug}`}
href={isHttp ? item.slug : `dashboard/${item.slug}`}
target={isHttp ? '_blank' : undefined} target={isHttp ? '_blank' : undefined}
rel={isHttp ? 'noopener noreferrer' : undefined} rel={isHttp ? 'noopener noreferrer' : undefined}
className={cn( className={cn(