commit 5e07a8952ee7b957b0c489ea1a6fe8038aa5bf93 Author: inmake Date: Mon Aug 7 15:05:18 2023 +0500 upd diff --git a/.env b/.env new file mode 100644 index 0000000..e71c4db --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +# VITE_COORD_URL=http://localhost:4000 +VITE_COORD_URL=https://coord.graff.tech \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..4020bcb --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,14 @@ +module.exports = { + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + parser: '@typescript-eslint/parser', + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': 'warn', + }, +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/ecosystem.config.cjs b/ecosystem.config.cjs new file mode 100644 index 0000000..716c210 --- /dev/null +++ b/ecosystem.config.cjs @@ -0,0 +1,10 @@ +module.exports = { + apps: [ + { + name: "stream.graff.tech-client", + exec_mode: "cluster", + script: "yarn", + args: "preview --host", + }, + ], +}; diff --git a/index.html b/index.html new file mode 100644 index 0000000..2d0d634 --- /dev/null +++ b/index.html @@ -0,0 +1,17 @@ + + + + + + + + Удаленная демонстрация + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..c983c65 --- /dev/null +++ b/package.json @@ -0,0 +1,55 @@ +{ + "name": "ps2-react-client", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@epicgames-ps/lib-pixelstreamingfrontend-ue5.3": "^0.0.2", + "@uidotdev/usehooks": "^2.0.1", + "date-fns": "^2.30.0", + "i18next": "^22.5.0", + "i18next-browser-languagedetector": "^7.0.2", + "ky": "^0.33.3", + "react": "^18.2.0", + "react-calendar": "^4.3.0", + "react-countdown": "^2.3.5", + "react-dom": "^18.2.0", + "react-full-screen": "^1.1.1", + "react-i18next": "^12.3.1", + "react-input-mask": "^2.0.4", + "react-qr-code": "^2.0.11", + "react-router-dom": "^6.11.2", + "react-timeit": "^1.2.12", + "react-toastify": "^9.1.3", + "react-transition-group": "^4.4.5", + "socket.io-client": "^4.6.2", + "ua-parser-js": "^1.0.35", + "use-clipboard-copy": "^0.2.0", + "usehooks-ts": "^2.9.1", + "zustand": "^4.3.9" + }, + "devDependencies": { + "@types/react": "^18.0.28", + "@types/react-dom": "^18.0.11", + "@types/react-input-mask": "^3.0.2", + "@types/react-transition-group": "^4.4.6", + "@types/ua-parser-js": "^0.7.36", + "@typescript-eslint/eslint-plugin": "^5.57.1", + "@typescript-eslint/parser": "^5.57.1", + "@vitejs/plugin-react-swc": "^3.0.0", + "autoprefixer": "^10.4.14", + "eslint": "^8.38.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.3.4", + "postcss": "^8.4.23", + "tailwindcss": "^3.3.2", + "typescript": "^5.0.2", + "vite": "^4.3.2" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..b8ec576 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/icons/Aivaz.svg b/public/icons/Aivaz.svg new file mode 100644 index 0000000..107242a --- /dev/null +++ b/public/icons/Aivaz.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/Masharov.svg b/public/icons/Masharov.svg new file mode 100644 index 0000000..406a7ea --- /dev/null +++ b/public/icons/Masharov.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/Residence.svg b/public/icons/Residence.svg new file mode 100644 index 0000000..2661bca --- /dev/null +++ b/public/icons/Residence.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/icons/Revolution.svg b/public/icons/Revolution.svg new file mode 100644 index 0000000..c8e08ae --- /dev/null +++ b/public/icons/Revolution.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/Shipyard.svg b/public/icons/Shipyard.svg new file mode 100644 index 0000000..59483b5 --- /dev/null +++ b/public/icons/Shipyard.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/cards/aivaz.jpg b/public/images/cards/aivaz.jpg new file mode 100644 index 0000000..c0c5295 Binary files /dev/null and b/public/images/cards/aivaz.jpg differ diff --git a/public/images/cards/liferes.jpg b/public/images/cards/liferes.jpg new file mode 100644 index 0000000..d2f434f Binary files /dev/null and b/public/images/cards/liferes.jpg differ diff --git a/public/images/cards/nks.jpg b/public/images/cards/nks.jpg new file mode 100644 index 0000000..cbf428e Binary files /dev/null and b/public/images/cards/nks.jpg differ diff --git a/public/images/cards/shipyard.jpg b/public/images/cards/shipyard.jpg new file mode 100644 index 0000000..285c2f5 Binary files /dev/null and b/public/images/cards/shipyard.jpg differ diff --git a/public/images/shapes/shape-1.svg b/public/images/shapes/shape-1.svg new file mode 100644 index 0000000..c919fbb --- /dev/null +++ b/public/images/shapes/shape-1.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/shapes/shape-2.svg b/public/images/shapes/shape-2.svg new file mode 100644 index 0000000..c2db489 --- /dev/null +++ b/public/images/shapes/shape-2.svg @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/logo.svg b/public/logo.svg new file mode 100644 index 0000000..e393465 --- /dev/null +++ b/public/logo.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000..dfeb349 --- /dev/null +++ b/src/App.css @@ -0,0 +1,30 @@ +@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"); +@import url("https://gistcdn.githack.com/mfd/09b70eb47474836f25a21660282ce0fd/raw/e06a670afcb2b861ed2ac4a1ef752d062ef6b46b/Gilroy.css"); + +.bg-gradient-card { + background: linear-gradient( + 180deg, + rgba(20, 22, 31, 0.27) 45.71%, + rgba(20, 22, 31, 0.9) 100% + ); +} + +.feedback-field:focus ~ .feedback-placeholder { + top: 0; +} + +.feedback-field:focus ~ .feedback-placeholder-2 { + opacity: 0; +} + +.feedback-field:valid ~ .feedback-placeholder { + top: 0; +} + +.feedback-field:valid ~ .feedback-placeholder-2 { + opacity: 0; +} + +.feedback-field::placeholder { + @apply lg:text-base text-sm font-semibold text-[#77787d]; +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..8751ff4 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,460 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable no-irregular-whitespace */ +import "./App.css"; +import { Trans, useTranslation } from "react-i18next"; +import FeedbackForm from "./components/FeedbackForm"; +import ArrowRightIcon from "./components/icons/ArrowRightIcon"; +import LogoIcon from "./components/icons/LogoIcon"; +import MailIcon from "./components/icons/MailIcon"; +import PhoneIcon from "./components/icons/PhoneIcon"; +import TelegramIcon from "./components/icons/TelegramIcon"; +import VKIcon from "./components/icons/VKIcon"; +import YouTubeIcon from "./components/icons/YouTubeIcon"; +import Sidebar from "./components/Sidebar"; +import Header from "./components/Header"; +import { Transition } from "react-transition-group"; +import useSidebarStore from "./stores/useSidebarStore"; +import { useEffect, useState } from "react"; +import ky from "ky"; +import { useNavigate, useSearchParams } from "react-router-dom"; +import { ToastContainer, toast } from "react-toastify"; + +function App() { + const [isOpen] = useSidebarStore((state) => [state.isOpen]); + + const navigate = useNavigate(); + const [loading, setLoading] = useState(false); + const [countdownTimer, setCountdownTimer] = useState(10); + // const host = window.location.host; + + const [searchParams] = useSearchParams(); + // const location = searchParams.get("location") || "a1"; + + const { t, i18n } = useTranslation(); + const location = i18n.language === "ru" ? "a1" : "a2"; + const build = searchParams.get("build") || null; + + function toastError(text: string) { + toast.error(text, { + position: "bottom-right", + autoClose: 5000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: "dark", + }); + } + + async function startStream(title: string) { + setLoading(true); + + const response: { stream: string } = await ky + .get( + `${ + import.meta.env.VITE_COORD_URL + }/start?location=${location}&title=${title}` + ) + .json(); + + if (response.stream) { + setInterval(() => { + setCountdownTimer((prev) => prev - 1); + }, 1000); + + setTimeout(() => { + navigate(`/stream/${response.stream}`); + }, 10000); + } else { + setLoading(false); + toastError("Превышен лимит одновременных сессий, попробуйте позже."); + } + } + + useEffect(() => { + if (build) { + void startStream(build); + } + }, []); + + useEffect(() => { + document.title = t("title"); + }, [i18n.language]); + + return ( + <> + {!loading ? ( + <> +
+
+
void i18n.changeLanguage(lang)} + /> + +
+
+ +
+ +
+

+ + Доступные +
+ демонстрации +
+

+

+ + Клиент из любой точки мира может посмотреть жилой + комплекс, даже на нулевом этапе строительства. Он выберет + лучшую планировку и оценит вид из окон своей будущей + квартиры. + +

+
+ +
+
+
+ +
+
+

+ + МФК «Revolution towers» + +

+

+ + Россия, Екатеринбург + +

+
+ + +
+
+ +
+ {i18n.language === "ru" ? ( + <> +
+
+ +
+
+

+ + ЖК «Life Резиденция» + +

+

+ + Россия, Тюмень + +

+
+ + +
+
+ +
+
+ +
+
+

+ + ЖК «Айвазовский City» + +

+

+ + Россия, Тюмень + +

+
+ + +
+
+ + ) : ( +
+
+ +
+
+

+ {/* */} + IMI Saudi Shipyard + {/* */} +

+

+ {/* */} + Saudi Arabia + {/* */} +

+
+ + +
+
+ )} +
+
+
+ +
+
+
+
+

+ + Свяжитесь +
с нами +
+

+

+ + Хотите увеличить конверсию? +
+ Давайте обсудим детали! +
+

+
+
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+

+ Горячая линия +

+
+
+ + + +
+
+

+ + Социальные +
+ сети +
+

+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+

+ + + Политика конфиденциальности + + + + estate.graff.tech + +

+

+ © 2023 GRAFF interactive.{" "} + + Все права защищены. + +

+
+
+ +
+
+ +
+ RU +
+
+
+ +
+
+ +
+ UAE +
+
+
+
+
+
+
+ + + {(state) => } + + + + + ) : ( +
+

+ + + + + + Загрузка + ... {countdownTimer} сек + +

+
+ )} + + ); +} + +export default App; diff --git a/src/CalendarPage.css b/src/CalendarPage.css new file mode 100644 index 0000000..fbe4ae7 --- /dev/null +++ b/src/CalendarPage.css @@ -0,0 +1,45 @@ +.react-calendar { + font-family: "Gilroy"; + @apply bg-[#151619] text-white border-none p-4 + rounded-lg; +} + +.react-calendar__navigation button:enabled:hover, +.react-calendar__navigation button:enabled:focus, +.react-calendar__tile:enabled:hover { + @apply bg-[rgba(255,255,255,0.05)]; +} + +.react-calendar__tile:enabled:focus { + @apply bg-[rgba(255,255,255,0.2)]; +} + +.react-calendar__month-view__days__day--weekend { + @apply text-[#F2F2F2]; +} + +.react-calendar__month-view__weekdays { + @apply font-normal lowercase text-base; +} + +abbr[title] { + text-decoration: none; +} + +.react-calendar__navigation button, +.react-calendar__tile { + @apply rounded; +} + +.react-calendar__tile--now:enabled { + background-color: #212121; +} + +.react-calendar__tile--active { + background: #1087ff !important; +} + +.react-calendar__navigation button:disabled, +.react-calendar__tile:disabled { + @apply text-zinc-800 bg-transparent; +} diff --git a/src/CalendarPage.tsx b/src/CalendarPage.tsx new file mode 100644 index 0000000..4a211e8 --- /dev/null +++ b/src/CalendarPage.tsx @@ -0,0 +1,361 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { FormEvent, useEffect, useState } from "react"; +import Calendar from "react-calendar"; +import "react-calendar/dist/Calendar.css"; +import "./CalendarPage.css"; +import { + format, + isBefore, + differenceInBusinessDays, + setHours, + getHours, + setMinutes, + getMinutes, + setSeconds, + setMilliseconds, +} from "date-fns"; +import ru from "date-fns/locale/ru"; +import ky from "ky"; +import { useParams } from "react-router-dom"; +import InputMask from "react-input-mask"; + +function CalendarPage() { + const params = useParams(); + const [step, setStep] = useState(1); + const [date, setDate] = useState(new Date()); + const [name, setName] = useState(""); + const [email, setEmail] = useState(""); + const [phone, setPhone] = useState(""); + const [link, setLink] = useState(""); + const [datesAndTimes, setDatesAndTimes] = useState([]); + const [scheduledSessions, setScheduledSessions] = useState([]); + + async function selectDate(value: any) { + await getScheduledSessions(value); + + setDate(value); + setStep((prev) => prev + 1); + } + + async function getScheduledSessions(value: Date) { + const username = params.username; + + const result: any[] = await ky + .get( + `${ + import.meta.env.VITE_COORD_URL + }/scheduled_sessions/${username}?date=${value.toISOString()}` + ) + .json(); + + console.log(scheduledSessions); + + setScheduledSessions(result); + } + + function selectTime(value: any) { + let newDate = date; + newDate = setHours(date, getHours(value)); + newDate = setMinutes(newDate, getMinutes(value)); + newDate = setSeconds(newDate, 0); + newDate = setMilliseconds(newDate, 0); + + setDate(newDate); + setStep((prev) => prev + 1); + } + + async function addSchedule(e: FormEvent) { + e.preventDefault(); + + const username = params.username; + const title = "nksJukovaDev"; + const startAt = date; + + try { + const result: any = await ky + .post(`${import.meta.env.VITE_COORD_URL}/scheduled_sessions`, { + json: { + username, + name, + email, + phone, + title, + startAt, + }, + }) + .json(); + + if (!result.userInviteLink) { + alert(result.error); + return; + } + + setLink(result.userInviteLink); + setName(""); + setEmail(""); + setPhone(""); + setStep(4); + } catch (error: any) { + alert(error.message); + } + } + + async function getSessionScheduleSettings() { + const username = params.username; + + try { + const result: any = await ky + .get( + `${ + import.meta.env.VITE_COORD_URL + }/session_schedule_settings/${username}` + ) + .json(); + + if (result.error) { + console.log("Error: ", result.error); + return; + } + + const { datesAndTimes } = result; + + console.log(datesAndTimes); + + setDatesAndTimes(datesAndTimes); + } catch (error) { + if (error instanceof Error) { + console.log(error.message); + } + } + } + + useEffect(() => { + getSessionScheduleSettings(); + }, []); + + return ( +
+ {step === 1 && ( +
+

+ Выберите +
+ дату +

+ +
+ )} + + {step === 2 && ( +
+

+ Выберите +
+ время +

+ +
+ + +

+ {format(date, "dd MMMM", { locale: ru })} +

+ +
+ {datesAndTimes.map( + (dateAndTime: { value: Date; active: true }, index: number) => + !differenceInBusinessDays(date, new Date()) ? ( + isBefore(new Date(), new Date(dateAndTime.value)) && ( + + ) + ) : ( + + ) + )} +
+
+
+ )} + + {step === 3 && ( +
+

+ Расскажите +
о себе +

+ +
+ + +

+ {format(date, "dd MMMM HH:mm", { locale: ru })} +

+ +
+
+
+

Имя

+ setName(e.target.value)} + /> +
+ +
+

Email

+ setEmail(e.target.value)} + /> +
+ +
+

Телефон

+ setPhone(e.target.value)} + /> +
+
+ + +
+
+
+ )} + + {step === 4 && ( +
+

+ Просмотр +
+ запланирован +

+ +
+

+ Ссылка для подключения и другая дополнительная информация будут + отправлены на ваш почтовый адрес. +

+ + +
+
+ )} +
+ ); +} + +export default CalendarPage; diff --git a/src/HistoryPage.tsx b/src/HistoryPage.tsx new file mode 100644 index 0000000..eac3bf0 --- /dev/null +++ b/src/HistoryPage.tsx @@ -0,0 +1,39 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import ky from "ky"; +import { useEffect, useState } from "react"; + +function HistoryPage() { + const [history, setHistory] = useState([]); + + async function getHistory() { + const result: any = await ky + .get(`${import.meta.env.VITE_COORD_URL}/session_history`) + .json(); + + setHistory(result); + } + + useEffect(() => { + getHistory(); + }, []); + + return ( +
+

Всего сессий: {history.length}

+ {history.map((item: any) => ( +
+

+ Дата и время запуска: {new Date(item.createdAt).toLocaleString()} +

+

Сборка: "{item.title}"

+

Сервер: "{item.server}"

+

IP клиента: {item.headers["x-forwarded-for"]}

+

Город: {item.city}

+

Устройство: {item.headers["user-agent"]}

+
+ ))} +
+ ); +} + +export default HistoryPage; diff --git a/src/MonitoringPage.tsx b/src/MonitoringPage.tsx new file mode 100644 index 0000000..eac0f0b --- /dev/null +++ b/src/MonitoringPage.tsx @@ -0,0 +1,149 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { differenceInSeconds, parseISO } from "date-fns"; +import ky from "ky"; +import { useEffect, useState } from "react"; +import QRCode from "react-qr-code"; + +function MonitoringPage() { + const [sessions, setSessions] = useState([]); + const [servers, setServers] = useState([]); + + async function getSessionServers() { + const response = await ky + .get(`${import.meta.env.VITE_COORD_URL}/session_servers`) + .json(); + + setServers(response); + + setTimeout(() => { + getSessionServers(); + }, 1000); + } + + async function getActiveSessions() { + const response = await ky + .get(`${import.meta.env.VITE_COORD_URL}/active_sessions`) + .json(); + + setSessions(response); + + setTimeout(() => { + getActiveSessions(); + }, 1000); + } + + async function endActiveSession( + location: string, + server: string, + uePort: number, + cirrusPort: number + ) { + await ky + .get( + `${ + import.meta.env.VITE_COORD_URL + }/end?location=${location}&server=${server}&uePort=${uePort}&cirrusPort=${cirrusPort}` + ) + .json(); + } + + useEffect(() => { + getActiveSessions(); + getSessionServers(); + }, []); + + return ( +
+ {servers.map((server: any) => ( +
+
+ {differenceInSeconds(new Date(), parseISO(server.updatedAt)) >= + 10 ? ( +

+ + Не в сети +

+ ) : ( +

+ + В сети +

+ )} +
+

Локация: "{server.location}"

+

Имя сервера: "{server.name}"

+

Лимит процессов: {server.limit_process}

+
+

CPU: {server.cpu}

+

RAM: {server.ram}

+

+ GPU: + + {server.gpu?.map((item: any, index: number) => ( + + {item} {index === 2 && "°C"} + + ))} + +

+
+
+ ))} + + {sessions.map((session: any) => ( +
+
+
+ +
+
+

Локация: "{session.location}"

+

Сервер: "{session.server}"

+

Сборка: "{session.title}"

+

Порт: {session.cirrusPort}

+

Пользователи: {session.connectedPlayersCount || 0}

+

+ Время запуска: {new Date(session.createdAt).toLocaleString()} +

+
+
+ +
+ + Открыть в новом окне + + +
+
+ ))} +
+ ); +} + +export default MonitoringPage; diff --git a/src/PersonalAreaDashboardPage.tsx b/src/PersonalAreaDashboardPage.tsx new file mode 100644 index 0000000..e7d7223 --- /dev/null +++ b/src/PersonalAreaDashboardPage.tsx @@ -0,0 +1,303 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +// import { ChangeEvent, useEffect, useState } from "react"; +// import useAuthStore from "./stores/useAuthStore"; +// import { +// addHours, +// eachMinuteOfInterval, +// format, +// isBefore, +// parse, +// } from "date-fns"; +// import ky from "ky"; +import SessionScheduleSettings from "./components/SessionScheduleSettings"; + +function PersonalAreaDashboardPage() { + // const [user, removeAuthStore, accessToken] = useAuthStore((state) => [ + // state.user, + // state.removeAuthStore, + // state.accessToken, + // ]); + // const [startTime, setStartTime] = useState("09:00"); + // const [endTime, setEndTime] = useState("20:00"); + // const [duration, setDuration] = useState(30); + // const [datesAndTimes, setDatesAndTimes] = useState([]); + // const [isLoading, setIsLoading] = useState(true); + + // function handleDuration(e: ChangeEvent) { + // e.preventDefault(); + + // let value = parseInt(e.target.value); + // const min = parseInt(e.target.min); + // const max = parseInt(e.target.max); + + // if (!value || value < min) value = min; + // if (value > max) value = max; + + // setDuration(value); + // } + + // function calculateTimes() { + // if (startTime && endTime) { + // const startDateTime = parse(startTime, "HH:mm", new Date()); + // const endDateTime = parse(endTime, "HH:mm", new Date()); + + // if (!isBefore(startDateTime, endDateTime)) { + // setEndTime(format(addHours(startDateTime, 1), "HH:mm")); + + // return false; + // } + + // const newDateAndTimes: any[] = eachMinuteOfInterval( + // { + // start: startDateTime, + // end: endDateTime, + // }, + // { step: duration } + // ); + + // newDateAndTimes.forEach((value: Date, index: number) => { + // newDateAndTimes[index] = { value, active: true }; + // }); + + // setDatesAndTimes(newDateAndTimes); + // } + // } + + // async function getSessionScheduleSettings() { + // setIsLoading(true); + + // try { + // const result: any = await ky + // .get( + // `${import.meta.env.VITE_COORD_URL}/users/session_schedule_settings`, + // { + // headers: { + // Authorization: `Bearer ${accessToken}`, + // }, + // } + // ) + // .json(); + + // if (result.error) { + // console.log("Error: ", result.error); + // return; + // } + + // const { datesAndTimes, startTime, endTime, duration } = result; + + // console.log("datesAndTimes", datesAndTimes); + + // setStartTime(startTime); + // setEndTime(endTime); + // setDuration(duration); + // setIsLoading(false); + // } catch (error) { + // if (error instanceof Error) { + // console.log(error.message); + // } + + // setIsLoading(false); + // } + // } + + // async function saveSessionScheduleSettings() { + // try { + // await ky + // .post( + // `${import.meta.env.VITE_COORD_URL}/users/session_schedule_settings`, + // { + // headers: { + // Authorization: `Bearer ${accessToken}`, + // }, + // json: { startTime, endTime, duration, datesAndTimes }, + // } + // ) + // .json(); + + // alert("Изменения сохранены!"); + // } catch (error) { + // if (error instanceof Error) { + // console.log(error.message); + // } + // } + // } + + // function changeActive(dateAndTimeValue: Date) { + // const newDatesAndTimes = datesAndTimes.map((dateAndTime) => { + // if (dateAndTime.value === dateAndTimeValue) { + // dateAndTime.active = !dateAndTime.active; + // } + + // return dateAndTime; + // }); + + // setDatesAndTimes(newDatesAndTimes); + // } + + // function logout() { + // removeAuthStore(); + // } + + // useEffect(() => { + // calculateTimes(); + // }, [startTime, endTime, duration]); + + // useEffect(() => { + // getSessionScheduleSettings(); + // }, []); + + // return ( + //
+ //
+ //

+ // Вы вошли как{" "} + // {user?.username} + //

+ // + //
+ + //
+ //
+ //

Настройки расписания сеансов

+ + // {!isLoading ? ( + //
e.preventDefault()} + // className="flex flex-col space-y-8" + // > + //
+ //
+ //
+ //

Начало

+ // setStartTime(e.target.value)} + // className="px-3 py-2 rounded bg-[#1C1D21] outline-none focus:outline-[#BC75FF] w-full transition-all" + // /> + //
+ // + //
+ //

Конец

+ // setEndTime(e.target.value)} + // className="px-3 py-2 rounded bg-[#1C1D21] outline-none focus:outline-[#BC75FF] w-full transition-all" + // /> + //
+ //
+ //
+ //

Длительность сеанса

+ // + //
+ //
+ + // + //
+ // ) : ( + //
+ // + // + // + // + //
+ // )} + //
+ + //
+ //

Предпросмотр

+ + // {!isLoading ? ( + //
+ // {datesAndTimes.map( + // (dateAndTime: { value: Date; active: true }, index: number) => ( + // + // ) + // )} + //
+ // ) : ( + //
+ // + // + // + // + //
+ // )} + //
+ //
+ //
+ // ); + + return ( +
+ +
+ ); +} + +export default PersonalAreaDashboardPage; diff --git a/src/PersonalAreaLoginPage.tsx b/src/PersonalAreaLoginPage.tsx new file mode 100644 index 0000000..6369052 --- /dev/null +++ b/src/PersonalAreaLoginPage.tsx @@ -0,0 +1,140 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import ky from "ky"; +import useAuthStore from "./stores/useAuthStore"; +import { FormEvent, useRef, useState } from "react"; + +type User = { + id: string; + username: string; +}; + +interface IResult { + error?: number; + accessToken?: string; + user?: User; +} + +function PersonalAreaLoginPage() { + const [setAccessToken, setUser] = useAuthStore((state) => [ + state.setAccessToken, + state.setUser, + ]); + + const [username, setUsername] = useState(""); + const [password, setPassword] = useState(""); + const [error, setError] = useState(null); + const [isLoading, setIsLoading] = useState(false); + const usernameRef = useRef(null); + const passwordRef = useRef(null); + + async function auth(e: FormEvent) { + e.preventDefault(); + + setIsLoading(true); + + try { + const result: IResult = await ky + .post(import.meta.env.VITE_COORD_URL + "/login", { + json: { username, password }, + }) + .json(); + + setIsLoading(false); + + if (result.error) { + passwordRef.current?.focus(); + + setPassword(""); + setError("Неверное имя пользователя или пароль"); + return; + } + + if (!result.accessToken || !result.user) { + setError("Не удалось получить данные"); + return; + } + + setAccessToken(result.accessToken); + setUser(result.user); + } catch (error) { + setIsLoading(false); + + if (error instanceof Error) { + if (error.message === "Failed to fetch") { + setError("Нет соединения с сервером, попробуйте позже"); + } else { + setError(error.message); + } + } + } + } + + return ( +
+
+

Вход в личный кабинет

+
+
+
+

Имя пользователя

+ setUsername(e.target.value)} + className="px-3 py-2 rounded bg-[#1C1D21] outline-none focus:outline-[#BC75FF] w-full transition-all" + /> +
+
+

Пароль

+ setPassword(e.target.value)} + className="px-3 py-2 rounded bg-[#1C1D21] outline-none focus:outline-[#BC75FF] w-full transition-all" + /> +
+
+ + +
+ +

{error && error}

+
+
+ ); +} + +export default PersonalAreaLoginPage; diff --git a/src/ScheduledPage.tsx b/src/ScheduledPage.tsx new file mode 100644 index 0000000..f7fe876 --- /dev/null +++ b/src/ScheduledPage.tsx @@ -0,0 +1,65 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable react-hooks/exhaustive-deps */ +import ky from "ky"; +import { useEffect, useState } from "react"; +import Countdown from "react-countdown"; +import { useNavigate, useSearchParams } from "react-router-dom"; + +function ScheduledPage() { + const [searchParams] = useSearchParams(); + const navigate = useNavigate(); + const [countdownSeconds, setCountdownSeconds] = useState(); + + async function connect() { + const userInviteKey = searchParams.get("userInviteKey"); + + try { + const result: any = await ky + .get( + `${ + import.meta.env.VITE_COORD_URL + }/active_sessions/scheduled?userInviteKey=${userInviteKey}` + ) + .json(); + + if (!result.id) { + setCountdownSeconds(result.countdownSeconds); + return; + } + + navigate(`/stream/${result.id}`); + } catch (error) { + if (error instanceof Error) { + console.log(error.message); + } + } + } + + useEffect(() => { + if (searchParams.get("userInviteKey")) { + // console.log(searchParams.get("userInviteKey")); + + connect(); + } else { + navigate("/"); + } + }, []); + + return ( +
+ {countdownSeconds && ( +
+

Сеанс начнется через:

+

+ window.location.reload()} + /> +

+
+ )} +
+ ); +} + +export default ScheduledPage; diff --git a/src/StreamPage.tsx b/src/StreamPage.tsx new file mode 100644 index 0000000..60f9bf3 --- /dev/null +++ b/src/StreamPage.tsx @@ -0,0 +1,589 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable react-hooks/exhaustive-deps */ +import { useParams } from "react-router-dom"; +import { FullScreen, useFullScreenHandle } from "react-full-screen"; +import { useEffect, useState } from "react"; +import QRCode from "react-qr-code"; +import ky from "ky"; +import { io } from "socket.io-client"; +import userAgentParser from "ua-parser-js"; +import { Player } from "./components/Player"; +import { Trans } from "react-i18next"; +import { useScreen } from "usehooks-ts"; +import ShareIcon from "./components/icons/ShareIcon"; +import ModalContainer from "./components/ModalContainer"; +import useModalStore from "./stores/useModalStore"; +import ShareModal from "./components/modals/ShareModal"; +import { Transition } from "react-transition-group"; +import { ToastContainer, toast } from "react-toastify"; +import "react-toastify/dist/ReactToastify.css"; + +function StreamPage() { + const params = useParams(); + const handleFullScreen = useFullScreenHandle(); + const [isShowQRCode, setIsShowQRCode] = useState(false); + const [streamUrl, setStreamUrl] = useState(""); + const [isStreamEnded, setIsStreamEnded] = useState(false); + const [isStreamLoaded, setStreamLoaded] = useState(false); + const [socket, setSocket] = useState(null); + const [users, setUsers] = useState([]); + const [me, setMe] = useState({}); + const [isOpenSidebar, setIsOpenSidebar] = useState(false); + const screen = useScreen(); + const [modal, setModal] = useModalStore((state) => [ + state.modal, + state.setModal, + ]); + + useEffect(() => { + if (screen?.orientation.type.includes("portrait")) { + // alert("portrait"); + } + }, [screen]); + + function toastWarn(text: string) { + toast.warn(text, { + position: "bottom-right", + autoClose: 5000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: "dark", + }); + } + + function toastInfo(text: string) { + toast.info(text, { + position: "bottom-right", + autoClose: 5000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: "dark", + }); + } + + function toggleQRCode() { + setIsShowQRCode((prev) => !prev); + } + + async function connect() { + const activeSession: any = await ky + .get(`${import.meta.env.VITE_COORD_URL}/active_sessions/${params.id}`) + .json(); + + if (activeSession) { + setStreamUrl( + `wss://${activeSession.location}.sess.stream.graff.tech/${activeSession.server}/${activeSession.cirrusPort}/` + ); + + setStreamLoaded(true); + } else { + setIsStreamEnded(true); + } + } + + function update(socketId: string, params: object) { + socket.emit("update", socketId, params); + } + + function kick(socketId: string) { + socket.emit("kick", socketId); + } + + useEffect(() => { + connect(); + + const socket = io(import.meta.env.VITE_COORD_URL, { + query: { roomId: params.id }, + }); + setSocket(socket); + + socket.on("connect", () => { + // console.log("connect: ", socket.id); + }); + + socket.on("join", (_socketId, room) => { + setUsers(room.users); + // console.log("join: ", _socketId, room.users); + }); + + socket.on("update", (_socketId, room) => { + setUsers(room.users); + // console.log("update: ", _socketId, room.users); + }); + + socket.on("kick", () => { + window.close(); + }); + + socket.on("leave", (socketId) => { + setUsers((prev: any) => prev.filter((user: any) => user.id !== socketId)); + }); + + return () => { + socket.close(); + }; + }, []); + + useEffect(() => { + setMe(users.find((user: any) => user.id === socket.id)); + }, [users]); + + useEffect(() => { + if (me && me.allowControl && !me.admin) { + toastInfo("Управление получено"); + } + }, [me]); + + return ( + +
+
+
+ {!handleFullScreen.active ? ( + + ) : ( + + )} + + + + +
+ +
+ +
+ {users.map((user: any) => ( +
+
+ {user.admin ? ( + + + + + + + + + + + ) : ( + + + + + )} + + {me && me.id === user.id && ( +

Вы

+ )} +
+ +
+

+ {user.admin ? "Администратор" : "Пользователь"} +

+

({user.city})

+
+ + {new userAgentParser(user.ua).getDevice().type === "mobile" ? ( + + + + ) : ( + + + + )} + + {user.allowControl ? ( + + ) : ( + + )} + + {me && me.admin && ( + + )} +
+ ))} +
+
+ +
+ {!isOpenSidebar ? ( + + ) : ( + + )} +
+
+ + {isShowQRCode && ( +
+
+
+

+ + Отсканируйте QR-код +
+ чтобы подключиться +
к текущей демонстрации +
+

+ +
+ +
+
+ )} + + {!isStreamEnded ? ( + <> + {isStreamLoaded ? ( + <>{streamUrl && } + ) : ( +
+ Ожидание потока +
+ )} + + ) : ( +
+

+ Трансляция была завершена +

+
+ )} + + {me && !me.allowControl && ( + <> + {new userAgentParser(me.ua).getDevice().type === "mobile" ? ( +
+ toastWarn("Получите доступ у администратора трансляции!") + } + >
+ ) : ( +
+ toastWarn("Получите доступ у администратора трансляции!") + } + >
+ )} + + )} + + + {(state) => } + + + +
+ ); +} + +export default StreamPage; diff --git a/src/assets/react.svg b/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/Calendar.tsx b/src/components/Calendar.tsx new file mode 100644 index 0000000..e2cf704 --- /dev/null +++ b/src/components/Calendar.tsx @@ -0,0 +1,128 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + add, + eachDayOfInterval, + endOfMonth, + format, + getDay, + isEqual, + parse, + startOfToday, +} from "date-fns"; +import { enUS, ru } from "date-fns/locale"; +import { useEffect, useState } from "react"; +import ChevronRightIcon from "./icons/ChevronRightIcon"; +import ChevronLeftIcon from "./icons/ChevronLeftIcon"; +import { Trans } from "react-i18next"; +import i18n from "../i18n"; + +interface CalendarProps { + handleSelect: (day: Date) => void; +} + +function classNames(...classes: (string | boolean)[]) { + return classes.filter(Boolean).join(" "); +} + +function Calendar({ handleSelect }: CalendarProps) { + const today = startOfToday(); + const [selectedDay, setSelectedDay] = useState(null); + const [currentMonth, setCurrentMonth] = useState(format(today, "MMM-yyyy")); + const firstDayCurrentMonth = parse(currentMonth, "MMM-yyyy", new Date()); + + const days = eachDayOfInterval({ + start: firstDayCurrentMonth, + end: endOfMonth(firstDayCurrentMonth), + }); + + function previousMonth() { + const firstDayNextMonth = add(firstDayCurrentMonth, { months: -1 }); + setCurrentMonth(format(firstDayNextMonth, "MMM-yyyy")); + } + + function nextMonth() { + const firstDayNextMonth = add(firstDayCurrentMonth, { months: 1 }); + setCurrentMonth(format(firstDayNextMonth, "MMM-yyyy")); + } + + useEffect(() => { + if (selectedDay !== null) { + handleSelect(selectedDay); + } + }, [selectedDay]); + + return ( + <> +
+ + +

+ {format( + firstDayCurrentMonth, + "LLLL, yyyy", + i18n.language === "ru" ? { locale: ru } : { locale: enUS } + )} +

+ + +
+
+
{i18n.language === "ru" ? "пн" : "Mo"}
+
{i18n.language === "ru" ? "вт" : "Tu"}
+
{i18n.language === "ru" ? "ср" : "We"}
+
{i18n.language === "ru" ? "чт" : "Th"}
+
{i18n.language === "ru" ? "пт" : "Fr"}
+
{i18n.language === "ru" ? "сб" : "Sa"}
+
{i18n.language === "ru" ? "вс" : "Su"}
+
+
+ {days.map((day, dayIdx) => ( +
+ +
+ ))} +
+
+
+

+ - запись доступна +

+
+ + ); +} + +const colStartClasses = [ + "", + "col-start-2", + "col-start-3", + "col-start-4", + "col-start-5", + "col-start-6", + "col-start-7", +]; + +export default Calendar; diff --git a/src/components/Card.tsx b/src/components/Card.tsx new file mode 100644 index 0000000..a0abab0 --- /dev/null +++ b/src/components/Card.tsx @@ -0,0 +1,37 @@ +import { Trans } from "react-i18next"; + +interface CardProps { + icon: string; + image: string; + title: string | JSX.Element; + location: string | JSX.Element; + handleClick: () => void; +} + +function Card({ icon, image, title, location, handleClick }: CardProps) { + return ( +
+
+
+
+ +
+

{title}

+

{location}

+
+
+ +
+
+ ); +} + +export default Card; diff --git a/src/components/ContactsForm.css b/src/components/ContactsForm.css new file mode 100644 index 0000000..f946ace --- /dev/null +++ b/src/components/ContactsForm.css @@ -0,0 +1,20 @@ +.contacts-field:focus ~ .contacts-placeholder { + top: 0; +} + +.contacts-field:focus ~ .contacts-placeholder-2 { + opacity: 0; +} + +.contacts-field:valid ~ .contacts-placeholder { + top: 0; +} + +.contacts-field:valid ~ .contacts-placeholder-2 { + opacity: 0; +} + +.contacts-field::placeholder { + font-weight: 600; + color: #77787d; +} diff --git a/src/components/ContactsForm.tsx b/src/components/ContactsForm.tsx new file mode 100644 index 0000000..29bf9c0 --- /dev/null +++ b/src/components/ContactsForm.tsx @@ -0,0 +1,93 @@ +import { ChangeEvent } from "react"; +import { Trans } from "react-i18next"; +import AsteriskIcon from "./icons/AsteriskIcon"; +import InputMask from "react-input-mask"; +import "./ContactsForm.css"; +import useSidebarStore from "../stores/useSidebarStore"; + +function ContactsForm() { + const [name, setName, phone, setPhone, email, setEmail] = useSidebarStore( + (state) => [ + state.name, + state.setName, + state.phone, + state.setPhone, + state.email, + state.setEmail, + ] + ); + + return ( +
+
+ setName(e.target.value)} + className="feedback-field bg-transparent border border-[#3D425C] rounded-none sm:pt-12 sm:pb-4 sm:px-4 pt-8 pb-3 px-3 outline-none outline-1 -outline-offset-1 focus:outline-[#D375FF] transition-all w-full" + /> +

+ + Имя + + +

+
+ +
+ ) => + setPhone(e.target.value) + } + className={[ + "feedback-field bg-transparent border rounded-none border-t-0 border-[#3D425C] sm:pt-12 sm:pb-4 sm:px-4 pt-8 pb-3 px-3 outline-none outline-1 -outline-offset-1 focus:outline-[#D375FF] transition-all w-full", + ].join(" ")} + /> +

+ + Телефон + + +

+
+ +
+ setEmail(e.target.value)} + className="feedback-field bg-transparent border rounded-none border-t-0 border-[#3D425C] sm:pt-12 sm:pb-4 sm:px-4 pt-8 pb-3 px-3 outline-none outline-1 -outline-offset-1 focus:outline-[#D375FF] transition-all w-full" + /> +

+ Email + +

+
+ +
+
+
+ +
+

+

+ + Звездочкой отмечены обязательные +
+ для заполнения поля +
+

+
+
+
+ ); +} + +export default ContactsForm; diff --git a/src/components/FeedbackForm.tsx b/src/components/FeedbackForm.tsx new file mode 100644 index 0000000..b0adf2a --- /dev/null +++ b/src/components/FeedbackForm.tsx @@ -0,0 +1,187 @@ +import ky from "ky"; +import { ChangeEvent, FormEvent, useState } from "react"; +import { Trans, useTranslation } from "react-i18next"; +import InputMask from "react-input-mask"; +import AsteriskIcon from "./icons/AsteriskIcon"; +import SendIcon from "./icons/SendIcon"; +import CheckGradientIcon from "./icons/CheckGradientIcon"; +import LoaderIcon from "./icons/LoaderIcon"; + +function FeedbackForm() { + const { t } = useTranslation(); + const [name, setName] = useState(""); + const [phone, setPhone] = useState(""); + const [email, setEmail] = useState(""); + const [description, setDescription] = useState(""); + const [isSend, setIsSend] = useState(false); + const [isLoading, setIsLoading] = useState(false); + + async function sendMail(e: FormEvent) { + e.preventDefault(); + + setIsLoading(true); + + try { + await ky + .post(`https://estate.graff.tech/api/mail`, { + json: { + fullname: name, + phone, + email, + request: description, + }, + }) + .json(); + + setIsSend(true); + setIsLoading(false); + } catch (error) { + setIsLoading(false); + if (error instanceof Error) { + alert(error.message); + } + } + } + + return ( +
void sendMail(e)} + > +
+ setName(e.target.value)} + className="feedback-field bg-transparent border border-[#3D425C] rounded-none lg:p-6 lg:pt-14 p-4 pt-12 outline-none outline-1 -outline-offset-1 focus:outline-[#D375FF] transition-all w-full" + /> +

+ + Имя + + +

+
+ +
+ ) => + setPhone(e.target.value) + } + className={[ + "feedback-field bg-transparent border rounded-none sm:border-l-0 sm:border-t border-t-0 border-l border-[#3D425C] lg:p-6 lg:pt-14 p-4 pt-12 outline-none outline-1 -outline-offset-1 focus:outline-[#D375FF] transition-all w-full", + ].join(" ")} + /> +

+ + Телефон + + +

+
+ +
+ setEmail(e.target.value)} + className="feedback-field bg-transparent border rounded-none lg:border-l-0 lg:border-t border-t-0 border-[#3D425C] lg:p-6 lg:pt-14 p-4 pt-12 outline-none outline-1 -outline-offset-1 focus:outline-[#D375FF] transition-all w-full" + /> +

+ Email + +

+
+ +
+ +
+ +
+ +
+ +
+
+ + Нажимая кнопку отправить, вы принимаете + {" "} + + + условия использования + + {" "} + и{" "} + + + политику конфиденциальности + + +
+
+ +
+
+
+ +
+

+

+ + Звездочкой отмечены обязательные +
+ для заполнения поля +
+

+
+
+ + {isSend && ( +
+

+ Заявка отправлена + +

+ +
+

+ Спасибо за подачу заявки! +

+ +

+ Мы ценим ваш интерес к нашей компании и в ближайшее время свяжемся + с вами для уточнения деталей проекта. +

+
+
+ )} +
+ ); +} + +export default FeedbackForm; diff --git a/src/components/Header.tsx b/src/components/Header.tsx new file mode 100644 index 0000000..2a77e3d --- /dev/null +++ b/src/components/Header.tsx @@ -0,0 +1,64 @@ +import { Trans } from "react-i18next"; +import LogoIcon from "./icons/LogoIcon"; +import LogoMobileIcon from "./icons/LogoMobileIcon"; +import i18n from "../i18n"; +import useSidebarStore from "../stores/useSidebarStore"; + +interface HeaderProps { + handleChangeLang: (lang: string) => void; +} + +function Header({ handleChangeLang }: HeaderProps) { + const [setIsOpen] = useSidebarStore((state) => [state.setIsOpen]); + + return ( +
+ + + + + + +
+ +
+ + +
+
+
+ ); +} + +export default Header; diff --git a/src/components/ModalContainer.css b/src/components/ModalContainer.css new file mode 100644 index 0000000..bb3daf5 --- /dev/null +++ b/src/components/ModalContainer.css @@ -0,0 +1,15 @@ +.entering { + opacity: 1; +} + +.entered { + opacity: 1; +} + +.exiting { + opacity: 0; +} + +.exited { + opacity: 0; +} diff --git a/src/components/ModalContainer.tsx b/src/components/ModalContainer.tsx new file mode 100644 index 0000000..9f42fb3 --- /dev/null +++ b/src/components/ModalContainer.tsx @@ -0,0 +1,42 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { useEffect } from "react"; +import useModalStore from "../stores/useModalStore"; +import "./ModalContainer.css"; + +interface ModalContainerProps { + className?: string; +} + +function ModalContainer({ className }: ModalContainerProps) { + const [modal, setModal] = useModalStore((state) => [ + state.modal, + state.setModal, + ]); + + useEffect(() => { + function handleKeyDown(e: KeyboardEvent) { + if (e.code === "Escape") { + setModal(null); + } + } + + document.addEventListener("keydown", handleKeyDown); + return () => document.removeEventListener("keydown", handleKeyDown); + }, []); + + return ( +
setModal(null)} + className={[ + "absolute w-full min-h-screen top-0 left-0 flex flex-col justify-center items-center p-8 bg-black bg-opacity-75 transition-opacity cursor-pointer", + className, + ].join(" ")} + > +
e.stopPropagation()} className="cursor-default"> + {modal} +
+
+ ); +} + +export default ModalContainer; diff --git a/src/components/NumberInput.tsx b/src/components/NumberInput.tsx new file mode 100644 index 0000000..35aaf85 --- /dev/null +++ b/src/components/NumberInput.tsx @@ -0,0 +1,43 @@ +import { ChangeEvent, useState } from "react"; + +interface NumberInputProps { + min?: number; + max?: number; + step?: number; + defaultValue?: number; + onChange: (value: number) => void; +} + +function NumberInput({ + min = 1, + max = 100, + step = 1, + defaultValue = 1, + onChange, +}: NumberInputProps) { + const [value, setValue] = useState(defaultValue); + + function handleChange(e: ChangeEvent) { + let value = +e.target.value; + + if (value < min) value = min; + if (value > max) value = max; + + setValue(value); + onChange(value); + } + + return ( + + ); +} + +export default NumberInput; diff --git a/src/components/PixelStreamingWrapper.tsx b/src/components/PixelStreamingWrapper.tsx new file mode 100644 index 0000000..99f26c9 --- /dev/null +++ b/src/components/PixelStreamingWrapper.tsx @@ -0,0 +1,159 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +// Copyright Epic Games, Inc. All Rights Reserved. + +import { useEffect, useRef, useState } from "react"; +import { + Config, + AllSettings, + PixelStreaming, +} from "@epicgames-ps/lib-pixelstreamingfrontend-ue5.3"; +import { Trans } from "react-i18next"; + +export interface PixelStreamingWrapperProps { + initialSettings?: Partial; +} + +export const PixelStreamingWrapper = ({ + initialSettings, +}: PixelStreamingWrapperProps) => { + // A reference to parent div element that the Pixel Streaming library attaches into: + const videoParent = useRef(null); + + // Pixel streaming library instance is stored into this state variable after initialization: + const [pixelStreaming, setPixelStreaming] = useState(); + + // A boolean state variable that determines if the Click to play overlay is shown: + const [clickToPlayVisible, setClickToPlayVisible] = useState(false); + const [videoInitialized, setVideoInitialized] = useState(false); + + // Run on component mount: + useEffect(() => { + if (videoParent.current) { + // Attach Pixel Streaming library to videoParent element: + const config = new Config({ initialSettings }); + const streaming = new PixelStreaming(config, { + videoElementParent: videoParent.current, + }); + + streaming.addEventListener("videoInitialized", () => { + setVideoInitialized(true); + }); + + // register a playStreamRejected handler to show Click to play overlay if needed: + streaming.addEventListener("playStreamRejected", () => { + setClickToPlayVisible(true); + }); + + // Save the library instance into component state so that it can be accessed later: + setPixelStreaming(streaming); + + document.getElementById("hiddenInput")?.remove(); + document.getElementById("editTextButton")?.remove(); + + // Clean up on component unmount: + return () => { + try { + streaming.disconnect(); + } catch { + // + } + }; + } + }, []); + + return ( +
+
+ {!videoInitialized && ( +
+ Буферизация потока +
+ )} + {clickToPlayVisible && ( +
+
+
+

+ Демонстрация начата +

+

+ + Нажмите, чтобы продолжить + +

+
+ + +
+
+ )} +
+ ); +}; diff --git a/src/components/Player.tsx b/src/components/Player.tsx new file mode 100644 index 0000000..ea0c59e --- /dev/null +++ b/src/components/Player.tsx @@ -0,0 +1,26 @@ +import { PixelStreamingWrapper } from "./PixelStreamingWrapper"; + +interface PlayerProps { + ss: string; +} + +export const Player = ({ ss }: PlayerProps) => { + return ( +
+ +
+ ); +}; diff --git a/src/components/SessionScheduleSettings.tsx b/src/components/SessionScheduleSettings.tsx new file mode 100644 index 0000000..f74a013 --- /dev/null +++ b/src/components/SessionScheduleSettings.tsx @@ -0,0 +1,41 @@ +import NumberInput from "./NumberInput"; +import TimePicker from "./TimePicker"; + +function SessionScheduleSettings() { + return ( +
+
+

Настройки расписания сеансов

+
+
+
+

Время начала:

+ +
+
+
+

Время конца:

+ +
+
+
+

Длительность:

+ console.log(value)} + /> +
+ +
+
+
preview
+
+ ); +} + +export default SessionScheduleSettings; diff --git a/src/components/Sidebar.css b/src/components/Sidebar.css new file mode 100644 index 0000000..6d32a2e --- /dev/null +++ b/src/components/Sidebar.css @@ -0,0 +1,33 @@ +.sidebar.entering { + opacity: 1; +} + +.sidebar.entered { + opacity: 1; +} + +.sidebar.exiting { + opacity: 0; +} + +.sidebar.exited { + opacity: 0; +} + +@keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +@keyframes fadeOut { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx new file mode 100644 index 0000000..ef6653b --- /dev/null +++ b/src/components/Sidebar.tsx @@ -0,0 +1,35 @@ +/* eslint-disable no-irregular-whitespace */ +import "./Sidebar.css"; +import useSidebarTabStore from "../stores/useSidebarStore"; +import SidebarTab1 from "./SidebarTab1"; +import SidebarTab2 from "./SidebarTab2"; +import SidebarTab3 from "./SidebarTab3"; +import SidebarTab4 from "./SidebarTab4"; +import SidebarTab5 from "./SidebarTab5"; + +interface SidebarProps { + className?: string; +} + +function Sidebar({ className }: SidebarProps) { + const [currentTab] = useSidebarTabStore((state) => [state.currentTab]); + + return ( +
+
+ {currentTab === 1 && } + {currentTab === 2 && } + {currentTab === 3 && } + {currentTab === 4 && } + {currentTab === 5 && } +
+
+ ); +} + +export default Sidebar; diff --git a/src/components/SidebarTab1.tsx b/src/components/SidebarTab1.tsx new file mode 100644 index 0000000..1263938 --- /dev/null +++ b/src/components/SidebarTab1.tsx @@ -0,0 +1,69 @@ +/* eslint-disable no-irregular-whitespace */ +import { Trans } from "react-i18next"; +import useSidebarTabStore from "../stores/useSidebarStore"; +import Calendar from "./Calendar"; +import CloseIcon from "./icons/CloseIcon"; + +function SidebarTab1() { + const [currentTab, setCurrentTab, setIsOpen, setSelectedDay] = + useSidebarTabStore((state) => [ + state.currentTab, + state.setCurrentTab, + state.setIsOpen, + state.setSelectedDay, + ]); + + function handleSelectDay(day: Date) { + setSelectedDay(day); + setCurrentTab(currentTab + 1); + } + + return ( +
+
+
+

+ Дата и время +

+ +
+ +
+
+
+

+ Дата +

+
+ +
+

+ Время +

+
+
+
+ +
+ handleSelectDay(day)} /> +
+
+ +
+

+ + Запись на демонстрацию работает в ознакомительном режиме и не + сохраняет введенные данные + +

+
+
+ ); +} + +export default SidebarTab1; diff --git a/src/components/SidebarTab2.tsx b/src/components/SidebarTab2.tsx new file mode 100644 index 0000000..80de96f --- /dev/null +++ b/src/components/SidebarTab2.tsx @@ -0,0 +1,102 @@ +/* eslint-disable no-irregular-whitespace */ +import { Trans } from "react-i18next"; +import useSidebarTabStore from "../stores/useSidebarStore"; +import TimeSelector from "./TimeSelector"; +import CloseIcon from "./icons/CloseIcon"; +import { format } from "date-fns"; +import i18n from "../i18n"; +import { enUS, ru } from "date-fns/locale"; + +function SidebarTab2() { + const [ + currentTab, + setCurrentTab, + setIsOpen, + setSelectedTime, + selectedDay, + selectedTime, + ] = useSidebarTabStore((state) => [ + state.currentTab, + state.setCurrentTab, + state.setIsOpen, + state.setSelectedTime, + state.selectedDay, + state.selectedTime, + ]); + + function handleSelectTime(time: string) { + setSelectedTime(time); + setCurrentTab(currentTab + 1); + } + + return ( +
+
+
+

+ Дата и время +

+ +
+ +
+
+
+

+ {selectedDay && + format( + selectedDay, + "dd MMMM", + i18n.language === "ru" ? { locale: ru } : { locale: enUS } + )} +

+
+ +
+

+ {selectedTime ? ( + selectedTime + ) : ( + Время + )} +

+
+
+
+ +
+ handleSelectTime(time)} + /> +
+
+ +
+

+ + Запись на демонстрацию работает в ознакомительном режиме и не + сохраняет введенные данные + +

+ +
+ +
+
+
+ ); +} + +export default SidebarTab2; diff --git a/src/components/SidebarTab3.tsx b/src/components/SidebarTab3.tsx new file mode 100644 index 0000000..3ea0059 --- /dev/null +++ b/src/components/SidebarTab3.tsx @@ -0,0 +1,91 @@ +/* eslint-disable no-irregular-whitespace */ +import { Trans } from "react-i18next"; +import useSidebarTabStore from "../stores/useSidebarStore"; +import ContactsForm from "./ContactsForm"; +import ArrowRightIcon from "./icons/ArrowRightIcon"; +import CloseIcon from "./icons/CloseIcon"; + +function SidebarTab3() { + const [ + currentTab, + setCurrentTab, + setIsOpen, + name, + phone, + email, + ] = useSidebarTabStore((state) => [ + state.currentTab, + state.setCurrentTab, + state.setIsOpen, + state.name, + state.phone, + state.email, + state.selectedDay, + state.selectedTime, + ]); + + function handleSubmit() { + if (!name || !phone || !email) { + return; + } + + setCurrentTab(currentTab + 1); + } + + return ( +
+
+
+

+ Контакты +

+ +
+ +
+ +
+
+ +
+

+ + Запись на демонстрацию работает в ознакомительном режиме и не + сохраняет введенные данные + +

+ +
+ + + +
+
+
+ ); +} + +export default SidebarTab3; diff --git a/src/components/SidebarTab4.tsx b/src/components/SidebarTab4.tsx new file mode 100644 index 0000000..a18e450 --- /dev/null +++ b/src/components/SidebarTab4.tsx @@ -0,0 +1,198 @@ +/* eslint-disable no-irregular-whitespace */ +import { format, parse } from "date-fns"; +import useSidebarTabStore from "../stores/useSidebarStore"; +import ArrowRightIcon from "./icons/ArrowRightIcon"; +import CloseIcon from "./icons/CloseIcon"; +import { enUS, ru } from "date-fns/locale"; +import ky from "ky"; +import { Trans } from "react-i18next"; +import i18n from "../i18n"; +import { useState } from "react"; +import LoaderIcon from "./icons/LoaderIcon"; + +function SidebarTab4() { + const [ + currentTab, + setCurrentTab, + setIsOpen, + selectedDay, + selectedTime, + name, + phone, + email, + ] = useSidebarTabStore((state) => [ + state.currentTab, + state.setCurrentTab, + state.setIsOpen, + state.selectedDay, + state.selectedTime, + state.name, + state.phone, + state.email, + ]); + + const [isLoading, setIsLoading] = useState(false); + + async function handleClickSignUp() { + if (!selectedTime || !selectedDay) { + return; + } + + setIsLoading(true); + + const startAt = parse(selectedTime, "HH:mm", selectedDay); + + try { + await ky + .post("https://coord.graff.tech/scheduled_sessions", { + json: { + username: "test", + name, + phone, + email, + title: "nksJukovaDev", + startAt, + }, + }) + .json(); + + setCurrentTab(currentTab + 1); + + setIsLoading(false); + } catch (error) { + setIsLoading(false); + if (error instanceof Error) { + alert(error.message); + } + } + } + + return ( +
+
+
+

+ Проверка заявки +

+ +
+ +
+
+

+ Детали сеанса +

+
+
+

+ Дата +

+

+ {selectedDay && + format( + selectedDay, + "dd MMMM", + i18n.language === "ru" ? { locale: ru } : { locale: enUS } + )} +

+
+
+

+ Время +

+

{selectedTime}

+
+
+
+ +
+

+ + Контактные данные + +

+
+
+

+ Имя +

+

{name}

+
+
+

+ Телефон +

+

{phone}

+
+
+

Email

+

{email}

+
+
+
+ +
+

+ + Нажимая кнопку записаться, вы принимаете + {" "} + + + условия использования + + {" "} + и{" "} + + + политику конфиденциальности + + +

+
+
+
+ +
+

+ + Запись на демонстрацию работает в ознакомительном режиме и не + сохраняет введенные данные + +

+ +
+ + + +
+
+
+ ); +} + +export default SidebarTab4; diff --git a/src/components/SidebarTab5.tsx b/src/components/SidebarTab5.tsx new file mode 100644 index 0000000..6f31629 --- /dev/null +++ b/src/components/SidebarTab5.tsx @@ -0,0 +1,97 @@ +/* eslint-disable no-irregular-whitespace */ +import { Trans } from "react-i18next"; +import useSidebarTabStore from "../stores/useSidebarStore"; +import ArrowRightIcon from "./icons/ArrowRightIcon"; +import MailGradientIcon from "./icons/MailGradientIcon"; +import PhoneGradientIcon from "./icons/PhoneGradientIcon"; +import WebGradientIcon from "./icons/WebGradientIcon"; + +function SidebarTab5() { + const [setIsOpen, name] = useSidebarTabStore((state) => [ + state.setIsOpen, + state.name, + ]); + + return ( +
+
+
+

+ {name}, +
+ + спасибо за запись + +
+ + на удаленную демонстрацию! + +

+
+ +

+ + В ближайшее время мы отправим на ваш почтовый адрес всю + дополнительную информацию о сеансе и ссылку для подключения. + +

+ +
+

+ Возникли вопросы? +

+ +
+
+

+ Свяжитесь с нами +

+
+ + +
+
+
+ +
+

+ + Запись на демонстрацию работает в ознакомительном режиме и не + сохраняет введенные данные + +

+ +
+ +
+
+
+ ); +} + +export default SidebarTab5; diff --git a/src/components/TimePicker.tsx b/src/components/TimePicker.tsx new file mode 100644 index 0000000..3d235cf --- /dev/null +++ b/src/components/TimePicker.tsx @@ -0,0 +1,5 @@ +function TimePicker() { + return
TimePicker
; +} + +export default TimePicker; diff --git a/src/components/TimeSelector.tsx b/src/components/TimeSelector.tsx new file mode 100644 index 0000000..5889fdd --- /dev/null +++ b/src/components/TimeSelector.tsx @@ -0,0 +1,60 @@ +import { Trans } from "react-i18next"; +import useSidebarStore from "../stores/useSidebarStore"; + +interface TimeSelectorProps { + handleSelect: (time: string) => void; +} + +function TimeSelector({ handleSelect }: TimeSelectorProps) { + const [selectedTime] = useSidebarStore((state) => [state.selectedTime]); + + const times = [ + { value: "10:00", active: true }, + { value: "10:30", active: false }, + { value: "11:00", active: true }, + { value: "11:30", active: true }, + { value: "12:00", active: true }, + { value: "12:30", active: true }, + { value: "13:00", active: true }, + { value: "13:30", active: true }, + { value: "14:00", active: false }, + { value: "14:30", active: false }, + { value: "15:30", active: true }, + { value: "15:00", active: true }, + { value: "16:30", active: true }, + { value: "16:00", active: true }, + { value: "17:30", active: true }, + { value: "17:00", active: true }, + ]; + + return ( + <> +
+ {times.map((time, index) => ( + + ))} +
+ +
+
+

+ - запись доступна +

+
+ + ); +} + +export default TimeSelector; diff --git a/src/components/icons/ArrowRightIcon.tsx b/src/components/icons/ArrowRightIcon.tsx new file mode 100644 index 0000000..8214e50 --- /dev/null +++ b/src/components/icons/ArrowRightIcon.tsx @@ -0,0 +1,28 @@ +interface IconProps { + className?: string; +} + +function ArrowRightIcon({ className }: IconProps) { + return ( + + + + + + ); +} + +export default ArrowRightIcon; diff --git a/src/components/icons/AsteriskIcon.tsx b/src/components/icons/AsteriskIcon.tsx new file mode 100644 index 0000000..ee2f4ca --- /dev/null +++ b/src/components/icons/AsteriskIcon.tsx @@ -0,0 +1,18 @@ +function AsteriskIcon() { + return ( + + + + ); +} + +export default AsteriskIcon; diff --git a/src/components/icons/CheckGradientIcon.tsx b/src/components/icons/CheckGradientIcon.tsx new file mode 100644 index 0000000..0f13fb5 --- /dev/null +++ b/src/components/icons/CheckGradientIcon.tsx @@ -0,0 +1,41 @@ +interface IconProps { + className?: string; +} + +function CheckGradientIcon({ className }: IconProps) { + return ( + + + + + + + + + + + + ); +} + +export default CheckGradientIcon; diff --git a/src/components/icons/ChevronLeftIcon.tsx b/src/components/icons/ChevronLeftIcon.tsx new file mode 100644 index 0000000..05e702c --- /dev/null +++ b/src/components/icons/ChevronLeftIcon.tsx @@ -0,0 +1,24 @@ +function ChevronLeftIcon() { + return ( + + + + + + ); +} + +export default ChevronLeftIcon; diff --git a/src/components/icons/ChevronRightIcon.tsx b/src/components/icons/ChevronRightIcon.tsx new file mode 100644 index 0000000..c465fc2 --- /dev/null +++ b/src/components/icons/ChevronRightIcon.tsx @@ -0,0 +1,24 @@ +function ChevronRightIcon() { + return ( + + + + + + ); +} + +export default ChevronRightIcon; diff --git a/src/components/icons/CloseIcon.tsx b/src/components/icons/CloseIcon.tsx new file mode 100644 index 0000000..1a35e7c --- /dev/null +++ b/src/components/icons/CloseIcon.tsx @@ -0,0 +1,24 @@ +function CloseIcon() { + return ( + + + + + + ); +} + +export default CloseIcon; diff --git a/src/components/icons/LoaderIcon.tsx b/src/components/icons/LoaderIcon.tsx new file mode 100644 index 0000000..094a71f --- /dev/null +++ b/src/components/icons/LoaderIcon.tsx @@ -0,0 +1,39 @@ +interface IconProps { + className?: string; +} + +function LoaderIcon({ className }: IconProps) { + return ( + + + + + + + + + + + + ); +} + +export default LoaderIcon; diff --git a/src/components/icons/LogoIcon.tsx b/src/components/icons/LogoIcon.tsx new file mode 100644 index 0000000..0a62e24 --- /dev/null +++ b/src/components/icons/LogoIcon.tsx @@ -0,0 +1,268 @@ +function LogoIcon() { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} + +export default LogoIcon; diff --git a/src/components/icons/LogoMobileIcon.tsx b/src/components/icons/LogoMobileIcon.tsx new file mode 100644 index 0000000..30a1b04 --- /dev/null +++ b/src/components/icons/LogoMobileIcon.tsx @@ -0,0 +1,175 @@ +function LogoMobileIcon() { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} + +export default LogoMobileIcon; diff --git a/src/components/icons/MailGradientIcon.tsx b/src/components/icons/MailGradientIcon.tsx new file mode 100644 index 0000000..8123d14 --- /dev/null +++ b/src/components/icons/MailGradientIcon.tsx @@ -0,0 +1,50 @@ +function MailGradientIcon() { + return ( + + + + + + + + + + + + + + + + + + + ); +} + +export default MailGradientIcon; diff --git a/src/components/icons/MailIcon.tsx b/src/components/icons/MailIcon.tsx new file mode 100644 index 0000000..1f6b6fb --- /dev/null +++ b/src/components/icons/MailIcon.tsx @@ -0,0 +1,31 @@ +interface IconProps { + className?: string; +} + +function MailIcon({ className }: IconProps) { + return ( + + + + + + + + + ); +} + +export default MailIcon; diff --git a/src/components/icons/PhoneGradientIcon.tsx b/src/components/icons/PhoneGradientIcon.tsx new file mode 100644 index 0000000..a748fe3 --- /dev/null +++ b/src/components/icons/PhoneGradientIcon.tsx @@ -0,0 +1,34 @@ +function PhoneGradientIcon() { + return ( + + + + + + + + + + + + ); +} + +export default PhoneGradientIcon; diff --git a/src/components/icons/PhoneIcon.tsx b/src/components/icons/PhoneIcon.tsx new file mode 100644 index 0000000..7dd8686 --- /dev/null +++ b/src/components/icons/PhoneIcon.tsx @@ -0,0 +1,26 @@ +interface IconProps { + className?: string; +} + +function PhoneIcon({ className }: IconProps) { + return ( + + + + + + ); +} + +export default PhoneIcon; diff --git a/src/components/icons/SendIcon.tsx b/src/components/icons/SendIcon.tsx new file mode 100644 index 0000000..a75735f --- /dev/null +++ b/src/components/icons/SendIcon.tsx @@ -0,0 +1,28 @@ +interface IconProps { + className?: string; +} + +function SendIcon({ className }: IconProps) { + return ( + + + + + + ); +} + +export default SendIcon; diff --git a/src/components/icons/ShareIcon.tsx b/src/components/icons/ShareIcon.tsx new file mode 100644 index 0000000..7172b02 --- /dev/null +++ b/src/components/icons/ShareIcon.tsx @@ -0,0 +1,25 @@ +function ShareIcon() { + return ( + + + + + + + + + ); +} + +export default ShareIcon; diff --git a/src/components/icons/TelegramIcon.tsx b/src/components/icons/TelegramIcon.tsx new file mode 100644 index 0000000..bcf6d57 --- /dev/null +++ b/src/components/icons/TelegramIcon.tsx @@ -0,0 +1,28 @@ +interface IconProps { + className?: string; +} + +function TelegramIcon({ className }: IconProps) { + return ( + + + + + + ); +} + +export default TelegramIcon; diff --git a/src/components/icons/VKIcon.tsx b/src/components/icons/VKIcon.tsx new file mode 100644 index 0000000..bd27a52 --- /dev/null +++ b/src/components/icons/VKIcon.tsx @@ -0,0 +1,28 @@ +interface IconProps { + className?: string; +} + +function VKIcon({ className }: IconProps) { + return ( + + + + + + ); +} + +export default VKIcon; diff --git a/src/components/icons/WebGradientIcon.tsx b/src/components/icons/WebGradientIcon.tsx new file mode 100644 index 0000000..4de15d8 --- /dev/null +++ b/src/components/icons/WebGradientIcon.tsx @@ -0,0 +1,36 @@ +function WebGradientIcon() { + return ( + + + + + + + + + + + + ); +} + +export default WebGradientIcon; diff --git a/src/components/icons/YouTubeIcon.tsx b/src/components/icons/YouTubeIcon.tsx new file mode 100644 index 0000000..a673b85 --- /dev/null +++ b/src/components/icons/YouTubeIcon.tsx @@ -0,0 +1,28 @@ +interface IconProps { + className?: string; +} + +function YouTubeIcon({ className }: IconProps) { + return ( + + + + + + ); +} + +export default YouTubeIcon; diff --git a/src/components/modals/ShareModal.tsx b/src/components/modals/ShareModal.tsx new file mode 100644 index 0000000..ce2b7dd --- /dev/null +++ b/src/components/modals/ShareModal.tsx @@ -0,0 +1,72 @@ +import { useClipboard } from "use-clipboard-copy"; +import ShareIcon from "../icons/ShareIcon"; +import { ToastContainer, toast } from "react-toastify"; +import "react-toastify/dist/ReactToastify.css"; +import useModalStore from "../../stores/useModalStore"; +import CloseIcon from "../icons/CloseIcon"; + +function ShareModal() { + const [setModal] = useModalStore((state) => [state.setModal]); + const clipboard = useClipboard(); + + function toastInfo(text: string) { + toast.info(text, { + position: "bottom-right", + autoClose: 5000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: "dark", + }); + } + + function handleClickCopy() { + clipboard.copy(); + toastInfo("Ссылка скопирована в буфер обмена"); + setModal(null); + } + + return ( + <> +
+
+

+ Пригласить +
+ на демонстрацию +

+
+

Ссылка для подключения

+ + +
+ + +
+
+ + + + ); +} + +export default ShareModal; diff --git a/src/i18n.ts b/src/i18n.ts new file mode 100644 index 0000000..0479980 --- /dev/null +++ b/src/i18n.ts @@ -0,0 +1,210 @@ +import i18n from "i18next"; +import { initReactI18next } from "react-i18next"; +import detector from "i18next-browser-languagedetector"; + +// the translations +// (tip move them in a JSON file and import them, +// or even better, manage them separated from your code: https://react.i18next.com/guides/multiple-translation-files) +const resources = { + ru: { + translation: { + loading: "Загрузка", + loadingSub: "сек", + streamWaiting: "Ожидание потока", + streamBuffering: "Буферизация потока", + streamEnded: "Трансляция была завершена", + demoStarted: "Демонстрация начата", + clickToContinue: "Нажмите, чтобы продолжить", + fullscreenMode: "Полноэкранный режим", + windowedMode: "Оконный режим", + inviteByQR: "Пригласить по QR", + scanQRCode: + "Отсканируйте QR-код
чтобы подключиться
к текущей демонстрации", + + title: "Удаленная демонстрация", + header: { + buttonFirst: "Записаться", + buttonSecond: "на демонстрацию", + }, + main: { + title: "Доступные
демонстрации", + desc: "Клиент из любой точки мира может посмотреть жилой комплекс, даже на нулевом этапе строительства. Он выберет лучшую планировку и оценит вид из окон своей будущей квартиры.", + cards: { + title1: "МФК «Revolution towers»", + title2: "ЖК «Life Резиденция»", + title3: "ЖК «Айвазовский City»", + city1: "Россия, Екатеринбург", + city2: "Россия, Тюмень", + button: "Запустить", + }, + }, + feedback: { + title: "Свяжитесь
с нами", + desc: "Хотите увеличить конверсию?
Давайте обсудим детали!", + form: { + field1: "Имя", + field2: "Телефон", + field3: "Опишите вашу задачу", + button: "Отправить", + desc1: { + text1: "Нажимая кнопку «Отправить», вы принимаете", + text1_1: "Нажимая кнопку «Записаться», вы принимаете", + link1: "условия использования", + text2: "и", + link2: "политику конфиденциальности", + }, + desc2: "Звездочкой отмечены обязательные
для заполнения поля", + }, + }, + contacts: { + title: "Горячая линия", + button1: "Написать", + button2: "Позвонить", + social: { + title: "Социальные
сети", + }, + }, + footer: { + link: "Политика конфиденциальности", + text: "Все права защищены.", + }, + sidebar: { + title1: "Дата и время", + title2: "Контакты", + title3: "Проверка данных", + title4_1: "спасибо за запись", + title4_2: "на удаленную демонстрацию", + date: "Дата", + time: "Время", + contacts: "Контакты", + submitNotice1: "Нажимая кнопку «Записаться», вы принимаете", + submitNotice2: "условия использования", + submitNotice3: "и", + submitNotice4: "политику конфиденциальности", + available: "запись доступна", + buttonBack: "Назад", + buttonNext: "Далее", + buttonSignUp: "Записаться", + buttonHome: "На главную", + checkData: "Проверка заявки", + sessionDetails: "Детали сеанса", + contactDetails: "Контактные данные", + name: "Имя", + phone: "Телефон", + tab5text1: + "В ближайшее время мы отправим на ваш почтовый адрес всю дополнительную информацию о сеансе и ссылку для подключения.", + tab5text2: "Возникли вопросы?", + tab5text3: "Свяжитесь с нами", + notice: + "Запись на демонстрацию работает в ознакомительном режиме и не сохраняет введенные данные", + }, + }, + }, + en: { + translation: { + loading: "Loading", + loadingSub: "sec", + streamWaiting: "Stream waiting", + streamBuffering: "Stream buffering", + streamEnded: "Stream has been ended", + demoStarted: "Demo started", + clickToContinue: "Click to continue", + fullscreenMode: "Fullscreen mode", + windowedMode: "Windowed mode", + inviteByQR: "Invite by QR code", + scanQRCode: "Scan the QR code to connect
to the current demo", + + title: "Remote demonstration", + header: { + buttonFirst: "Sign up", + buttonSecond: "for a demo", + }, + main: { + title: "Available
demos", + desc: "A client from anywhere in the world can view the residential complex, even at the zero construction stage. He will choose the best layout and evaluate the view from the windows of his future apartment.", + cards: { + title1: "Revolution towers", + title2: "Life Residence", + title3: "Aivazovsky City", + city1: "Russia, Yekaterinburg", + city2: "Russia, Tyumen", + button: "Run demo", + }, + }, + feedback: { + title: "Contact us", + desc: "Want to increase conversion?
Let's discuss the details!", + form: { + field1: "Name", + field2: "Phone", + field3: "Describe your task", + button: "Send", + desc1: { + text1: 'By clicking the "Submit" button, you accept the', + text1_1: 'By clicking the "Sign up" button, you accept the', + link1: "terms of use", + text2: "and", + link2: "privacy policy", + }, + desc2: "Required fields are marked
with an asterisk", + }, + }, + contacts: { + title: "Hot line", + button1: "Write to us", + button2: "Call us", + social: { + title: "Social
media", + }, + }, + footer: { + link: "Privacy policy", + text: "All rights reserved.", + }, + sidebar: { + title1: "Date and time", + title2: "Contacts", + title3: "Data checking", + title4_1: "thank you for signing up", + title4_2: "for a remote demonstration", + date: "Date", + time: "Time", + contacts: "Contacts", + submitNotice1: 'By clicking the "sign up" button, you accept the', + submitNotice2: "terms of use", + submitNotice3: "and", + submitNotice4: "privacy policy", + available: "available", + buttonBack: "Back", + buttonNext: "Next", + buttonSignUp: "Sign up", + buttonHome: "Home", + checkData: "Check the data", + sessionDetails: "Session details", + contactDetails: "Contact details", + name: "Name", + phone: "Phone", + tab5text1: + "In the near future we will send all additional information about the session and a link to connect to your email address.", + tab5text2: "Any questions?", + tab5text3: "Contact us", + notice: + "Registration for the demonstration
is carried out in a trial mode", + }, + }, + }, +}; + +void i18n + .use(detector) + .use(initReactI18next) // passes i18n down to react-i18next + .init({ + resources, + fallbackLng: ["ru", "en"], + interpolation: { + escapeValue: false, // react already safes from xss + }, + debug: true, + }); + +export default i18n; diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..26fbe02 --- /dev/null +++ b/src/index.css @@ -0,0 +1,28 @@ +@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"); +@import url("https://gistcdn.githack.com/mfd/09b70eb47474836f25a21660282ce0fd/raw/e06a670afcb2b861ed2ac4a1ef752d062ef6b46b/Gilroy.css"); + +@tailwind base; +@tailwind components; +@tailwind utilities; + +body { + font-family: "Inter", sans-serif; +} + +.font-gilroy { + font-family: "Gilroy", sans-serif; +} + +input { + color-scheme: dark; +} + +.bg-gradient { + background: linear-gradient(23deg, #798fff 16.71%, #d375ff 96.35%) !important; +} + +.text-gradient { + background: linear-gradient(23deg, #798fff 16.71%, #d375ff 96.35%); + background-clip: text; + color: transparent; +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..7f36aa7 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,91 @@ +// import React from "react"; +import ReactDOM from "react-dom/client"; +import { + createBrowserRouter, + Navigate, + RouterProvider, +} from "react-router-dom"; +import "./index.css"; +import App from "./App"; +import "./i18n"; +import StreamPage from "./StreamPage"; +import MonitoringPage from "./MonitoringPage"; +import HistoryPage from "./HistoryPage"; +import ScheduledPage from "./ScheduledPage"; +import CalendarPage from "./CalendarPage"; +import useAuthStore from "./stores/useAuthStore"; +import PersonalAreaLoginPage from "./PersonalAreaLoginPage"; +import PersonalAreaDashboardPage from "./PersonalAreaDashboardPage"; + +const router = createBrowserRouter([ + { + path: "/", + element: , + }, + { + path: "/stream/:id", + element: , + }, + { + path: "/monitoring", + element: , + }, + { + path: "/history", + element: , + }, + { + path: "/scheduled", + element: , + }, + { + path: "/calendar/:username", + element: , + }, + { + path: "/personal-area", + element: , + }, + { + path: "/personal-area/login", + element: ( + + + + ), + }, + { + path: "/personal-area/dashboard", + element: ( + + + + ), + }, +]); + +export function ProtectedRoute({ children }: { children: JSX.Element }) { + const accessToken = useAuthStore((state) => state.accessToken); + + if (accessToken) { + // console.log("location.pathname", location.pathname); + + if (location.pathname === "/personal-area/login") { + return ; + } else { + return <>{children}; + } + } else { + if (location.pathname !== "/personal-area/login") { + return ; + } else { + return <>{children}; + } + } +} + +ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( + // + + // , +); diff --git a/src/stores/useAuthStore.ts b/src/stores/useAuthStore.ts new file mode 100644 index 0000000..8ab5141 --- /dev/null +++ b/src/stores/useAuthStore.ts @@ -0,0 +1,37 @@ +import { create } from "zustand"; +import { devtools, persist } from "zustand/middleware"; + +type User = { + id: string; + username: string; +}; + +interface State { + accessToken: string | null; + user: User | null; +} + +interface Actions { + setAccessToken: (accessToken: string) => void; + setUser: (user: User) => void; + removeAuthStore: () => void; +} + +const useAuthStore = create()( + devtools( + persist( + (set) => ({ + accessToken: null, + user: null, + setAccessToken: (accessToken) => set({ accessToken }), + setUser: (user) => set({ user }), + removeAuthStore: () => set({ accessToken: null, user: null }), + }), + { + name: "auth", + } + ) + ) +); + +export default useAuthStore; diff --git a/src/stores/useModalStore.ts b/src/stores/useModalStore.ts new file mode 100644 index 0000000..0203095 --- /dev/null +++ b/src/stores/useModalStore.ts @@ -0,0 +1,16 @@ +import { create } from "zustand"; +import { devtools } from "zustand/middleware"; + +interface ModalState { + modal: JSX.Element | null; + setModal: (modal: JSX.Element | null) => void; +} + +const useModalStore = create()( + devtools((set) => ({ + modal: null, + setModal: (modal) => set({ modal }), + })) +); + +export default useModalStore; diff --git a/src/stores/useSidebarStore.ts b/src/stores/useSidebarStore.ts new file mode 100644 index 0000000..2ad9332 --- /dev/null +++ b/src/stores/useSidebarStore.ts @@ -0,0 +1,47 @@ +import { create } from "zustand"; +import { devtools } from "zustand/middleware"; + +interface SidebarState { + isOpen: boolean; + setIsOpen: (value: boolean) => void; + currentTab: number; + setCurrentTab: (tab: number) => void; + selectedDay: Date | null; + setSelectedDay: (day: Date) => void; + selectedTime: string | null; + setSelectedTime: (time: string) => void; + name: string; + setName: (name: string) => void; + phone: string; + setPhone: (phone: string) => void; + email: string; + setEmail: (email: string) => void; +} + +const useSidebarStore = create()( + devtools( + // persist( + (set) => ({ + isOpen: false, + setIsOpen: (value) => set(() => ({ isOpen: value })), + currentTab: 1, + setCurrentTab: (tab) => set(() => ({ currentTab: tab })), + selectedDay: null, + setSelectedDay: (day) => set(() => ({ selectedDay: day })), + selectedTime: null, + setSelectedTime: (time) => set(() => ({ selectedTime: time })), + name: "", + setName: (name) => set(() => ({ name })), + phone: "", + setPhone: (phone) => set(() => ({ phone })), + email: "", + setEmail: (email) => set(() => ({ email })), + }) + // { + // name: "tab-storage", + // } + // ) + ) +); + +export default useSidebarStore; diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..d37737f --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,12 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./index.html", + "./src/**/*.{js,ts,jsx,tsx}", + ], + theme: { + extend: {}, + }, + plugins: [], +} + diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..c81ef9f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..79ac0eb --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react-swc"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + server: { + port: 5000, + }, + preview: { + port: 5000, + }, +}); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..67d2885 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,2214 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@babel/runtime@^7.19.4", "@babel/runtime@^7.20.6": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz" + integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/runtime@^7.21.0": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz" + integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.7": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== + dependencies: + regenerator-runtime "^0.13.11" + +"@emotion/is-prop-valid@^0.7.3": + version "0.7.3" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz#a6bf4fa5387cbba59d44e698a4680f481a8da6cc" + integrity sha512-uxJqm/sqwXw3YPA5GXX365OBcJGFtxUVkB6WyezqFHlNe9jqUWH5ur2O2M8dGBz61kn1g3ZBlzUunFQXQIClhA== + dependencies: + "@emotion/memoize" "0.7.1" + +"@emotion/memoize@0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.1.tgz#e93c13942592cf5ef01aa8297444dc192beee52f" + integrity sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg== + +"@epicgames-ps/lib-pixelstreamingfrontend-ue5.3@^0.0.2": + version "0.0.2" + resolved "https://registry.npmjs.org/@epicgames-ps/lib-pixelstreamingfrontend-ue5.3/-/lib-pixelstreamingfrontend-ue5.3-0.0.2.tgz" + integrity sha512-zAQbxOGQE0y9Qqcfv05tsI8wr0bsm9h65xN57Wy4EX9XL8ulTx4wwrF0z0bmW6bK+ccOp2jZMd56/oH6lNVQLQ== + dependencies: + sdp "^3.1.0" + +"@esbuild/android-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" + integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== + +"@esbuild/android-arm@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" + integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== + +"@esbuild/android-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" + integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== + +"@esbuild/darwin-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" + integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== + +"@esbuild/darwin-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" + integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== + +"@esbuild/freebsd-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" + integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== + +"@esbuild/freebsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" + integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== + +"@esbuild/linux-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" + integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== + +"@esbuild/linux-arm@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" + integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== + +"@esbuild/linux-ia32@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" + integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== + +"@esbuild/linux-loong64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" + integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== + +"@esbuild/linux-mips64el@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" + integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== + +"@esbuild/linux-ppc64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" + integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== + +"@esbuild/linux-riscv64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" + integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== + +"@esbuild/linux-s390x@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" + integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== + +"@esbuild/linux-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" + integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== + +"@esbuild/netbsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" + integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== + +"@esbuild/openbsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" + integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== + +"@esbuild/sunos-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" + integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== + +"@esbuild/win32-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" + integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== + +"@esbuild/win32-ia32@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" + integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== + +"@esbuild/win32-x64@0.17.19": + version "0.17.19" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz" + integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.5.1" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz" + integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== + +"@eslint/eslintrc@^2.0.3": + version "2.0.3" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz" + integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.5.2" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.41.0": + version "8.41.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz" + integrity sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA== + +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@remix-run/router@1.6.2": + version "1.6.2" + resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.6.2.tgz" + integrity sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA== + +"@socket.io/component-emitter@~3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz" + integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== + +"@swc/core-darwin-arm64@1.3.60": + version "1.3.60" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.60.tgz#5ff6442e32d8c285d728b34a56af226af552cdfa" + integrity sha512-oCDKWGdSO1WyErduGfiITRDoq7ZBt9PXETlhi8BGKH/wCc/3mfSNI9wXAg3Stn8mrT0lUJtdsnwMI/eZp6dK+A== + +"@swc/core-darwin-x64@1.3.60": + version "1.3.60" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.60.tgz#99a78e92c7f18d46e3bc48b589c62e55c5d98ce2" + integrity sha512-pcE/1oUlmN/BkKndOPtViqTkaM5pomagXATo+Muqn4QNMnkSOEVcmF9T3Lr3nB1A7O/fwCew3/aHwZ5B2TZ1tA== + +"@swc/core-linux-arm-gnueabihf@1.3.60": + version "1.3.60" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.60.tgz#53a4e44fd7a81cd6887cb04abb282612986734a8" + integrity sha512-Moc+86SWcbPr06PaQYUb0Iwli425F7QgjwTCNEPYA6OYUsjaJhXMaHViW2WdGIXue2+eaQbg31BHQd14jXcoBg== + +"@swc/core-linux-arm64-gnu@1.3.60": + version "1.3.60" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.60.tgz#ee80faccb9bb3f19372d8b4d862ec7789fa30501" + integrity sha512-pPGZrTgSXBvp6IrXPXz8UJr82AElf8hMuK4rNHmLGDCqrWnRIFLUpiAsc2WCFIgdwqitZNQoM+F2vbceA/bkKg== + +"@swc/core-linux-arm64-musl@1.3.60": + version "1.3.60" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.60.tgz#4db4bbb1c32a00adfd79ba787bc5217d23dd1e4f" + integrity sha512-HSFQaVUkjWYNsQeymAQ3IPX3csRQvHe6MFyqPfvCCQ4dFlxPvlS7VvNaLnGG+ZW1ek7Lc+hEX+4NGzZKsxDIHA== + +"@swc/core-linux-x64-gnu@1.3.60": + version "1.3.60" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.60.tgz#998850b1ad8c5eb137a3c914ce9e62e4ac006dbb" + integrity sha512-WJt/X6HHM3/TszckRA7UKMXec3FHYsB9xswQbIYxN4bfTQodu3Rc8bmpHYtFO7ScMLrhY+RljHLK6wclPvaEXw== + +"@swc/core-linux-x64-musl@1.3.60": + version "1.3.60" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.60.tgz#7aff3519397f42b5255718bc5000970bb3a28be4" + integrity sha512-DGGBqAPUXy/aPMBKokL3osZC9kM97HchiDPuprzwgTMP40YQ3hGCzNJ5jK7sOk9Tc4PEdZ2Igfr9sBHmCrxxQw== + +"@swc/core-win32-arm64-msvc@1.3.60": + version "1.3.60" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.60.tgz#f6fc2ad36eaf4e1a0d7783f1095b28092e9c5a7a" + integrity sha512-wQg/BZPJvp5WpUbsBp7VHjhUh0DfYOPhP6dH67WO9QQ07+DvOk2DR2Bfh0z0ts1k7H/FsAqExWtTDCWMCRJiRQ== + +"@swc/core-win32-ia32-msvc@1.3.60": + version "1.3.60" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.60.tgz#8ab8e2c5520d6a9d5d043c25c6cafb156c5c419a" + integrity sha512-nqkd0XIVyGbnBwAxP4GIfx6n45/hAPETpmQYpDSGnucOKFJfvGdFGL81GDG1acPCq/oFtR3tIyTbPpKmJ0N6xQ== + +"@swc/core-win32-x64-msvc@1.3.60": + version "1.3.60" + resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.60.tgz" + integrity sha512-ouw+s22i9PYQpSE7Xc+ZittEyA87jElXABesviSpP+jgHt10sM5KFUpVAeV8DRlxJCXMJJ5AhOdCf4TAtFr+6A== + +"@swc/core@^1.3.56": + version "1.3.60" + resolved "https://registry.npmjs.org/@swc/core/-/core-1.3.60.tgz" + integrity sha512-dWfic7sVjnrStzGcMWakHd2XPau8UXGPmFUTkx6xGX+DOVtfAQVzG6ZW7ohw/yNcTqI05w6Ser26XMTMGBgXdA== + optionalDependencies: + "@swc/core-darwin-arm64" "1.3.60" + "@swc/core-darwin-x64" "1.3.60" + "@swc/core-linux-arm-gnueabihf" "1.3.60" + "@swc/core-linux-arm64-gnu" "1.3.60" + "@swc/core-linux-arm64-musl" "1.3.60" + "@swc/core-linux-x64-gnu" "1.3.60" + "@swc/core-linux-x64-musl" "1.3.60" + "@swc/core-win32-arm64-msvc" "1.3.60" + "@swc/core-win32-ia32-msvc" "1.3.60" + "@swc/core-win32-x64-msvc" "1.3.60" + +"@types/json-schema@^7.0.9": + version "7.0.12" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + +"@types/lodash.memoize@^4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@types/lodash.memoize/-/lodash.memoize-4.1.7.tgz" + integrity sha512-lGN7WeO4vO6sICVpf041Q7BX/9k1Y24Zo3FY0aUezr1QlKznpjzsDk3T3wvH8ofYzoK0QupN9TWcFAFZlyPwQQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.195" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz" + integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== + +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/react-dom@^18.0.11": + version "18.2.4" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz" + integrity sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw== + dependencies: + "@types/react" "*" + +"@types/react-input-mask@^3.0.2": + version "3.0.2" + resolved "https://registry.npmjs.org/@types/react-input-mask/-/react-input-mask-3.0.2.tgz" + integrity sha512-WTli3kUyvUqqaOLYG/so2pLqUvRb+n4qnx2He5klfqZDiQmRyD07jVIt/bco/1BrcErkPMtpOm+bHii4Oed6cQ== + dependencies: + "@types/react" "*" + +"@types/react-transition-group@^4.4.6": + version "4.4.6" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.6.tgz#18187bcda5281f8e10dfc48f0943e2fdf4f75e2e" + integrity sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.0.28": + version "18.2.7" + resolved "https://registry.npmjs.org/@types/react/-/react-18.2.7.tgz" + integrity sha512-ojrXpSH2XFCmHm7Jy3q44nXDyN54+EYKP2lBhJ2bqfyPj6cIUW/FZW/Csdia34NQgq7KYcAlHi5184m4X88+yw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.3" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + +"@types/semver@^7.3.12": + version "7.5.0" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + +"@types/ua-parser-js@^0.7.36": + version "0.7.36" + resolved "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.36.tgz" + integrity sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ== + +"@typescript-eslint/eslint-plugin@^5.57.1": + version "5.59.7" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.7.tgz" + integrity sha512-BL+jYxUFIbuYwy+4fF86k5vdT9lT0CNJ6HtwrIvGh0PhH8s0yy5rjaKH2fDCrz5ITHy07WCzVGNvAmjJh4IJFA== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.59.7" + "@typescript-eslint/type-utils" "5.59.7" + "@typescript-eslint/utils" "5.59.7" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.57.1": + version "5.59.7" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.7.tgz" + integrity sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ== + dependencies: + "@typescript-eslint/scope-manager" "5.59.7" + "@typescript-eslint/types" "5.59.7" + "@typescript-eslint/typescript-estree" "5.59.7" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.59.7": + version "5.59.7" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.7.tgz" + integrity sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ== + dependencies: + "@typescript-eslint/types" "5.59.7" + "@typescript-eslint/visitor-keys" "5.59.7" + +"@typescript-eslint/type-utils@5.59.7": + version "5.59.7" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.7.tgz" + integrity sha512-ozuz/GILuYG7osdY5O5yg0QxXUAEoI4Go3Do5xeu+ERH9PorHBPSdvD3Tjp2NN2bNLh1NJQSsQu2TPu/Ly+HaQ== + dependencies: + "@typescript-eslint/typescript-estree" "5.59.7" + "@typescript-eslint/utils" "5.59.7" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.59.7": + version "5.59.7" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.7.tgz" + integrity sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A== + +"@typescript-eslint/typescript-estree@5.59.7": + version "5.59.7" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.7.tgz" + integrity sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ== + dependencies: + "@typescript-eslint/types" "5.59.7" + "@typescript-eslint/visitor-keys" "5.59.7" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.59.7": + version "5.59.7" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.7.tgz" + integrity sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.59.7" + "@typescript-eslint/types" "5.59.7" + "@typescript-eslint/typescript-estree" "5.59.7" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.59.7": + version "5.59.7" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.7.tgz" + integrity sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ== + dependencies: + "@typescript-eslint/types" "5.59.7" + eslint-visitor-keys "^3.3.0" + +"@uidotdev/usehooks@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@uidotdev/usehooks/-/usehooks-2.0.1.tgz#ed76a6d2ea4fe008a1d732a45489025fa2a4c586" + integrity sha512-rJXxE3Y8g9utRbOS9Pj9tIvrnOdaakHIhLbMxBlErV8HydnGD0DveD82aLBfVTh1hBp5IXqpeHpMrPE9WIT7vQ== + +"@vitejs/plugin-react-swc@^3.0.0": + version "3.3.1" + resolved "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.3.1.tgz" + integrity sha512-ZoYjGxMniXP7X+5ry/W1tpY7w0OeLUEsBF5RHFPmAhpgwwNWie8OF4056MRXRi9QgvYYoZPDzdOXGK3wlCoTfQ== + dependencies: + "@swc/core" "^1.3.56" + +"@wojtekmaj/date-utils@^1.1.3": + version "1.4.1" + resolved "https://registry.npmjs.org/@wojtekmaj/date-utils/-/date-utils-1.4.1.tgz" + integrity sha512-Fjs0KJz0//0AmlJVFx9AQmWpmxOTw4foDo4DKoswWVVjHsna4rdu+fXwid5YHNgzv/wHi9AkZCRPmHWsf890lg== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.8.0: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +autoprefixer@^10.4.14: + version "10.4.14" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + dependencies: + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.5: + version "4.21.5" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: + version "1.0.30001489" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz" + integrity sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ== + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +clipboard-copy@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/clipboard-copy/-/clipboard-copy-3.2.0.tgz#3c5b8651d3512dcfad295d77a9eb09e7fac8d5fb" + integrity sha512-vooFaGFL6ulEP1liiaWFBmmfuPm3cY3y7T9eB83ZTnYc/oFeAKsq3NcDrOkBC8XaauEE8zHQwI7k0+JSYiVQSQ== + +clsx@^1.1.1, clsx@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-jss@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/css-jss/-/css-jss-10.10.0.tgz#bd51fbd255cc24597ac0f0f32368394794d37ef3" + integrity sha512-YyMIS/LsSKEGXEaVJdjonWe18p4vXLo8CMA4FrW/kcaEyqdIGKCFXao31gbJddXEdIxSXFFURWrenBJPlKTgAA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "^10.10.0" + jss-preset-default "^10.10.0" + +css-vendor@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" + integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== + dependencies: + "@babel/runtime" "^7.8.3" + is-in-browser "^1.0.2" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csstype@^3.0.2: + version "3.1.2" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +date-fns@^2.30.0: + version "2.30.0" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + +debug@^4.1.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +electron-to-chromium@^1.4.284: + version "1.4.411" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.411.tgz" + integrity sha512-5VXLW4Qw89vM2WTICHua/y8v7fKGDRVa2VPOtBB9IpLvW316B+xd8yD1wTmLPY2ot/00P/qt87xdolj4aG/Lzg== + +engine.io-client@~6.4.0: + version "6.4.0" + resolved "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz" + integrity sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.0.3" + ws "~8.11.0" + xmlhttprequest-ssl "~2.0.0" + +engine.io-parser@~5.0.3: + version "5.0.7" + resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.7.tgz" + integrity sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ== + +esbuild@^0.17.5: + version "0.17.19" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz" + integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== + optionalDependencies: + "@esbuild/android-arm" "0.17.19" + "@esbuild/android-arm64" "0.17.19" + "@esbuild/android-x64" "0.17.19" + "@esbuild/darwin-arm64" "0.17.19" + "@esbuild/darwin-x64" "0.17.19" + "@esbuild/freebsd-arm64" "0.17.19" + "@esbuild/freebsd-x64" "0.17.19" + "@esbuild/linux-arm" "0.17.19" + "@esbuild/linux-arm64" "0.17.19" + "@esbuild/linux-ia32" "0.17.19" + "@esbuild/linux-loong64" "0.17.19" + "@esbuild/linux-mips64el" "0.17.19" + "@esbuild/linux-ppc64" "0.17.19" + "@esbuild/linux-riscv64" "0.17.19" + "@esbuild/linux-s390x" "0.17.19" + "@esbuild/linux-x64" "0.17.19" + "@esbuild/netbsd-x64" "0.17.19" + "@esbuild/openbsd-x64" "0.17.19" + "@esbuild/sunos-x64" "0.17.19" + "@esbuild/win32-arm64" "0.17.19" + "@esbuild/win32-ia32" "0.17.19" + "@esbuild/win32-x64" "0.17.19" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-plugin-react-hooks@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react-refresh@^0.3.4: + version "0.3.5" + resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.3.5.tgz" + integrity sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA== + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== + +eslint@^8.38.0: + version "8.41.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz" + integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.3" + "@eslint/js" "8.41.0" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.0" + eslint-visitor-keys "^3.4.1" + espree "^9.5.2" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.5.2: + version "9.5.2" + resolved "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz" + integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +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" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.12, fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fscreen@^1.0.2: + version "1.2.0" + resolved "https://registry.npmjs.org/fscreen/-/fscreen-1.2.0.tgz" + integrity sha512-hlq4+BU0hlPmwsFjwGGzZ+OZ9N/wq9Ljg/sq3pX+2CD7hrJsX9tJgWWK/wiNTFM212CLHWhicOoqwXyZGGetJg== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-user-locale@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/get-user-locale/-/get-user-locale-2.2.1.tgz" + integrity sha512-3814zipTZ2MvczOcppEXB3jXu+0HWwj5WmPI6//SeCnUIUaRXu7W4S54eQZTEPadlMZefE+jAlPOn+zY3tD4Qw== + dependencies: + "@types/lodash.memoize" "^4.1.7" + lodash.memoize "^4.1.1" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hoist-non-react-statics@^3.2.0, hoist-non-react-statics@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +html-parse-stringify@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz" + integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== + dependencies: + void-elements "3.1.0" + +hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + +i18next-browser-languagedetector@^7.0.2: + version "7.0.2" + resolved "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.0.2.tgz" + integrity sha512-5ViaK+gikxfqZ9M3jJ7gJkUzzu/p3HwiqfLoL1bdiL7CUb0IylcTyVLdPaTU3pH5VFWFCiGFuJDg3VkLUikWgg== + dependencies: + "@babel/runtime" "^7.19.4" + +i18next@^22.5.0: + version "22.5.0" + resolved "https://registry.npmjs.org/i18next/-/i18next-22.5.0.tgz" + integrity sha512-sqWuJFj+wJAKQP2qBQ+b7STzxZNUmnSxrehBCCj9vDOW9RDYPfqCaK1Hbh2frNYQuPziz6O2CGoJPwtzY3vAYA== + dependencies: + "@babel/runtime" "^7.20.6" + +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.11.0: + version "2.12.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-in-browser@^1.0.2, is-in-browser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" + integrity sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jiti@^1.18.2: + version "1.18.2" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz" + integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +jss-plugin-camel-case@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz#27ea159bab67eb4837fa0260204eb7925d4daa1c" + integrity sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw== + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "10.10.0" + +jss-plugin-compose@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-compose/-/jss-plugin-compose-10.10.0.tgz#00d7a79adf7fcfe4927a792febdf0deceb0a7cd2" + integrity sha512-F5kgtWpI2XfZ3Z8eP78tZEYFdgTIbpA/TMuX3a8vwrNolYtN1N4qJR/Ob0LAsqIwCMLojtxN7c7Oo/+Vz6THow== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-default-unit@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz#db3925cf6a07f8e1dd459549d9c8aadff9804293" + integrity sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-expand@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-expand/-/jss-plugin-expand-10.10.0.tgz#5debd80554174ca2d9b9e38d85d4cb6f3e0393ab" + integrity sha512-ymT62W2OyDxBxr7A6JR87vVX9vTq2ep5jZLIdUSusfBIEENLdkkc0lL/Xaq8W9s3opUq7R0sZQpzRWELrfVYzA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-extend@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-extend/-/jss-plugin-extend-10.10.0.tgz#94eb450847a8941777e77ea4533a579c1c578430" + integrity sha512-sKYrcMfr4xxigmIwqTjxNcHwXJIfvhvjTNxF+Tbc1NmNdyspGW47Ey6sGH8BcQ4FFQhLXctpWCQSpDwdNmXSwg== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-global@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz#1c55d3c35821fab67a538a38918292fc9c567efd" + integrity sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-nested@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz#db872ed8925688806e77f1fc87f6e62264513219" + integrity sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz#67f4dd4c70830c126f4ec49b4b37ccddb680a5d7" + integrity sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-rule-value-function@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz#7d99e3229e78a3712f78ba50ab342e881d26a24b" + integrity sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-rule-value-observable@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-observable/-/jss-plugin-rule-value-observable-10.10.0.tgz#d17b28c4401156bbe4cd0c4a73a80aad70613e8b" + integrity sha512-ZLMaYrR3QE+vD7nl3oNXuj79VZl9Kp8/u6A1IbTPDcuOu8b56cFdWRZNZ0vNr8jHewooEeq2doy8Oxtymr2ZPA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + symbol-observable "^1.2.0" + +jss-plugin-template@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-template/-/jss-plugin-template-10.10.0.tgz#072cda74a94c91b02d3a895d9e2408fd978ce033" + integrity sha512-ocXZBIOJOA+jISPdsgkTs8wwpK6UbsvtZK5JI7VUggTD6LWKbtoxUzadd2TpfF+lEtlhUmMsCkTRNkITdPKa6w== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz#c01428ef5a89f2b128ec0af87a314d0c767931c7" + integrity sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg== + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.8" + jss "10.10.0" + +jss-preset-default@10.10.0, jss-preset-default@^10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-preset-default/-/jss-preset-default-10.10.0.tgz#c8209449a0f6d232526c2ba3a3a6ec69ee97e023" + integrity sha512-GL175Wt2FGhjE+f+Y3aWh+JioL06/QWFgZp53CbNNq6ZkVU0TDplD8Bxm9KnkotAYn3FlplNqoW5CjyLXcoJ7Q== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + jss-plugin-camel-case "10.10.0" + jss-plugin-compose "10.10.0" + jss-plugin-default-unit "10.10.0" + jss-plugin-expand "10.10.0" + jss-plugin-extend "10.10.0" + jss-plugin-global "10.10.0" + jss-plugin-nested "10.10.0" + jss-plugin-props-sort "10.10.0" + jss-plugin-rule-value-function "10.10.0" + jss-plugin-rule-value-observable "10.10.0" + jss-plugin-template "10.10.0" + jss-plugin-vendor-prefixer "10.10.0" + +jss@10.10.0, jss@^10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss/-/jss-10.10.0.tgz#a75cc85b0108c7ac8c7b7d296c520a3e4fbc6ccc" + integrity sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw== + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^3.0.2" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + +ky@^0.33.3: + version "0.33.3" + resolved "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz" + integrity sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@^2.0.5, lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.memoize@^4.1.1: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +loose-envify@^1.0.0, 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" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-releases@^2.0.8: + version "2.0.12" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz" + integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1: + version "4.0.5" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz" + integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== + dependencies: + lilconfig "^2.0.5" + yaml "^2.1.1" + +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + dependencies: + postcss-selector-parser "^6.0.11" + +postcss-selector-parser@^6.0.11: + version "6.0.13" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.4.23: + version "8.4.23" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz" + integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, 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== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +qr.js@0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/qr.js/-/qr.js-0.0.0.tgz" + integrity sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-calendar@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/react-calendar/-/react-calendar-4.3.0.tgz" + integrity sha512-TyCv8NbXnqXADyXNtMG0szkGvJNH3NG/WMTEE2q6g3RqAsFNyHwYbQD5Kvb6jRV/CqO0WB+oMCtkxblprdeT5A== + dependencies: + "@types/react" "*" + "@wojtekmaj/date-utils" "^1.1.3" + clsx "^1.2.1" + get-user-locale "^2.2.1" + prop-types "^15.6.0" + +react-countdown@^2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/react-countdown/-/react-countdown-2.3.5.tgz#70c035b5cbc7e8fdb4ad91fe5f44afd7a7933a68" + integrity sha512-K26ENYEesMfPxhRRtm1r+Pf70SErrvW3g4CArLi/x6MPFjgfDFYePT4UghEj8p2nI0cqVV7/JjDgjyr//U60Og== + dependencies: + prop-types "^15.7.2" + +react-display-name@^0.2.4: + version "0.2.5" + resolved "https://registry.yarnpkg.com/react-display-name/-/react-display-name-0.2.5.tgz#304c7cbfb59ee40389d436e1a822c17fe27936c6" + integrity sha512-I+vcaK9t4+kypiSgaiVWAipqHRXYmZIuAiS8vzFvXHHXVigg/sMKwlRgLy6LH2i3rmP+0Vzfl5lFsFRwF1r3pg== + +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-full-screen@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/react-full-screen/-/react-full-screen-1.1.1.tgz" + integrity sha512-xoEgkoTiN0dw9cjYYGViiMCBYbkS97BYb4bHPhQVWXj1UnOs8PZ1rPzpX+2HMhuvQV1jA5AF9GaRbO3fA5aZtg== + dependencies: + fscreen "^1.0.2" + +react-i18next@^12.3.1: + version "12.3.1" + resolved "https://registry.npmjs.org/react-i18next/-/react-i18next-12.3.1.tgz" + integrity sha512-5v8E2XjZDFzK7K87eSwC7AJcAkcLt5xYZ4+yTPDAW1i7C93oOY1dnr4BaQM7un4Hm+GmghuiPvevWwlca5PwDA== + dependencies: + "@babel/runtime" "^7.20.6" + html-parse-stringify "^3.0.1" + +react-input-mask@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/react-input-mask/-/react-input-mask-2.0.4.tgz" + integrity sha512-1hwzMr/aO9tXfiroiVCx5EtKohKwLk/NT8QlJXHQ4N+yJJFyUuMT+zfTpLBwX/lK3PkuMlievIffncpMZ3HGRQ== + dependencies: + invariant "^2.2.4" + warning "^4.0.2" + +react-is@^16.13.1, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-jss@^10.9.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/react-jss/-/react-jss-10.10.0.tgz#d08ab3257b0eed01e15d6d8275840055c279b0da" + integrity sha512-WLiq84UYWqNBF6579/uprcIUnM1TSywYq6AIjKTTTG5ziJl9Uy+pwuvpN3apuyVwflMbD60PraeTKT7uWH9XEQ== + dependencies: + "@babel/runtime" "^7.3.1" + "@emotion/is-prop-valid" "^0.7.3" + css-jss "10.10.0" + hoist-non-react-statics "^3.2.0" + is-in-browser "^1.1.3" + jss "10.10.0" + jss-preset-default "10.10.0" + prop-types "^15.6.0" + shallow-equal "^1.2.0" + theming "^3.3.0" + tiny-warning "^1.0.2" + +react-qr-code@^2.0.11: + version "2.0.11" + resolved "https://registry.npmjs.org/react-qr-code/-/react-qr-code-2.0.11.tgz" + integrity sha512-P7mvVM5vk9NjGdHMt4Z0KWeeJYwRAtonHTghZT2r+AASinLUUKQ9wfsGH2lPKsT++gps7hXmaiMGRvwTDEL9OA== + dependencies: + prop-types "^15.8.1" + qr.js "0.0.0" + +react-router-dom@^6.11.2: + version "6.11.2" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.2.tgz" + integrity sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw== + dependencies: + "@remix-run/router" "1.6.2" + react-router "6.11.2" + +react-router@6.11.2: + version "6.11.2" + resolved "https://registry.npmjs.org/react-router/-/react-router-6.11.2.tgz" + integrity sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg== + dependencies: + "@remix-run/router" "1.6.2" + +react-timeit@^1.2.12: + version "1.2.12" + resolved "https://registry.yarnpkg.com/react-timeit/-/react-timeit-1.2.12.tgz#f9955163b787ce7c8fcaeda66f6ffd6cff26328e" + integrity sha512-/c+NzN32ju98+RJ30TzFvp8eiJCSMtT5jheu9kUHIbDC7grZX5l2iK6i+AUGf/WAF8R++sjBNr9VVpY4VXQVSw== + dependencies: + react-jss "^10.9.0" + +react-toastify@^9.1.3: + version "9.1.3" + resolved "https://registry.npmjs.org/react-toastify/-/react-toastify-9.1.3.tgz" + integrity sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg== + dependencies: + clsx "^1.1.1" + +react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.1.7, resolve@^1.22.2: + version "1.22.2" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup@^3.21.0: + version "3.23.0" + resolved "https://registry.npmjs.org/rollup/-/rollup-3.23.0.tgz" + integrity sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ== + optionalDependencies: + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +sdp@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/sdp/-/sdp-3.2.0.tgz" + integrity sha512-d7wDPgDV3DDiqulJjKiV2865wKsJ34YI+NDREbm+FySq6WuKOikwyNQcm+doLAZ1O6ltdO0SeKle2xMpN3Brgw== + +semver@^7.3.7: + version "7.5.1" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + dependencies: + lru-cache "^6.0.0" + +shallow-equal@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da" + integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +socket.io-client@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.2.tgz" + integrity sha512-OwWrMbbA8wSqhBAR0yoPK6EdQLERQAYjXb3A0zLpgxfM1ZGLKoxHx8gVmCHA6pcclRX5oA/zvQf7bghAS11jRA== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.2" + engine.io-client "~6.4.0" + socket.io-parser "~4.2.4" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +sucrase@^3.32.0: + version "3.32.0" + resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz" + integrity sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "7.1.6" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-observable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + +tailwindcss@^3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz" + integrity sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.5.3" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.12" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.18.2" + lilconfig "^2.1.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" + resolve "^1.22.2" + sucrase "^3.32.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +theming@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/theming/-/theming-3.3.0.tgz#dacabf04aa689edde35f1e1c117ec6de73fbf870" + integrity sha512-u6l4qTJRDaWZsqa8JugaNt7Xd8PPl9+gonZaIe28vAhqgHMIG/DOyFPqiKN/gQLQYj05tHv+YQdNILL4zoiAVA== + dependencies: + hoist-non-react-statics "^3.3.0" + prop-types "^15.5.8" + react-display-name "^0.2.4" + tiny-warning "^1.0.2" + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +tiny-warning@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typescript@^5.0.2: + version "5.0.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz" + integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== + +ua-parser-js@^1.0.35: + version "1.0.35" + resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz" + integrity sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA== + +update-browserslist-db@^1.0.10: + version "1.0.11" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +use-clipboard-copy@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/use-clipboard-copy/-/use-clipboard-copy-0.2.0.tgz#e1f31f2b21e369bc79b5d7b358e2c8aece6ef264" + integrity sha512-f0PMMwZ2/Hh9/54L12capx4s6ASdd6edNJxg2OcqWVNM8BPvtOSmNFIN1Dg/q//fPp8MpUZceHfr7cnWOS0RxA== + dependencies: + clipboard-copy "^3.0.0" + +use-sync-external-store@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + +usehooks-ts@^2.9.1: + version "2.9.1" + resolved "https://registry.yarnpkg.com/usehooks-ts/-/usehooks-ts-2.9.1.tgz#953d3284851ffd097432379e271ce046a8180b37" + integrity sha512-2FAuSIGHlY+apM9FVlj8/oNhd+1y+Uwv5QNkMQz1oSfdHk4PXo1qoCw9I5M7j0vpH8CSWFJwXbVPeYDjLCx9PA== + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +vite@^4.3.2: + version "4.3.9" + resolved "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz" + integrity sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg== + dependencies: + esbuild "^0.17.5" + postcss "^8.4.23" + rollup "^3.21.0" + optionalDependencies: + fsevents "~2.3.2" + +void-elements@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz" + integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== + +warning@^4.0.2: + version "4.0.3" + resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + +xmlhttprequest-ssl@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz" + integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^2.1.1: + version "2.3.1" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz" + integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== + +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== + +zustand@^4.3.9: + version "4.3.9" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.3.9.tgz#a7d4332bbd75dfd25c6848180b3df1407217f2ad" + integrity sha512-Tat5r8jOMG1Vcsj8uldMyqYKC5IZvQif8zetmLHs9WoZlntTHmIoNM8TpLRY31ExncuUvUOXehd0kvahkuHjDw== + dependencies: + use-sync-external-store "1.2.0"