Zlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i
zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7
zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG
z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S
zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr
z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S
zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er
zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa
zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc-
zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V
zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I
zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc
z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E(
zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef
LrJugUA?W`A8`#=m
literal 0
HcmV?d00001
diff --git a/onboarding/src/components/Page.tsx b/onboarding/src/components/Page.tsx
new file mode 100644
index 0000000000..f4e47a5a28
--- /dev/null
+++ b/onboarding/src/components/Page.tsx
@@ -0,0 +1,67 @@
+import { useEffect, ReactNode } from 'react';
+import { track } from '@amplitude/analytics-browser';
+import NextHead from 'next/head';
+import { Rubik } from 'next/font/google';
+import styled from 'styled-components';
+import { useToggle } from '@holium/design-system';
+import { api } from '../util/api';
+import { useNavigation } from '../util/useNavigation';
+
+const Main = styled.main`
+ width: 100%;
+ height: 100vh;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+`;
+
+const rubik = Rubik({ subsets: ['latin'], weight: 'variable' });
+
+type Props = {
+ title: string;
+ isProtected?: boolean;
+ children: ReactNode;
+};
+
+export const Page = ({ title, isProtected = false, children }: Props) => {
+ const { goToPage, logout } = useNavigation();
+ const authenticated = useToggle(false);
+
+ useEffect(() => {
+ track(title);
+ });
+
+ useEffect(() => {
+ if (!isProtected) return;
+
+ const refreshAndStoreToken = async (token: string) => {
+ try {
+ const response = await api.refreshToken(token);
+ localStorage.setItem('token', response.token);
+ authenticated.toggleOn();
+ } catch (error) {
+ console.error(error);
+ logout();
+ }
+ };
+
+ const token = localStorage.getItem('token');
+
+ if (!token) goToPage('/');
+ else refreshAndStoreToken(token);
+ }, [isProtected]);
+
+ return (
+ <>
+
+ {title}
+
+
+
+
+
+ {isProtected ? (authenticated.isOn ? children : null) : children}
+
+ >
+ );
+};
diff --git a/onboarding/src/pages/_app.tsx b/onboarding/src/pages/_app.tsx
new file mode 100644
index 0000000000..bd3990f23a
--- /dev/null
+++ b/onboarding/src/pages/_app.tsx
@@ -0,0 +1,14 @@
+import type { AppProps } from 'next/app';
+import * as Amplitude from '@amplitude/analytics-browser';
+import { constants } from '../util/constants';
+import '../style/app.css';
+
+Amplitude.init(constants.AMPLITUDE_API_KEY, undefined, {
+ trackingOptions: {
+ ipAddress: false,
+ },
+});
+
+export default function App({ Component, pageProps }: AppProps) {
+ return ;
+}
diff --git a/onboarding/src/pages/_document.tsx b/onboarding/src/pages/_document.tsx
new file mode 100644
index 0000000000..e1e9cbbb75
--- /dev/null
+++ b/onboarding/src/pages/_document.tsx
@@ -0,0 +1,13 @@
+import { Html, Head, Main, NextScript } from 'next/document';
+
+export default function Document() {
+ return (
+
+
+
+
+
+
+
+ );
+}
diff --git a/onboarding/src/pages/account/custom-domain.tsx b/onboarding/src/pages/account/custom-domain.tsx
new file mode 100644
index 0000000000..3c1dea2a72
--- /dev/null
+++ b/onboarding/src/pages/account/custom-domain.tsx
@@ -0,0 +1,79 @@
+import { useMemo, useState } from 'react';
+import { AccountCustomDomainDialog } from '@holium/shared';
+import { useUser, UserContextProvider } from 'util/UserContext';
+import { api } from 'util/api';
+import { Page } from '../../components/Page';
+import { accountPageUrl, useNavigation } from '../../util/useNavigation';
+
+const CustomDomainPresenter = () => {
+ const { goToPage, logout } = useNavigation();
+ const { token, ships, selectedPatp, setSelectedPatp } = useUser();
+
+ const [successMessage, setSuccessMessage] = useState();
+ const [errorMessage, setErrorMessage] = useState();
+
+ const ship = useMemo(
+ () => ships.find((ship) => ship.patp === selectedPatp),
+ [ships, selectedPatp]
+ );
+
+ const onClickSave = async (domain: string) => {
+ if (!ship) return;
+
+ setErrorMessage(undefined);
+ setSuccessMessage(undefined);
+
+ const result = await api.setCustomDomain(
+ token,
+ domain,
+ ship.droplet_id.toString(),
+ ship.droplet_ip,
+ ship.id.toString(),
+ ship.user_id.toString()
+ );
+
+ if (result) {
+ if (result.checkIp !== ship.droplet_id.toString()) {
+ setErrorMessage(
+ `The domain you entered does not point to the correct IP address (${ship.droplet_ip}).`
+ );
+ } else {
+ setSuccessMessage(
+ `Your domain has been set to ${domain}. It may take a few minutes to propagate.`
+ );
+ }
+ }
+ };
+
+ const onClickSidebarSection = (section: string) => {
+ goToPage(accountPageUrl[section]);
+ };
+
+ if (!ship) return null;
+
+ return (
+
+ ship.patp)}
+ selectedPatp={selectedPatp}
+ dropletIp={ship.droplet_ip}
+ errorMessage={errorMessage}
+ successMessage={successMessage}
+ setSelectedPatp={setSelectedPatp}
+ onClickSave={onClickSave}
+ onClickSidebarSection={onClickSidebarSection}
+ onExit={logout}
+ />
+
+ );
+};
+
+export default function CustomDomain() {
+ return (
+
+
+
+
+
+ );
+}
diff --git a/onboarding/src/pages/account/download-realm.tsx b/onboarding/src/pages/account/download-realm.tsx
new file mode 100644
index 0000000000..1ae696c613
--- /dev/null
+++ b/onboarding/src/pages/account/download-realm.tsx
@@ -0,0 +1,39 @@
+import { AccountDownloadRealmDialog } from '@holium/shared';
+import { useUser, UserContextProvider } from 'util/UserContext';
+import { Page } from '../../components/Page';
+import { accountPageUrl, useNavigation } from '../../util/useNavigation';
+
+const DownloadRealmPresenter = () => {
+ const { goToPage, logout } = useNavigation();
+ const { ships, selectedPatp, setSelectedPatp } = useUser();
+
+ const onClickSidebarSection = (section: string) => {
+ goToPage(accountPageUrl[section]);
+ };
+
+ return (
+
+ ship.patp)}
+ selectedPatp={selectedPatp}
+ setSelectedPatp={setSelectedPatp}
+ onDownloadMacM1={() => {}}
+ onDownloadMacIntel={() => {}}
+ onDownloadWindows={() => {}}
+ onDownloadLinux={() => {}}
+ onClickSidebarSection={onClickSidebarSection}
+ onExit={logout}
+ />
+
+ );
+};
+
+export default function DownloadRealm() {
+ return (
+
+
+
+
+
+ );
+}
diff --git a/onboarding/src/pages/account/index.tsx b/onboarding/src/pages/account/index.tsx
new file mode 100644
index 0000000000..f2d2002354
--- /dev/null
+++ b/onboarding/src/pages/account/index.tsx
@@ -0,0 +1,156 @@
+import { useEffect, useState, useMemo } from 'react';
+import {
+ AccountHostingDialog,
+ ChangeEmailModal,
+ ChangeMaintenanceWindowModal,
+ VerifyEmailModal,
+ GetNewAccessCodeModal,
+} from '@holium/shared';
+import { useToggle } from '@holium/design-system';
+import { Page } from '../../components/Page';
+import { accountPageUrl, useNavigation } from '../../util/useNavigation';
+import { api } from '../../util/api';
+import { UserContextProvider, useUser } from '../../util/UserContext';
+
+const HostingPresenter = () => {
+ const { goToPage, logout } = useNavigation();
+ const { token, ships, selectedPatp, setSelectedPatp } = useUser();
+
+ const changeEmailModal = useToggle(false);
+ const verifyEmailModal = useToggle(false);
+ const getNewAccessCodeModal = useToggle(false);
+ const changeMaintenanceWindowModal = useToggle(false);
+
+ const selectedShip = useMemo(
+ () => ships.find((ship) => ship.patp === selectedPatp),
+ [ships, selectedPatp]
+ );
+
+ const [managePaymentLink, setManagePaymentLink] = useState('');
+
+ const onClickSidebarSection = (section: string) => {
+ goToPage(accountPageUrl[section]);
+ };
+
+ const onSubmitNewEmail = async (email: string) => {
+ try {
+ const response = await api.changeEmail(token, email);
+
+ if (response.email) {
+ changeEmailModal.toggleOff();
+ verifyEmailModal.toggleOn();
+ return true;
+ }
+ } catch (e) {
+ return false;
+ }
+
+ return false;
+ };
+
+ const onSubmitVerificationToken = async (
+ verificationToken: string,
+ password: string
+ ) => {
+ try {
+ const response = await api.verifyEmail(verificationToken, password);
+
+ if (response.token) {
+ window.location.reload();
+ return true;
+ }
+ } catch (e) {
+ return false;
+ }
+
+ return false;
+ };
+
+ const onSubmitNewAccessCode = async () => {
+ if (!selectedShip) return Promise.resolve(false);
+
+ const response = await api.resetShipCode(token, selectedShip.id.toString());
+
+ if (response) return true;
+ return false;
+ };
+
+ const onSubmitNewMaintenanceWindow = async (maintenanceWindow: string) => {
+ if (!selectedShip) return Promise.resolve(false);
+
+ const response = await api.updateMaintenanceWindow(
+ token,
+ selectedShip.id.toString(),
+ maintenanceWindow
+ );
+
+ if (response?.maintenance_window) return true;
+ return false;
+ };
+
+ const onClickManageBilling = () => {
+ window.open(managePaymentLink, '_blank');
+ };
+
+ const onClickEjectId = () => {};
+
+ useEffect(() => {
+ api
+ .getManagePaymentLink(token)
+ .then((response) => setManagePaymentLink(response.url));
+ }, []);
+
+ if (!selectedShip) return null;
+
+ return (
+
+
+
+
+
+ ship.patp)}
+ selectedPatp={selectedPatp}
+ email={selectedShip.email}
+ shipUrl={selectedShip.link}
+ shipCode={selectedShip.code}
+ shipMaintenanceWindow={selectedShip.maintenance_window}
+ setSelectedPatp={setSelectedPatp}
+ onClickChangeEmail={changeEmailModal.toggleOn}
+ onClickManageBilling={onClickManageBilling}
+ onClickGetNewAccessCode={getNewAccessCodeModal.toggleOn}
+ onClickChangeMaintenanceWindow={changeMaintenanceWindowModal.toggleOn}
+ onClickEjectId={onClickEjectId}
+ onClickSidebarSection={onClickSidebarSection}
+ onExit={logout}
+ />
+
+ );
+};
+
+export default function Hosting() {
+ return (
+
+
+
+
+
+ );
+}
diff --git a/onboarding/src/pages/account/s3-storage.tsx b/onboarding/src/pages/account/s3-storage.tsx
new file mode 100644
index 0000000000..ba12b99d79
--- /dev/null
+++ b/onboarding/src/pages/account/s3-storage.tsx
@@ -0,0 +1,62 @@
+import { useEffect, useState } from 'react';
+import { AccountS3StorageDialog } from '@holium/shared';
+import { Page } from '../../components/Page';
+import { api, GetUserS3InfoResponse } from '../../util/api';
+import { accountPageUrl, useNavigation } from '../../util/useNavigation';
+import { UserContextProvider, useUser } from '../../util/UserContext';
+
+const S3StoragePresenter = () => {
+ const { goToPage, logout } = useNavigation();
+ const { token, ships, selectedPatp, setSelectedPatp } = useUser();
+
+ const [s3Info, setS3Info] = useState();
+ const [networkUsage, setNetworkUsage] = useState(0);
+ const [minioUsage, setMinioUsage] = useState(0);
+
+ const onClickSidebarSection = (section: string) => {
+ goToPage(accountPageUrl[section]);
+ };
+
+ useEffect(() => {
+ const selectedShip = ships.find((ship) => ship.patp === selectedPatp);
+
+ if (!selectedShip) return;
+
+ api.getUserS3Info(token, selectedShip.id.toString()).then(setS3Info);
+
+ api
+ .getUserResourceHistory(token, selectedShip.id.toString())
+ .then((response) => {
+ setNetworkUsage(response.networkUsage?.network_sent_total ?? 0);
+ setMinioUsage(response.networkUsage?.minio_sent_total ?? 0);
+ });
+ }, []);
+
+ return (
+ ship.patp)}
+ selectedPatp={selectedPatp}
+ setSelectedPatp={setSelectedPatp}
+ url={s3Info?.consoleUrl}
+ s3Bucket={s3Info?.userName}
+ s3Password={s3Info?.code}
+ dataStorage={{
+ used: Number(s3Info?.storageUsed),
+ total: Number(s3Info?.storageCapacity),
+ }}
+ dataSent={{ networkUsage, minioUsage }}
+ onClickSidebarSection={onClickSidebarSection}
+ onExit={logout}
+ />
+ );
+};
+
+export default function S3Storage() {
+ return (
+
+
+
+
+
+ );
+}
diff --git a/onboarding/src/pages/account/statistics.tsx b/onboarding/src/pages/account/statistics.tsx
new file mode 100644
index 0000000000..076014a52e
--- /dev/null
+++ b/onboarding/src/pages/account/statistics.tsx
@@ -0,0 +1,35 @@
+import { AccountStatisticsDialog } from '@holium/shared';
+import { Page } from '../../components/Page';
+import { accountPageUrl, useNavigation } from '../../util/useNavigation';
+import { UserContextProvider, useUser } from '../../util/UserContext';
+
+const StatisticsPresenter = () => {
+ const { goToPage, logout } = useNavigation();
+ const { ships, selectedPatp, setSelectedPatp } = useUser();
+
+ const onClickSidebarSection = (section: string) => {
+ goToPage(accountPageUrl[section]);
+ };
+
+ return (
+
+ ship.patp)}
+ selectedPatp={selectedPatp}
+ setSelectedPatp={setSelectedPatp}
+ onClickSidebarSection={onClickSidebarSection}
+ onExit={logout}
+ />
+
+ );
+};
+
+export default function Statistics() {
+ return (
+
+
+
+
+
+ );
+}
diff --git a/onboarding/src/pages/booting.tsx b/onboarding/src/pages/booting.tsx
new file mode 100644
index 0000000000..34f26ffb1f
--- /dev/null
+++ b/onboarding/src/pages/booting.tsx
@@ -0,0 +1,69 @@
+import { useCallback, useEffect, useRef, useState } from 'react';
+import { BootingDialog } from '@holium/shared';
+import { Page } from 'components/Page';
+import { useNavigation } from '../util/useNavigation';
+import { api } from '../util/api';
+import { useToggle } from '@holium/design-system';
+
+export default function Booting() {
+ const { goToPage } = useNavigation();
+
+ const intervalRef = useRef();
+ const [logs, setLogs] = useState(['Booting started.']);
+ const booting = useToggle(true);
+
+ const pollShipStatus = useCallback(async () => {
+ const patp = localStorage.getItem('patp');
+ const token = localStorage.getItem('token');
+
+ if (!patp || !token) return;
+
+ const ships = await api.getUserShips(token);
+ const ship = Object.values(ships).find((s) => s.patp === patp);
+
+ if (!ship) return;
+
+ if (logs.length === 1) {
+ setLogs((logs) => [...logs, `${patp} will be ready in a few minutes.`]);
+ }
+
+ const shipCode = ship.code;
+ if (shipCode) {
+ setLogs((logs) => [...logs, 'Assigning a domain.']);
+ }
+
+ const shipLink = ship.link;
+ const isBooted = shipLink.includes('https://');
+ if (isBooted) {
+ booting.toggleOff();
+ if (intervalRef.current) clearInterval(intervalRef.current);
+
+ setLogs((logs) => [
+ ...logs,
+ `Successfully assigned a domain: ${shipLink}.`,
+ 'Booting complete.',
+ ]);
+
+ // Store credentials for next page.
+ localStorage.setItem('url', shipLink);
+ localStorage.setItem('accessCode', shipCode);
+ }
+ }, [booting, logs]);
+
+ const onNext = useCallback(() => goToPage('/credentials'), [goToPage]);
+
+ useEffect(() => {
+ if (!booting.isOn) return;
+
+ const i = setInterval(pollShipStatus, 5000);
+ intervalRef.current = i;
+
+ return () => clearInterval(i);
+ }, [booting, pollShipStatus]);
+
+ return (
+
+
+
+ );
+}
diff --git a/onboarding/src/pages/choose-id.tsx b/onboarding/src/pages/choose-id.tsx
new file mode 100644
index 0000000000..8fb7b26933
--- /dev/null
+++ b/onboarding/src/pages/choose-id.tsx
@@ -0,0 +1,44 @@
+import { ChooseIdDialog } from '@holium/shared';
+import { Page } from 'components/Page';
+import { useNavigation } from '../util/useNavigation';
+import { api } from '../util/api';
+
+type ServerSideProps = {
+ patps: string[];
+};
+
+export async function getServerSideProps() {
+ const products = await api.getProducts();
+ const productId = products[0].id;
+
+ const planets = await api.getPlanets(productId);
+ const patps = Object.values(planets.planets)
+ .filter((planet) => planet.planet_status === 'available')
+ .map((planet) => planet.patp);
+
+ return {
+ props: {
+ patps,
+ } as ServerSideProps,
+ };
+}
+
+export default function ChooseId({ patps }: ServerSideProps) {
+ const { goToPage } = useNavigation();
+
+ const onSelectPatp = (patp: string) => {
+ localStorage.setItem('patp', patp);
+ };
+
+ const onNext = () => goToPage('/payment');
+
+ return (
+
+
+
+ );
+}
diff --git a/onboarding/src/pages/credentials.tsx b/onboarding/src/pages/credentials.tsx
new file mode 100644
index 0000000000..5474f33a88
--- /dev/null
+++ b/onboarding/src/pages/credentials.tsx
@@ -0,0 +1,35 @@
+import { useEffect, useState } from 'react';
+import { CredentialsDialog } from '@holium/shared';
+import { Page } from 'components/Page';
+import { useNavigation } from '../util/useNavigation';
+
+export default function Credentials() {
+ const { goToPage } = useNavigation();
+ const [credentials, setCredentials] = useState({
+ id: '',
+ url: '',
+ accessCode: '',
+ });
+
+ const onBack = () => goToPage('/booting');
+
+ const onNext = () => goToPage('/download');
+
+ useEffect(() => {
+ setCredentials({
+ id: localStorage.getItem('patp') ?? '',
+ url: localStorage.getItem('url') ?? '',
+ accessCode: localStorage.getItem('accessCode') ?? '',
+ });
+ }, []);
+
+ return (
+
+
+
+ );
+}
diff --git a/onboarding/src/pages/download.tsx b/onboarding/src/pages/download.tsx
new file mode 100644
index 0000000000..5b9c897d77
--- /dev/null
+++ b/onboarding/src/pages/download.tsx
@@ -0,0 +1,40 @@
+import { DownloadDialog } from '@holium/shared';
+import { Page } from 'components/Page';
+import { useNavigation } from '../util/useNavigation';
+
+const downloadLinks = {
+ macM1: 'https://ghproxy.holium.xyz/latest-Realm-mac-arm64.dmg',
+ macIntel: 'https://ghproxy.holium.xyz/latest-Realm-mac.dmg',
+ windows: 'https://ghproxy.holium.xyz/latest/windows',
+ linux: 'https://ghproxy.holium.xyz/latest/linux',
+};
+
+export default function Download() {
+ const { goToPage } = useNavigation();
+
+ const onBack = () => goToPage('/credentials');
+
+ const onNext = () => goToPage('/account');
+
+ const onDownloadMacM1 = () => window.open(downloadLinks.macM1, '_blank');
+
+ const onDownloadMacIntel = () =>
+ window.open(downloadLinks.macIntel, '_blank');
+
+ const onDownloadWindows = () => window.open(downloadLinks.windows, '_blank');
+
+ const onDownloadLinux = () => window.open(downloadLinks.linux, '_blank');
+
+ return (
+
+
+
+ );
+}
diff --git a/onboarding/src/pages/index.tsx b/onboarding/src/pages/index.tsx
new file mode 100644
index 0000000000..08c8fa3237
--- /dev/null
+++ b/onboarding/src/pages/index.tsx
@@ -0,0 +1,34 @@
+import { CreateAccountDialog } from '@holium/shared';
+import { Page } from 'components/Page';
+import { api } from '../util/api';
+import { useNavigation } from '../util/useNavigation';
+
+export default function CreateAccount() {
+ const { goToPage } = useNavigation();
+
+ const onAlreadyHaveAccount = () => goToPage('/login');
+
+ const onNext = async (email: string, password: string) => {
+ // Save email in local storage for later steps in the onboarding flow.
+ localStorage.setItem('email', email);
+ localStorage.setItem('password', password);
+
+ try {
+ const result = await api.register(email, password);
+ goToPage('/verify-email');
+ return Boolean(result);
+ } catch (error) {
+ console.error(error);
+ return false;
+ }
+ };
+
+ return (
+
+
+
+ );
+}
diff --git a/onboarding/src/pages/login.tsx b/onboarding/src/pages/login.tsx
new file mode 100644
index 0000000000..b04398fcfe
--- /dev/null
+++ b/onboarding/src/pages/login.tsx
@@ -0,0 +1,31 @@
+import { LoginDialog } from '@holium/shared';
+import { Page } from '../components/Page';
+import { api } from '../util/api';
+import { useNavigation } from '../util/useNavigation';
+
+export default function Login() {
+ const { goToPage } = useNavigation();
+
+ const onNoAccount = () => goToPage('/');
+
+ const onLogin = async (email: string, password: string) => {
+ try {
+ const response = await api.login(email, password);
+ localStorage.setItem('token', response.token);
+
+ goToPage('/account');
+
+ return Boolean(response);
+ } catch (error) {
+ console.error(error);
+
+ return false;
+ }
+ };
+
+ return (
+
+
+
+ );
+}
diff --git a/onboarding/src/pages/payment.tsx b/onboarding/src/pages/payment.tsx
new file mode 100644
index 0000000000..785cd506e0
--- /dev/null
+++ b/onboarding/src/pages/payment.tsx
@@ -0,0 +1,109 @@
+import { useState, useEffect } from 'react';
+import { loadStripe, Stripe, StripeElementsOptions } from '@stripe/stripe-js';
+import { PaymentDialog, ThirdEarthProduct } from '@holium/shared';
+import { Page } from 'components/Page';
+import { constants } from '../util/constants';
+import { useNavigation } from '../util/useNavigation';
+import { api } from '../util/api';
+
+type ServerSideProps = {
+ products: ThirdEarthProduct[];
+};
+
+export async function getServerSideProps() {
+ const products = await api.getProducts();
+
+ return {
+ props: {
+ products,
+ } as ServerSideProps,
+ };
+}
+
+export default function Payment({ products }: ServerSideProps) {
+ const { goToPage } = useNavigation();
+
+ const [patp, setPatp] = useState('');
+ const [email, setEmail] = useState('');
+ const [token, setToken] = useState('');
+
+ const [stripe, setStripe] = useState();
+ const [clientSecret, setClientSecret] = useState();
+
+ const [productId, setProductId] = useState(products[0].id);
+ const [invoiceId, setInvoiceId] = useState();
+
+ useEffect(() => {
+ const patp = localStorage.getItem('patp');
+ const email = localStorage.getItem('email');
+ const token = localStorage.getItem('token');
+
+ if (!token || !patp || !email) return;
+
+ setPatp(patp);
+ setEmail(email);
+ setToken(token);
+
+ const getSecretAndSetupStripe = async () => {
+ const response = await api.stripeMakePayment(
+ token,
+ productId.toString(),
+ patp
+ );
+ setClientSecret(response.clientSecret);
+ setInvoiceId(response.invoiceId);
+
+ const stripe = await loadStripe(constants.STRIPE_KEY);
+ if (stripe) setStripe(stripe);
+ };
+
+ try {
+ getSecretAndSetupStripe();
+ } catch (e) {
+ console.error(e);
+ }
+ }, [productId]);
+
+ const stripeOptions: StripeElementsOptions = {
+ clientSecret: clientSecret,
+ appearance: {
+ theme: 'stripe',
+ },
+ };
+
+ const onBack = () => goToPage('/choose-id');
+
+ const onNext = async () => {
+ if (!token || !patp || !invoiceId || !productId) return false;
+
+ try {
+ await api.updatePaymentStatus(token, invoiceId, 'OK');
+ await api.updatePlanetStatus(token, patp, 'sold');
+ await api.ship(token, patp, productId.toString(), invoiceId);
+
+ goToPage('/booting');
+
+ return true;
+ } catch (error) {
+ console.error(error);
+
+ return false;
+ }
+ };
+
+ return (
+
+
+
+ );
+}
diff --git a/onboarding/src/pages/verify-email.tsx b/onboarding/src/pages/verify-email.tsx
new file mode 100644
index 0000000000..0bff07bc0e
--- /dev/null
+++ b/onboarding/src/pages/verify-email.tsx
@@ -0,0 +1,45 @@
+import { VerifyEmailDialog } from '@holium/shared';
+import { Page } from 'components/Page';
+import { api } from '../util/api';
+import { useNavigation } from '../util/useNavigation';
+
+export default function VerifyEmail() {
+ const { goToPage } = useNavigation();
+
+ const onResend = () => {
+ const email = localStorage.getItem('email');
+ const password = localStorage.getItem('password');
+
+ if (email && password) {
+ try {
+ api.register(email, password);
+ } catch (error) {
+ console.error(error);
+ goToPage('/');
+ }
+ }
+ };
+
+ const onBack = () => goToPage('/');
+
+ const onNext = async (verificationcode: string) => {
+ try {
+ const result = await api.verifyEmail(verificationcode);
+ localStorage.setItem('token', result.token);
+
+ goToPage('/choose-id');
+
+ return Boolean(result);
+ } catch (error) {
+ console.error(error);
+
+ return false;
+ }
+ };
+
+ return (
+
+
+
+ );
+}
diff --git a/onboarding/src/style/app.css b/onboarding/src/style/app.css
new file mode 100644
index 0000000000..27e32d5208
--- /dev/null
+++ b/onboarding/src/style/app.css
@@ -0,0 +1,56 @@
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ width: 100vw;
+ height: 100vh;
+ background-size: cover;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-image: url(https://images.unsplash.com/photo-1673447042805-7a3b1096f3a7?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=4032&q=80);
+}
+
+:root {
+ --blur: blur(24px);
+ --transition-fast: 0.4s ease;
+ --transition: all 0.25s ease;
+ --transition-2x: all 0.5s ease;
+
+ --rlm-border-radius-4: 4px;
+ --rlm-border-radius-6: 6px;
+ --rlm-border-radius-9: 9px;
+ --rlm-border-radius-12: 12px;
+ --rlm-border-radius-16: 16px;
+ --rlm-box-shadow-1: 0px 0px 4px rgba(0, 0, 0, 0.06);
+ --rlm-box-shadow-2: 0px 0px 9px rgba(0, 0, 0, 0.12);
+ --rlm-box-shadow-3: 0px 0px 9px rgba(0, 0, 0, 0.18);
+ --rlm-box-shadow-lifted: 0px 0px 9px rgba(0, 0, 0, 0.24);
+
+ --rlm-home-button-rgba: 11, 11, 11, 0.2;
+ --rlm-base-rgba: 114, 76, 84;
+ --rlm-accent-rgba: 78, 158, 253;
+ --rlm-input-rgba: 81, 54, 59;
+ --rlm-border-rgba: 120, 80, 89;
+ --rlm-window-rgba: 99, 66, 73;
+ --rlm-window-bg-rgba: 99, 66, 73, 0.9;
+ --rlm-dock-rgba: 99, 66, 73, 0.65;
+ --rlm-card-rgba: 99, 66, 73;
+ --rlm-text-rgba: 255, 255, 255;
+ --rlm-icon-rgba: 255, 255, 255, 0.7;
+ --rlm-intent-alert-rgba: 255, 98, 64;
+ --rlm-intent-caution-rgba: 255, 188, 50;
+ --rlm-intent-success-rgba: 15, 195, 131;
+ --rlm-overlay-hover-rgba: 255, 255, 255, 0.06;
+ --rlm-overlay-active-rgba: 255, 255, 255, 0.09;
+}
+
+a {
+ color: rgba(var(--rlm-accent-rgba));
+}
+
+a:visted {
+ color: rgba(var(--rlm-accent-rgba));
+}
diff --git a/onboarding/src/util/UserContext.tsx b/onboarding/src/util/UserContext.tsx
new file mode 100644
index 0000000000..b6db47d32f
--- /dev/null
+++ b/onboarding/src/util/UserContext.tsx
@@ -0,0 +1,61 @@
+import {
+ createContext,
+ ReactNode,
+ useContext,
+ useEffect,
+ useState,
+} from 'react';
+import { ThirdEarthShip } from '@holium/shared';
+import { api } from './api';
+
+interface IUserContext {
+ token: string;
+ ships: ThirdEarthShip[];
+ selectedPatp: string;
+ setSelectedPatp: (patp: string) => void;
+}
+
+const UserContext = createContext(null as any);
+
+type Props = {
+ children: ReactNode;
+};
+
+export const UserContextProvider = ({ children }: Props) => {
+ const [token, setToken] = useState();
+ const [ships, setShips] = useState([]);
+ const [selectedPatp, setSelectedPatp] = useState();
+
+ useEffect(() => {
+ const token = localStorage.getItem('token');
+
+ if (!token || ships.length) return;
+
+ const getAndSetUserData = async () => {
+ const newShips = await api.getUserShips(token);
+
+ setToken(token);
+ setShips(newShips);
+ setSelectedPatp(newShips[0].patp);
+ };
+
+ getAndSetUserData();
+ }, []);
+
+ if (!ships || !token || !selectedPatp) return null;
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const useUser = () => useContext(UserContext);
diff --git a/onboarding/src/util/api.ts b/onboarding/src/util/api.ts
new file mode 100644
index 0000000000..b666619413
--- /dev/null
+++ b/onboarding/src/util/api.ts
@@ -0,0 +1,327 @@
+import {
+ ThirdEarthProduct,
+ ThirdEarthPortalSession,
+ ThirdEarthShip,
+} from '@holium/shared';
+import { constants } from './constants';
+import { http } from './http';
+
+const defaultHeaders = {
+ 'Content-Type': 'application/json',
+ client_id: constants.API_HEADERS_CLIENT_ID,
+ version: constants.API_HEADERS_VERSION,
+};
+
+type LoginResponse = {
+ token: string;
+};
+
+type RegisterResponse = {
+ message: string;
+};
+
+type VerifyEmailResponse = {
+ message: string;
+ token: string;
+};
+
+type RefreshTokenResponse = {
+ token: string;
+};
+
+type GetProductsResponse = {
+ [key: number]: ThirdEarthProduct;
+};
+
+type GetPlanetsResponse = {
+ freeProduct: boolean;
+ planets: {
+ [key: number]: {
+ id: number;
+ patp: string;
+ planet_status: 'available' | 'sold';
+ sigil: string;
+ };
+ };
+};
+
+type GetUserShipsResponse = ThirdEarthShip[];
+
+type GetUserNetworkUsageResponse = {
+ networkUsage?: {
+ minio_sent_total: number | null;
+ network_sent_total: number | null;
+ received_total: number | null;
+ ship_id: number;
+ total_sent: number | null;
+ };
+};
+
+export type GetUserS3InfoResponse = {
+ code: string;
+ consoleUrl: string;
+ storageCapacity: number;
+ storageUsed: string;
+ userName: string;
+};
+
+type CreateCustomerPortalSessionResponse = ThirdEarthPortalSession;
+
+type StripeMakePaymentResponse = {
+ clientSecret: string;
+ invoiceId: string;
+ paymentMethods: {
+ data: any[];
+ };
+ subscriptionId: string;
+};
+
+type SetCustomDomainResponse = {
+ checkIp: string;
+ message: string;
+};
+
+type ChangeEmailResponse = {
+ message: string;
+ email?: string;
+};
+
+type ResetShipCodeResponse = {
+ ship_id: string;
+ updated_code: string;
+};
+
+type UpdateMaintenanceWindowResponse = {
+ maintenance_window: string;
+};
+
+export const api = {
+ login: (email: string, password: string) => {
+ return http(`${constants.API_URL}/login`, {
+ method: 'POST',
+ headers: defaultHeaders,
+ body: JSON.stringify({
+ email,
+ password,
+ keepLogged: true,
+ }),
+ });
+ },
+ register: (email: string, password: string) => {
+ return http(`${constants.API_URL}/register`, {
+ method: 'POST',
+ headers: defaultHeaders,
+ body: JSON.stringify({
+ email,
+ password,
+ }),
+ });
+ },
+ verifyEmail: (verificationcode: string, password?: string) => {
+ return http(`${constants.API_URL}/verify-account`, {
+ method: 'POST',
+ headers: defaultHeaders,
+ body: JSON.stringify({
+ verificationcode,
+ /* the account password is needed if confirming an email change,
+ otherwise you can leave out or ignore this field */
+ password,
+ }),
+ });
+ },
+ getProducts: () => {
+ return http(`${constants.API_URL}/products/en`, {
+ method: 'GET',
+ headers: defaultHeaders,
+ });
+ },
+ getPlanets: (productId: number) => {
+ return http(
+ `${constants.API_URL}/operator/get-planets-to-sell/${productId}`,
+ {
+ method: 'GET',
+ headers: defaultHeaders,
+ }
+ );
+ },
+ stripeMakePayment(
+ token: string,
+ productId: string,
+ patp: string,
+ coupon = 'undefined'
+ ) {
+ return http(
+ `${constants.API_URL}/stripe-make-payment`,
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ Authorization: `Bearer ${token}`,
+ },
+ body: JSON.stringify({
+ productId,
+ patp,
+ coupon,
+ }),
+ }
+ );
+ },
+ updatePaymentStatus(token: string, invoiceId: string, paymentStatus: 'OK') {
+ return http(`${constants.API_URL}/update-payment-status`, {
+ method: 'PUT',
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ body: JSON.stringify({
+ invoiceId,
+ paymentStatus,
+ }),
+ });
+ },
+ ship(token: string, patp: string, product: string, invoiceId: string) {
+ return http(`${constants.API_URL}/ship`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ Authorization: `Bearer ${token}`,
+ },
+ body: JSON.stringify({
+ patp,
+ shipType: 'planet',
+ product,
+ invoiceId,
+ }),
+ });
+ },
+ updatePlanetStatus(
+ token: string,
+ patp: string,
+ planetStatus: 'available' | 'sold'
+ ) {
+ return http(`${constants.API_URL}/update-planet-status`, {
+ method: 'PUT',
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ body: JSON.stringify({
+ patp,
+ planetStatus,
+ }),
+ });
+ },
+ getUserShips(token: string) {
+ return http(`${constants.API_URL}/get-user-ships`, {
+ method: 'GET',
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ });
+ },
+ getUserResourceHistory(token: string, shipId: string) {
+ return http(
+ `${constants.API_URL}/user/resource-history/${shipId}`,
+ {
+ method: 'GET',
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ }
+ );
+ },
+ getUserS3Info(token: string, shipId: string) {
+ return http(
+ `${constants.API_URL}/user/s3/${shipId}`,
+ {
+ method: 'GET',
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ }
+ );
+ },
+ getManagePaymentLink(token: string) {
+ return http(
+ `${constants.API_URL}/create-customer-portal-session`,
+ {
+ method: 'POST',
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ }
+ );
+ },
+ changeEmail(token: string, email: string) {
+ return http(`${constants.API_URL}/change-email`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ version: constants.API_HEADERS_VERSION,
+ Authorization: `Bearer ${token}`,
+ },
+ body: JSON.stringify({
+ email,
+ }),
+ });
+ },
+ setCustomDomain(
+ token: string,
+ domain: string,
+ dropletId: string,
+ dropletIp: string,
+ shipId: string,
+ userId: string
+ ) {
+ return http(`${constants.API_URL}/record-domain`, {
+ method: 'POST',
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ body: JSON.stringify({
+ domain,
+ dropletId,
+ dropletIp,
+ link: `https://${domain}`,
+ shipId,
+ userId,
+ }),
+ });
+ },
+ resetShipCode(token: string, shipId: string) {
+ return http(
+ `${constants.API_URL}/user/reset-code/${shipId}`,
+ {
+ method: 'PUT',
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ }
+ );
+ },
+ updateMaintenanceWindow(
+ token: string,
+ shipId: string,
+ maintenanceWindow: string
+ ) {
+ return http(
+ `${constants.API_URL}/user/ship/${shipId}`,
+ {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/json',
+ Authorization: `Bearer ${token}`,
+ },
+ body: JSON.stringify({
+ maintenance_window: maintenanceWindow,
+ }),
+ }
+ );
+ },
+ refreshToken: (token: string) => {
+ return http(`${constants.API_URL}/refresh-token`, {
+ method: 'GET',
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ });
+ },
+};
diff --git a/onboarding/src/util/constants.ts b/onboarding/src/util/constants.ts
new file mode 100644
index 0000000000..7351226609
--- /dev/null
+++ b/onboarding/src/util/constants.ts
@@ -0,0 +1,11 @@
+import getConfig from 'next/config';
+
+const nextConfig = getConfig().publicRuntimeConfig;
+
+export const constants = {
+ API_URL: nextConfig.API_URL as string,
+ API_HEADERS_VERSION: nextConfig.API_HEADERS_VERSION as string,
+ API_HEADERS_CLIENT_ID: nextConfig.API_HEADERS_CLIENT_ID as string,
+ STRIPE_KEY: nextConfig.STRIPE_KEY as string,
+ AMPLITUDE_API_KEY: nextConfig.AMPLITUDE_API_KEY as string,
+};
diff --git a/onboarding/src/util/http.ts b/onboarding/src/util/http.ts
new file mode 100644
index 0000000000..742f007ac0
--- /dev/null
+++ b/onboarding/src/util/http.ts
@@ -0,0 +1,11 @@
+export function http(
+ input: RequestInfo | URL,
+ init?: RequestInit
+): Promise {
+ return fetch(input, init).then((response) => {
+ if (!response.ok) {
+ throw new Error(response.statusText);
+ }
+ return response.json();
+ });
+}
diff --git a/onboarding/src/util/useNavigation.ts b/onboarding/src/util/useNavigation.ts
new file mode 100644
index 0000000000..5a1349a3b8
--- /dev/null
+++ b/onboarding/src/util/useNavigation.ts
@@ -0,0 +1,42 @@
+import { useRouter } from 'next/router';
+import { useCallback } from 'react';
+
+type AccountPage =
+ | '/account'
+ | '/account/custom-domain'
+ | '/account/download-realm'
+ | '/account/s3-storage'
+ | '/account/statistics';
+
+type OnboardingPage =
+ | '/'
+ | '/login'
+ | '/verify-email'
+ | '/choose-id'
+ | '/payment'
+ | '/booting'
+ | '/credentials'
+ | '/download';
+
+type Page = AccountPage | OnboardingPage;
+
+export const accountPageUrl: Record = {
+ 'Download Realm': '/account/download-realm',
+ 'Custom Domain': '/account/custom-domain',
+ 'S3 Storage': '/account/s3-storage',
+ Statistics: '/account/statistics',
+ Hosting: '/account',
+};
+
+export const useNavigation = () => {
+ const router = useRouter();
+
+ const goToPage = useCallback((page: Page) => router.push(page), [router]);
+
+ const logout = useCallback(() => {
+ goToPage('/');
+ localStorage.clear();
+ }, [router]);
+
+ return { goToPage, logout };
+};
diff --git a/onboarding/tsconfig.json b/onboarding/tsconfig.json
new file mode 100644
index 0000000000..e4e72a5c10
--- /dev/null
+++ b/onboarding/tsconfig.json
@@ -0,0 +1,17 @@
+{
+ "extends": "../tsconfig.base.json",
+ "compilerOptions": {
+ "baseUrl": "src",
+ "forceConsistentCasingInFileNames": true,
+ "noEmit": true,
+ "incremental": true,
+ "isolatedModules": true,
+ "jsx": "preserve"
+ },
+ "include": [
+ "src"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
+}
diff --git a/onboarding/yarn.lock b/onboarding/yarn.lock
new file mode 100644
index 0000000000..b358f3a892
--- /dev/null
+++ b/onboarding/yarn.lock
@@ -0,0 +1,2062 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/runtime@^7.20.7":
+ version "7.21.0"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673"
+ integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==
+ dependencies:
+ regenerator-runtime "^0.13.11"
+
+"@eslint-community/eslint-utils@^4.2.0":
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz#a556790523a351b4e47e9d385f47265eaaf9780a"
+ integrity sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==
+ dependencies:
+ eslint-visitor-keys "^3.3.0"
+
+"@eslint-community/regexpp@^4.4.0":
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.4.0.tgz#3e61c564fcd6b921cb789838631c5ee44df09403"
+ integrity sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==
+
+"@eslint/eslintrc@^2.0.1":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.1.tgz#7888fe7ec8f21bc26d646dbd2c11cd776e21192d"
+ integrity sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.3.2"
+ espree "^9.5.0"
+ 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.36.0":
+ version "8.36.0"
+ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.36.0.tgz#9837f768c03a1e4a30bd304a64fb8844f0e72efe"
+ integrity sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==
+
+"@humanwhocodes/config-array@^0.11.8":
+ version "0.11.8"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9"
+ 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.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
+ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
+"@humanwhocodes/object-schema@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
+ integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+
+"@next/env@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/env/-/env-13.2.4.tgz#8b763700262b2445140a44a8c8d088cef676dbae"
+ integrity sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA==
+
+"@next/eslint-plugin-next@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-13.2.4.tgz#3e124cd10ce24dab5d3448ce04104b4f1f4c6ca7"
+ integrity sha512-ck1lI+7r1mMJpqLNa3LJ5pxCfOB1lfJncKmRJeJxcJqcngaFwylreLP7da6Rrjr6u2gVRTfmnkSkjc80IiQCwQ==
+ dependencies:
+ glob "7.1.7"
+
+"@next/swc-android-arm-eabi@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.4.tgz#758d0403771e549f9cee71cbabc0cb16a6c947c0"
+ integrity sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==
+
+"@next/swc-android-arm64@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.2.4.tgz#834d586523045110d5602e0c8aae9028835ac427"
+ integrity sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==
+
+"@next/swc-darwin-arm64@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.4.tgz#5006fca179a36ef3a24d293abadec7438dbb48c6"
+ integrity sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A==
+
+"@next/swc-darwin-x64@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.4.tgz#6549c7c04322766acc3264ccdb3e1b43fcaf7946"
+ integrity sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw==
+
+"@next/swc-freebsd-x64@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.4.tgz#0bbe28979e3e868debc2cc06e45e186ce195b7f4"
+ integrity sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==
+
+"@next/swc-linux-arm-gnueabihf@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.4.tgz#1d28d2203f5a7427d6e7119d7bcb5fc40959fb3e"
+ integrity sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==
+
+"@next/swc-linux-arm64-gnu@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.4.tgz#eb26448190948cdf4c44b8f34110a3ecea32f1d0"
+ integrity sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg==
+
+"@next/swc-linux-arm64-musl@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.4.tgz#c4227c0acd94a420bb14924820710e6284d234d3"
+ integrity sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw==
+
+"@next/swc-linux-x64-gnu@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.4.tgz#6bcb540944ee9b0209b33bfc23b240c2044dfc3e"
+ integrity sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ==
+
+"@next/swc-linux-x64-musl@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.4.tgz#ce21e43251eaf09a09df39372b2c3e38028c30ff"
+ integrity sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA==
+
+"@next/swc-win32-arm64-msvc@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.4.tgz#68220063d8e5e082f5465498675640dedb670ff1"
+ integrity sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw==
+
+"@next/swc-win32-ia32-msvc@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.4.tgz#7c120ab54a081be9566df310bed834f168252990"
+ integrity sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw==
+
+"@next/swc-win32-x64-msvc@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.4.tgz#5abda92fe12b9829bf7951c4a221282c56041144"
+ integrity sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ 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.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@pkgr/utils@^2.3.1":
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.3.1.tgz#0a9b06ffddee364d6642b3cd562ca76f55b34a03"
+ integrity sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==
+ dependencies:
+ cross-spawn "^7.0.3"
+ is-glob "^4.0.3"
+ open "^8.4.0"
+ picocolors "^1.0.0"
+ tiny-glob "^0.2.9"
+ tslib "^2.4.0"
+
+"@rushstack/eslint-patch@^1.1.3":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728"
+ integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==
+
+"@swc/helpers@0.4.14":
+ version "0.4.14"
+ resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74"
+ integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==
+ dependencies:
+ tslib "^2.4.0"
+
+"@types/json5@^0.0.29":
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
+
+"@types/node@18.15.3":
+ version "18.15.3"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.3.tgz#f0b991c32cfc6a4e7f3399d6cb4b8cf9a0315014"
+ integrity sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==
+
+"@types/prop-types@*":
+ version "15.7.5"
+ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf"
+ integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==
+
+"@types/react-dom@18.0.11":
+ version "18.0.11"
+ resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.11.tgz#321351c1459bc9ca3d216aefc8a167beec334e33"
+ integrity sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==
+ dependencies:
+ "@types/react" "*"
+
+"@types/react@*", "@types/react@18.0.28":
+ version "18.0.28"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.28.tgz#accaeb8b86f4908057ad629a26635fe641480065"
+ integrity sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==
+ dependencies:
+ "@types/prop-types" "*"
+ "@types/scheduler" "*"
+ csstype "^3.0.2"
+
+"@types/scheduler@*":
+ version "0.16.2"
+ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39"
+ integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==
+
+"@typescript-eslint/parser@^5.42.0":
+ version "5.55.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.55.0.tgz#8c96a0b6529708ace1dcfa60f5e6aec0f5ed2262"
+ integrity sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==
+ dependencies:
+ "@typescript-eslint/scope-manager" "5.55.0"
+ "@typescript-eslint/types" "5.55.0"
+ "@typescript-eslint/typescript-estree" "5.55.0"
+ debug "^4.3.4"
+
+"@typescript-eslint/scope-manager@5.55.0":
+ version "5.55.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz#e863bab4d4183ddce79967fe10ceb6c829791210"
+ integrity sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==
+ dependencies:
+ "@typescript-eslint/types" "5.55.0"
+ "@typescript-eslint/visitor-keys" "5.55.0"
+
+"@typescript-eslint/types@5.55.0":
+ version "5.55.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.55.0.tgz#9830f8d3bcbecf59d12f821e5bc6960baaed41fd"
+ integrity sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==
+
+"@typescript-eslint/typescript-estree@5.55.0":
+ version "5.55.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz#8db7c8e47ecc03d49b05362b8db6f1345ee7b575"
+ integrity sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==
+ dependencies:
+ "@typescript-eslint/types" "5.55.0"
+ "@typescript-eslint/visitor-keys" "5.55.0"
+ debug "^4.3.4"
+ globby "^11.1.0"
+ is-glob "^4.0.3"
+ semver "^7.3.7"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/visitor-keys@5.55.0":
+ version "5.55.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz#01ad414fca8367706d76cdb94adf788dc5b664a2"
+ integrity sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==
+ dependencies:
+ "@typescript-eslint/types" "5.55.0"
+ eslint-visitor-keys "^3.3.0"
+
+acorn-jsx@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn@^8.8.0:
+ version "8.8.2"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a"
+ integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==
+
+ajv@^6.10.0, ajv@^6.12.4:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ 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.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+aria-query@^5.1.3:
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e"
+ integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==
+ dependencies:
+ deep-equal "^2.0.5"
+
+array-buffer-byte-length@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead"
+ integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==
+ dependencies:
+ call-bind "^1.0.2"
+ is-array-buffer "^3.0.1"
+
+array-includes@^3.1.5, array-includes@^3.1.6:
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f"
+ integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+ get-intrinsic "^1.1.3"
+ is-string "^1.0.7"
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+array.prototype.flat@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2"
+ integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+ es-shim-unscopables "^1.0.0"
+
+array.prototype.flatmap@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183"
+ integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+ es-shim-unscopables "^1.0.0"
+
+array.prototype.tosorted@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532"
+ integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+ es-shim-unscopables "^1.0.0"
+ get-intrinsic "^1.1.3"
+
+ast-types-flow@^0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
+ integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==
+
+available-typed-arrays@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
+ integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
+
+axe-core@^4.6.2:
+ version "4.6.3"
+ resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.3.tgz#fc0db6fdb65cc7a80ccf85286d91d64ababa3ece"
+ integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==
+
+axobject-query@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1"
+ integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==
+ dependencies:
+ deep-equal "^2.0.5"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+caniuse-lite@^1.0.30001406:
+ version "1.0.30001468"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001468.tgz#0101837c6a4e38e6331104c33dcfb3bdf367a4b7"
+ integrity sha512-zgAo8D5kbOyUcRAgSmgyuvBkjrGk5CGYG5TYgFdpQv+ywcyEpo1LOWoG8YmoflGnh+V+UsNuKYedsoYs0hzV5A==
+
+chalk@^4.0.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+client-only@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1"
+ integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ 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.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+cross-spawn@^7.0.2, cross-spawn@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+csstype@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9"
+ integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==
+
+damerau-levenshtein@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7"
+ integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==
+
+debug@^3.2.7:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@^4.1.1, debug@^4.3.2, debug@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+deep-equal@^2.0.5:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6"
+ integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==
+ dependencies:
+ call-bind "^1.0.2"
+ es-get-iterator "^1.1.2"
+ get-intrinsic "^1.1.3"
+ is-arguments "^1.1.1"
+ is-array-buffer "^3.0.1"
+ is-date-object "^1.0.5"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.2"
+ isarray "^2.0.5"
+ object-is "^1.1.5"
+ object-keys "^1.1.1"
+ object.assign "^4.1.4"
+ regexp.prototype.flags "^1.4.3"
+ side-channel "^1.0.4"
+ which-boxed-primitive "^1.0.2"
+ which-collection "^1.0.1"
+ which-typed-array "^1.1.9"
+
+deep-is@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+define-lazy-prop@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f"
+ integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
+
+define-properties@^1.1.3, define-properties@^1.1.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5"
+ integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==
+ dependencies:
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
+doctrine@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+ integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
+ dependencies:
+ esutils "^2.0.2"
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+emoji-regex@^9.2.2:
+ version "9.2.2"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
+ integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
+
+enhanced-resolve@^5.10.0:
+ version "5.12.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634"
+ integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==
+ dependencies:
+ graceful-fs "^4.2.4"
+ tapable "^2.2.0"
+
+es-abstract@^1.19.0, es-abstract@^1.20.4:
+ version "1.21.2"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff"
+ integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==
+ dependencies:
+ array-buffer-byte-length "^1.0.0"
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ es-set-tostringtag "^2.0.1"
+ es-to-primitive "^1.2.1"
+ function.prototype.name "^1.1.5"
+ get-intrinsic "^1.2.0"
+ get-symbol-description "^1.0.0"
+ globalthis "^1.0.3"
+ gopd "^1.0.1"
+ has "^1.0.3"
+ has-property-descriptors "^1.0.0"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ internal-slot "^1.0.5"
+ is-array-buffer "^3.0.2"
+ is-callable "^1.2.7"
+ is-negative-zero "^2.0.2"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.2"
+ is-string "^1.0.7"
+ is-typed-array "^1.1.10"
+ is-weakref "^1.0.2"
+ object-inspect "^1.12.3"
+ object-keys "^1.1.1"
+ object.assign "^4.1.4"
+ regexp.prototype.flags "^1.4.3"
+ safe-regex-test "^1.0.0"
+ string.prototype.trim "^1.2.7"
+ string.prototype.trimend "^1.0.6"
+ string.prototype.trimstart "^1.0.6"
+ typed-array-length "^1.0.4"
+ unbox-primitive "^1.0.2"
+ which-typed-array "^1.1.9"
+
+es-get-iterator@^1.1.2:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6"
+ integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.3"
+ has-symbols "^1.0.3"
+ is-arguments "^1.1.1"
+ is-map "^2.0.2"
+ is-set "^2.0.2"
+ is-string "^1.0.7"
+ isarray "^2.0.5"
+ stop-iteration-iterator "^1.0.0"
+
+es-set-tostringtag@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8"
+ integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==
+ dependencies:
+ get-intrinsic "^1.1.3"
+ has "^1.0.3"
+ has-tostringtag "^1.0.0"
+
+es-shim-unscopables@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241"
+ integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==
+ dependencies:
+ has "^1.0.3"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-config-next@13.2.4:
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-13.2.4.tgz#8aa4d42da3a575a814634ba9c88c8d25266c5fdd"
+ integrity sha512-lunIBhsoeqw6/Lfkd6zPt25w1bn0znLA/JCL+au1HoEpSb4/PpsOYsYtgV/q+YPsoKIOzFyU5xnb04iZnXjUvg==
+ dependencies:
+ "@next/eslint-plugin-next" "13.2.4"
+ "@rushstack/eslint-patch" "^1.1.3"
+ "@typescript-eslint/parser" "^5.42.0"
+ eslint-import-resolver-node "^0.3.6"
+ eslint-import-resolver-typescript "^3.5.2"
+ eslint-plugin-import "^2.26.0"
+ eslint-plugin-jsx-a11y "^6.5.1"
+ eslint-plugin-react "^7.31.7"
+ eslint-plugin-react-hooks "^4.5.0"
+
+eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7:
+ version "0.3.7"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7"
+ integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==
+ dependencies:
+ debug "^3.2.7"
+ is-core-module "^2.11.0"
+ resolve "^1.22.1"
+
+eslint-import-resolver-typescript@^3.5.2:
+ version "3.5.3"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.3.tgz#db5ed9e906651b7a59dd84870aaef0e78c663a05"
+ integrity sha512-njRcKYBc3isE42LaTcJNVANR3R99H9bAxBDMNDr2W7yq5gYPxbU3MkdhsQukxZ/Xg9C2vcyLlDsbKfRDg0QvCQ==
+ dependencies:
+ debug "^4.3.4"
+ enhanced-resolve "^5.10.0"
+ get-tsconfig "^4.2.0"
+ globby "^13.1.2"
+ is-core-module "^2.10.0"
+ is-glob "^4.0.3"
+ synckit "^0.8.4"
+
+eslint-module-utils@^2.7.4:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974"
+ integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==
+ dependencies:
+ debug "^3.2.7"
+
+eslint-plugin-import@^2.26.0:
+ version "2.27.5"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65"
+ integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==
+ dependencies:
+ array-includes "^3.1.6"
+ array.prototype.flat "^1.3.1"
+ array.prototype.flatmap "^1.3.1"
+ debug "^3.2.7"
+ doctrine "^2.1.0"
+ eslint-import-resolver-node "^0.3.7"
+ eslint-module-utils "^2.7.4"
+ has "^1.0.3"
+ is-core-module "^2.11.0"
+ is-glob "^4.0.3"
+ minimatch "^3.1.2"
+ object.values "^1.1.6"
+ resolve "^1.22.1"
+ semver "^6.3.0"
+ tsconfig-paths "^3.14.1"
+
+eslint-plugin-jsx-a11y@^6.5.1:
+ version "6.7.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976"
+ integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==
+ dependencies:
+ "@babel/runtime" "^7.20.7"
+ aria-query "^5.1.3"
+ array-includes "^3.1.6"
+ array.prototype.flatmap "^1.3.1"
+ ast-types-flow "^0.0.7"
+ axe-core "^4.6.2"
+ axobject-query "^3.1.1"
+ damerau-levenshtein "^1.0.8"
+ emoji-regex "^9.2.2"
+ has "^1.0.3"
+ jsx-ast-utils "^3.3.3"
+ language-tags "=1.0.5"
+ minimatch "^3.1.2"
+ object.entries "^1.1.6"
+ object.fromentries "^2.0.6"
+ semver "^6.3.0"
+
+eslint-plugin-react-hooks@^4.5.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3"
+ integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==
+
+eslint-plugin-react@^7.31.7:
+ version "7.32.2"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10"
+ integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==
+ dependencies:
+ array-includes "^3.1.6"
+ array.prototype.flatmap "^1.3.1"
+ array.prototype.tosorted "^1.1.1"
+ doctrine "^2.1.0"
+ estraverse "^5.3.0"
+ jsx-ast-utils "^2.4.1 || ^3.0.0"
+ minimatch "^3.1.2"
+ object.entries "^1.1.6"
+ object.fromentries "^2.0.6"
+ object.hasown "^1.1.2"
+ object.values "^1.1.6"
+ prop-types "^15.8.1"
+ resolve "^2.0.0-next.4"
+ semver "^6.3.0"
+ string.prototype.matchall "^4.0.8"
+
+eslint-scope@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
+ integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
+eslint-visitor-keys@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
+ integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
+
+eslint@8.36.0:
+ version "8.36.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.36.0.tgz#1bd72202200a5492f91803b113fb8a83b11285cf"
+ integrity sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@eslint-community/regexpp" "^4.4.0"
+ "@eslint/eslintrc" "^2.0.1"
+ "@eslint/js" "8.36.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.1.1"
+ eslint-visitor-keys "^3.3.0"
+ espree "^9.5.0"
+ 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"
+ grapheme-splitter "^1.0.4"
+ 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-sdsl "^4.1.4"
+ 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.0:
+ version "9.5.0"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.0.tgz#3646d4e3f58907464edba852fa047e6a27bdf113"
+ integrity sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==
+ dependencies:
+ acorn "^8.8.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.3.0"
+
+esquery@^1.4.2:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
+ integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ 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.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-glob@^3.2.11, fast-glob@^3.2.9:
+ version "3.2.12"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
+ 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.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fastq@^1.6.0:
+ version "1.15.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a"
+ 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.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
+ integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
+ dependencies:
+ flat-cache "^3.0.4"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ 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.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ 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.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
+ integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
+ dependencies:
+ flatted "^3.1.0"
+ rimraf "^3.0.2"
+
+flatted@^3.1.0:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
+ integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
+
+for-each@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+function.prototype.name@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621"
+ integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.19.0"
+ functions-have-names "^1.2.2"
+
+functions-have-names@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f"
+ integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.3"
+
+get-symbol-description@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
+ integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
+get-tsconfig@^4.2.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.4.0.tgz#64eee64596668a81b8fce18403f94f245ee0d4e5"
+ integrity sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ==
+
+glob-parent@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-parent@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+glob@7.1.7:
+ version "7.1.7"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
+ integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+ 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.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ 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.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82"
+ integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==
+ dependencies:
+ type-fest "^0.20.2"
+
+globalthis@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf"
+ integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==
+ dependencies:
+ define-properties "^1.1.3"
+
+globalyzer@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465"
+ integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==
+
+globby@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
+ 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"
+
+globby@^13.1.2:
+ version "13.1.3"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.3.tgz#f62baf5720bcb2c1330c8d4ef222ee12318563ff"
+ integrity sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==
+ dependencies:
+ dir-glob "^3.0.1"
+ fast-glob "^3.2.11"
+ ignore "^5.2.0"
+ merge2 "^1.4.1"
+ slash "^4.0.0"
+
+globrex@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098"
+ integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==
+
+gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ dependencies:
+ get-intrinsic "^1.1.3"
+
+graceful-fs@^4.2.4:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+grapheme-splitter@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
+ integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
+
+has-bigints@^1.0.1, has-bigints@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
+ integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-property-descriptors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861"
+ integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
+ dependencies:
+ get-intrinsic "^1.1.1"
+
+has-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
+ integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
+
+has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
+ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+ dependencies:
+ has-symbols "^1.0.2"
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+ignore@^5.2.0:
+ version "5.2.4"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
+ integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
+
+import-fresh@^3.0.0, import-fresh@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ 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.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986"
+ integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==
+ dependencies:
+ get-intrinsic "^1.2.0"
+ has "^1.0.3"
+ side-channel "^1.0.4"
+
+is-arguments@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
+ integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-array-buffer@^3.0.1, is-array-buffer@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe"
+ integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.0"
+ is-typed-array "^1.1.10"
+
+is-bigint@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
+
+is-boolean-object@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-core-module@^2.10.0, is-core-module@^2.11.0, is-core-module@^2.9.0:
+ version "2.11.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144"
+ integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==
+ dependencies:
+ has "^1.0.3"
+
+is-date-object@^1.0.1, is-date-object@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-docker@^2.0.0, is-docker@^2.1.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-map@^2.0.1, is-map@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127"
+ integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==
+
+is-negative-zero@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
+ integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+
+is-number-object@^1.0.4:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
+ integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-path-inside@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
+ integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+
+is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-set@^2.0.1, is-set@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec"
+ integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==
+
+is-shared-array-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
+ integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-string@^1.0.5, is-string@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typed-array@^1.1.10, is-typed-array@^1.1.9:
+ version "1.1.10"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f"
+ integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.0"
+
+is-weakmap@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2"
+ integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==
+
+is-weakref@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
+ integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-weakset@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d"
+ integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
+is-wsl@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
+isarray@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+ integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+js-sdsl@^4.1.4:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711"
+ integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==
+
+"js-tokens@^3.0.0 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
+
+json5@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
+ integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
+ dependencies:
+ minimist "^1.2.0"
+
+"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea"
+ integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==
+ dependencies:
+ array-includes "^3.1.5"
+ object.assign "^4.1.3"
+
+language-subtag-registry@~0.3.2:
+ version "0.3.22"
+ resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d"
+ integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==
+
+language-tags@=1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a"
+ integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==
+ dependencies:
+ language-subtag-registry "~0.3.2"
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+loose-envify@^1.1.0, loose-envify@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ 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.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ 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.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
+ 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.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.2.0, minimist@^1.2.6:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+nanoid@^3.3.4:
+ version "3.3.4"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
+ integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+next@13.2.4:
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/next/-/next-13.2.4.tgz#2363330392b0f7da02ab41301f60857ffa7f67d6"
+ integrity sha512-g1I30317cThkEpvzfXujf0O4wtaQHtDCLhlivwlTJ885Ld+eOgcz7r3TGQzeU+cSRoNHtD8tsJgzxVdYojFssw==
+ dependencies:
+ "@next/env" "13.2.4"
+ "@swc/helpers" "0.4.14"
+ caniuse-lite "^1.0.30001406"
+ postcss "8.4.14"
+ styled-jsx "5.1.1"
+ optionalDependencies:
+ "@next/swc-android-arm-eabi" "13.2.4"
+ "@next/swc-android-arm64" "13.2.4"
+ "@next/swc-darwin-arm64" "13.2.4"
+ "@next/swc-darwin-x64" "13.2.4"
+ "@next/swc-freebsd-x64" "13.2.4"
+ "@next/swc-linux-arm-gnueabihf" "13.2.4"
+ "@next/swc-linux-arm64-gnu" "13.2.4"
+ "@next/swc-linux-arm64-musl" "13.2.4"
+ "@next/swc-linux-x64-gnu" "13.2.4"
+ "@next/swc-linux-x64-musl" "13.2.4"
+ "@next/swc-win32-arm64-msvc" "13.2.4"
+ "@next/swc-win32-ia32-msvc" "13.2.4"
+ "@next/swc-win32-x64-msvc" "13.2.4"
+
+object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-inspect@^1.12.3, object-inspect@^1.9.0:
+ version "1.12.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
+ integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
+
+object-is@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
+ integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.3, object.assign@^4.1.4:
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f"
+ integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ has-symbols "^1.0.3"
+ object-keys "^1.1.1"
+
+object.entries@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23"
+ integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
+object.fromentries@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73"
+ integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
+object.hasown@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92"
+ integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==
+ dependencies:
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
+object.values@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d"
+ integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+open@^8.4.0:
+ version "8.4.2"
+ resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9"
+ integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==
+ dependencies:
+ define-lazy-prop "^2.0.0"
+ is-docker "^2.1.1"
+ is-wsl "^2.2.0"
+
+optionator@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
+ 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.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ 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.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ 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.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+postcss@8.4.14:
+ version "8.4.14"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf"
+ integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==
+ dependencies:
+ nanoid "^3.3.4"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+prop-types@^15.8.1:
+ version "15.8.1"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
+ 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.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
+ integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+react-dom@18.2.0:
+ version "18.2.0"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
+ integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
+ dependencies:
+ loose-envify "^1.1.0"
+ scheduler "^0.23.0"
+
+react-is@^16.13.1:
+ version "16.13.1"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
+react@18.2.0:
+ version "18.2.0"
+ resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
+ integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
+ dependencies:
+ loose-envify "^1.1.0"
+
+regenerator-runtime@^0.13.11:
+ version "0.13.11"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
+ integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
+
+regexp.prototype.flags@^1.4.3:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac"
+ integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ functions-have-names "^1.2.2"
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve@^1.22.1:
+ version "1.22.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
+ integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
+ dependencies:
+ is-core-module "^2.9.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+resolve@^2.0.0-next.4:
+ version "2.0.0-next.4"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660"
+ integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==
+ dependencies:
+ is-core-module "^2.9.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+safe-regex-test@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295"
+ integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.3"
+ is-regex "^1.1.4"
+
+scheduler@^0.23.0:
+ version "0.23.0"
+ resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
+ integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
+ dependencies:
+ loose-envify "^1.1.0"
+
+semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@^7.3.7:
+ version "7.3.8"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798"
+ integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==
+ dependencies:
+ lru-cache "^6.0.0"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slash@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7"
+ integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==
+
+source-map-js@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+stop-iteration-iterator@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4"
+ integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==
+ dependencies:
+ internal-slot "^1.0.4"
+
+string.prototype.matchall@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3"
+ integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+ get-intrinsic "^1.1.3"
+ has-symbols "^1.0.3"
+ internal-slot "^1.0.3"
+ regexp.prototype.flags "^1.4.3"
+ side-channel "^1.0.4"
+
+string.prototype.trim@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533"
+ integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
+string.prototype.trimend@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533"
+ integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
+string.prototype.trimstart@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4"
+ integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
+strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+ integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
+
+strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+styled-jsx@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f"
+ integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==
+ dependencies:
+ client-only "0.0.1"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ 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.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+synckit@^0.8.4:
+ version "0.8.5"
+ resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3"
+ integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==
+ dependencies:
+ "@pkgr/utils" "^2.3.1"
+ tslib "^2.5.0"
+
+tapable@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
+ integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
+
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+
+tiny-glob@^0.2.9:
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2"
+ integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==
+ dependencies:
+ globalyzer "0.1.0"
+ globrex "^0.1.2"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+tsconfig-paths@^3.14.1:
+ version "3.14.2"
+ resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088"
+ integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==
+ dependencies:
+ "@types/json5" "^0.0.29"
+ json5 "^1.0.2"
+ minimist "^1.2.6"
+ strip-bom "^3.0.0"
+
+tslib@^1.8.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslib@^2.4.0, tslib@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
+ integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
+
+tsutils@^3.21.0:
+ version "3.21.0"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
+ 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.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+type-fest@^0.20.2:
+ version "0.20.2"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
+ integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+
+typed-array-length@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb"
+ integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==
+ dependencies:
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ is-typed-array "^1.1.9"
+
+typescript@5.0.2:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.2.tgz#891e1a90c5189d8506af64b9ef929fca99ba1ee5"
+ integrity sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==
+
+unbox-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"
+ integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
+ dependencies:
+ call-bind "^1.0.2"
+ has-bigints "^1.0.2"
+ has-symbols "^1.0.3"
+ which-boxed-primitive "^1.0.2"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-collection@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906"
+ integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==
+ dependencies:
+ is-map "^2.0.1"
+ is-set "^2.0.1"
+ is-weakmap "^2.0.1"
+ is-weakset "^2.0.1"
+
+which-typed-array@^1.1.9:
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6"
+ integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.0"
+ is-typed-array "^1.1.10"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+word-wrap@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+ integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
diff --git a/package.json b/package.json
index aca4cbd851..42b6f99885 100644
--- a/package.json
+++ b/package.json
@@ -4,6 +4,7 @@
"workspaces": [
"app",
"shared",
+ "onboarding",
"lib/design-system",
"lib/presence",
"lib/presence/code",
diff --git a/shared/package.json b/shared/package.json
index aec750a962..c45ac3c930 100644
--- a/shared/package.json
+++ b/shared/package.json
@@ -8,16 +8,16 @@
"scripts": {
"postinstall": "preconstruct dev"
},
- "dependencies": {
- "react": "^18.0.0",
- "babel-loader": "^8.2.5"
- },
"devDependencies": {
- "@babel/core": "^7.18.9",
- "@babel/preset-env": "^7.18.9",
+ "@babel/core": "^7.20.2",
+ "@babel/preset-env": "^7.20.2",
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.18.6",
"@preconstruct/cli": "2.2.1",
- "ts-node": "^10.9.1"
+ "babel-loader": "^8.2.5"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
}
}
diff --git a/shared/src/constants/theme.ts b/shared/src/constants/theme.ts
index 1ca1ddb31c..e69de29bb2 100644
--- a/shared/src/constants/theme.ts
+++ b/shared/src/constants/theme.ts
@@ -1,14 +0,0 @@
-export const defaultTheme = {
- id: 'default',
- mode: 'light',
- backgroundColor: '#C4C3BF',
- accentColor: '#4E9EFD',
- inputColor: '#FFFFFF',
- dockColor: '#FFFFFF',
- iconColor: '#CECECC',
- textColor: '#333333',
- windowColor: '#FFFFFF',
- wallpaper:
- 'https://images.unsplash.com/photo-1622547748225-3fc4abd2cca0?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=2832&q=100',
- mouseColor: '#4E9EFD',
-};
diff --git a/shared/src/index.ts b/shared/src/index.ts
index b453961125..6620955c59 100644
--- a/shared/src/index.ts
+++ b/shared/src/index.ts
@@ -1 +1 @@
-export { defaultTheme } from './constants/theme';
+export * from './onboarding';
diff --git a/shared/src/onboarding/components/AccountDialog.styles.tsx b/shared/src/onboarding/components/AccountDialog.styles.tsx
new file mode 100644
index 0000000000..23be619a3d
--- /dev/null
+++ b/shared/src/onboarding/components/AccountDialog.styles.tsx
@@ -0,0 +1,95 @@
+import styled from 'styled-components';
+import { Flex } from '@holium/design-system';
+import {
+ MOBILE_WIDTH,
+ OnboardDialogCard,
+ OnboardDialogDescription,
+ OnboardDialogTitle,
+ TABLET_WIDTH,
+} from './OnboardDialog.styles';
+
+export const AccountDialogCard = styled(OnboardDialogCard)`
+ height: 500px;
+ flex-direction: row;
+ padding: 16px;
+
+ @media (max-width: ${TABLET_WIDTH}px) {
+ height: auto;
+ flex-direction: column;
+ }
+
+ @media (max-width: ${MOBILE_WIDTH}px) {
+ min-height: 100%;
+ justify-content: flex-start;
+ }
+`;
+
+export const AccountDialogInnerCard = styled(OnboardDialogCard)`
+ flex: 3;
+ height: 100%;
+ width: 100%;
+ min-height: 0;
+ background-color: rgba(var(--rlm-window-rgba));
+ border-radius: 11px;
+ padding: 16px;
+
+ @media (max-width: ${TABLET_WIDTH}px) {
+ flex: none;
+ height: auto;
+ width: 100%;
+ }
+`;
+
+export const AccountDialogTitle = styled(OnboardDialogTitle)`
+ font-size: 18px;
+ line-height: 22px;
+`;
+
+export const AccountDialogSubtitle = styled(OnboardDialogDescription)`
+ font-size: 12px;
+ line-height: 15px;
+ color: rgba(var(--rlm-text-rgba), 0.6);
+`;
+
+export const AccountDialogSidebar = styled(Flex)`
+ flex: 1;
+ height: 100%;
+ flex-direction: column;
+ justify-content: space-between;
+
+ @media (max-width: ${TABLET_WIDTH}px) {
+ flex: none;
+ gap: 32px;
+ width: 100%;
+ height: auto;
+ }
+`;
+
+export const AccountDialogSidebarMenu = styled(Flex)`
+ flex-direction: column;
+ gap: 18px;
+
+ @media (max-width: ${TABLET_WIDTH}px) {
+ padding-bottom: 0;
+ }
+`;
+
+export const AccountDialogDescription = styled(OnboardDialogDescription)`
+ font-size: 14px;
+ line-height: 17px;
+`;
+
+export const AccountDialogSidebarMenuItemText = styled(
+ OnboardDialogDescription
+)<{
+ isOpen: boolean;
+}>`
+ font-size: 13px;
+ line-height: 15px;
+ cursor: pointer;
+ user-select: none;
+ color: ${({ isOpen }) =>
+ isOpen
+ ? 'rgba(var(--rlm-accent-rgba))'
+ : 'rgba(var(--rlm-text-rgba), 0.7)'};
+`;
diff --git a/shared/src/onboarding/components/AccountDialog.tsx b/shared/src/onboarding/components/AccountDialog.tsx
new file mode 100644
index 0000000000..4583eff9ed
--- /dev/null
+++ b/shared/src/onboarding/components/AccountDialog.tsx
@@ -0,0 +1,104 @@
+import { FormEvent, ReactNode } from 'react';
+import {
+ Button,
+ Flex,
+ HoliumButton,
+ Icon,
+ Select,
+} from '@holium/design-system';
+import {
+ AccountDialogCard,
+ AccountDialogSidebar,
+ AccountDialogSidebarMenu,
+ AccountDialogSidebarMenuItemText,
+ AccountDialogInnerCard,
+ AccountDialogTitle,
+ AccountDialogSubtitle,
+} from './AccountDialog.styles';
+
+export enum SidebarSection {
+ Hosting = 'Hosting',
+ S3Storage = 'S3 Storage',
+ Statistics = 'Statistics',
+ CustomDomain = 'Custom Domain',
+ DownloadRealm = 'Download Realm',
+}
+
+type Props = {
+ patps: string[];
+ selectedPatp: string;
+ currentSection: SidebarSection;
+ children?: ReactNode;
+ customBody?: ReactNode;
+ setSelectedPatp: (patp: string) => void;
+ onClickSidebarSection: (section: SidebarSection) => void;
+ onSubmit?: () => void;
+ onExit: () => void;
+};
+
+export const AccountDialog = ({
+ patps,
+ selectedPatp,
+ currentSection,
+ children,
+ customBody,
+ setSelectedPatp,
+ onClickSidebarSection,
+ onSubmit,
+ onExit,
+}: Props) => {
+ const handleSubmit = (e: FormEvent) => {
+ e.preventDefault();
+ onSubmit?.();
+ };
+
+ return (
+
+
+
+
+
+
+ Server ID
+
+
+
+
+ {Object.values(SidebarSection).map((section) => (
+ onClickSidebarSection(section)}
+ >
+ {section}
+
+ ))}
+
+
+
+
+
+ {customBody}
+ {!customBody && (
+
+
+
+ Account
+ {currentSection}
+
+ {children}
+
+
+ )}
+
+ );
+};
diff --git a/shared/src/onboarding/components/AccountDialogTableRow.tsx b/shared/src/onboarding/components/AccountDialogTableRow.tsx
new file mode 100644
index 0000000000..683bb39587
--- /dev/null
+++ b/shared/src/onboarding/components/AccountDialogTableRow.tsx
@@ -0,0 +1,29 @@
+import { ReactNode } from 'react';
+import styled from 'styled-components';
+import { Flex } from '@holium/design-system';
+import { OnboardDialogSubTitle, TABLET_WIDTH } from './OnboardDialog.styles';
+
+const AccountDialogTableRowStyled = styled(Flex)`
+ height: 40px;
+ align-items: center;
+ gap: 16px;
+
+ @media (max-width: ${TABLET_WIDTH}px) {
+ height: auto;
+ align-items: flex-start;
+ gap: 4px;
+ flex-direction: column;
+ }
+`;
+
+type Props = {
+ title: string;
+ children: ReactNode;
+};
+
+export const AccountDialogTableRow = ({ title, children }: Props) => (
+
+ {title}
+ {children}
+
+);
diff --git a/shared/src/onboarding/components/DownloadButton.tsx b/shared/src/onboarding/components/DownloadButton.tsx
new file mode 100644
index 0000000000..b1e3a98ea0
--- /dev/null
+++ b/shared/src/onboarding/components/DownloadButton.tsx
@@ -0,0 +1,43 @@
+import { ReactNode } from 'react';
+import styled from 'styled-components';
+import { Button, Flex, Text } from '@holium/design-system';
+import { MOBILE_WIDTH } from './OnboardDialog.styles';
+
+const DownloadButtonStyled = styled(Button.Primary)`
+ width: 154px;
+ height: 32px;
+ padding-left: 7px;
+ padding-right: 7px;
+
+ @media (max-width: ${MOBILE_WIDTH}px) {
+ width: 100%;
+ }
+`;
+
+const DownloadText = styled(Text.Body)`
+ font-size: 14px;
+ font-weight: 500;
+ color: #ffffff;
+`;
+
+const DownloadHint = styled(DownloadText)`
+ color: #ffffffb3;
+`;
+
+type Props = {
+ icon: ReactNode;
+ hint?: string;
+ onClick: () => void;
+};
+
+export const DownloadButton = ({ icon, hint, onClick }: Props) => (
+
+
+
+ {icon}
+ Download
+
+ {hint && {hint}}
+
+
+);
diff --git a/shared/src/onboarding/components/Modal.tsx b/shared/src/onboarding/components/Modal.tsx
new file mode 100644
index 0000000000..00415e9cd2
--- /dev/null
+++ b/shared/src/onboarding/components/Modal.tsx
@@ -0,0 +1,73 @@
+import { FormEvent, ReactNode } from 'react';
+import styled from 'styled-components';
+import { Button, Icon } from '@holium/design-system';
+import { MOBILE_WIDTH } from './OnboardDialog.styles';
+
+const ModalContainer = styled.div`
+ display: flex;
+ position: absolute;
+ z-index: 100;
+ width: 100%;
+ max-width: ${MOBILE_WIDTH}px;
+ padding: 32px;
+ border-radius: 11px;
+ background-color: rgba(var(--rlm-window-rgba));
+ box-shadow: var(--rlm-box-shadow-3);
+
+ @media (max-width: ${MOBILE_WIDTH}px) {
+ height: 100%;
+ align-items: center;
+ border-radius: 0;
+ }
+`;
+
+const Overlay = styled.div`
+ position: fixed;
+ z-index: 99;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: rgba(0, 0, 0, 0.5);
+`;
+
+const Form = styled.form`
+ display: relative;
+ width: 100%;
+ display: flex;
+ gap: 16px;
+ flex-direction: column;
+`;
+
+const CloseFormContainer = styled.div`
+ position: absolute;
+ top: 16px;
+ right: 16px;
+`;
+
+type Props = {
+ isOpen: boolean;
+ children: ReactNode;
+ onDismiss: () => void;
+ onSubmit?: (e: FormEvent) => void;
+};
+
+export const Modal = ({ isOpen, children, onDismiss, onSubmit }: Props) => {
+ if (!isOpen) return null;
+
+ return (
+ <>
+
+
+
+
+ >
+ );
+};
diff --git a/shared/src/onboarding/components/OnboardDialog.styles.tsx b/shared/src/onboarding/components/OnboardDialog.styles.tsx
new file mode 100644
index 0000000000..54d2fe861e
--- /dev/null
+++ b/shared/src/onboarding/components/OnboardDialog.styles.tsx
@@ -0,0 +1,134 @@
+import styled from 'styled-components';
+import { Input, Text } from '@holium/design-system';
+
+export const TABLET_WIDTH = 800;
+export const MOBILE_WIDTH = 400;
+
+export const OnboardDialogCard = styled.form`
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 16px;
+ padding: 69px 32px 24px 32px;
+ border-radius: 12px;
+ background-color: rgba(var(--rlm-window-bg-rgba));
+ border: 1px solid rgba(var(--rlm-border-rgba));
+ max-width: 800px;
+ min-height: 500px;
+ backdrop-filter: var(--blur);
+ box-shadow: var(--rlm-box-shadow-1);
+ margin: 0 auto;
+
+ @media (max-width: ${TABLET_WIDTH}px) {
+ min-height: 0;
+ margin: 0 12px;
+ padding: 69px 24px 24px 24px;
+ gap: 42px;
+ }
+
+ @media (max-width: ${MOBILE_WIDTH}px) {
+ align-self: flex-start;
+ height: 100vh;
+ margin: 0;
+ padding: 32px;
+ border-radius: 0;
+ }
+`;
+
+export const OnboardDialogBody = styled.div`
+ flex: 1;
+ width: 100%;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+
+ @media (max-width: ${TABLET_WIDTH}px) {
+ gap: 42px;
+ flex-direction: column;
+ }
+`;
+
+export const OnboardDialogBodyContainer = styled.div`
+ display: flex;
+ flex: 5;
+ gap: 16px;
+ flex-direction: column;
+ justify-content: center;
+
+ @media (max-width: ${TABLET_WIDTH}px) {
+ width: 100%;
+ max-width: 360px;
+ flex: none;
+ }
+`;
+
+export const OnboardDialogDescription = styled(Text.Body)`
+ font-size: 16px;
+ font-weight: 380;
+ color: rgba(var(--rlm-text-rgba), 0.7);
+ line-height: 1.5em;
+`;
+
+export const OnboardDialogInputLabel = styled(Text.Label)`
+ font-size: 14px;
+ line-height: 17px;
+ font-weight: 500;
+ margin-bottom: 4px;
+`;
+
+type OnboardDialogInputProps = {
+ isError?: boolean;
+};
+
+export const OnboardDialogInput = styled(Input)`
+ flex: 1;
+ padding: 11px 12px;
+ border: 1px solid rgba(var(--rlm-border-rgba));
+ border-radius: 6px;
+
+ ${({ isError }) =>
+ isError &&
+ `
+ border: 1px solid rgba(var(--rlm-intent-alert-rgba));
+ `}
+`;
+
+export const OnboardDialogTitle = styled(Text.H1)`
+ font-size: 22px;
+ font-weight: 600;
+ line-height: 26px;
+ color: rgba(var(--rlm-text-rgba));
+`;
+
+export const OnboardDialogSubTitle = styled(Text.Body)`
+ font-size: 13px;
+ font-weight: 600;
+ line-height: 15px;
+ color: rgba(var(--rlm-text-rgba));
+`;
+
+export const OnboardDialogIconContainer = styled.div`
+ display: flex;
+ flex: 3;
+ justify-content: center;
+
+ @media (max-width: ${TABLET_WIDTH}px) {
+ flex: none;
+ }
+`;
+
+export const OnboardDialogBackButton = styled.button`
+ cursor: pointer;
+ border: none;
+ background: none;
+ padding: 0;
+ margin: 0;
+`;
+
+export const OnboardDialogFooter = styled.footer`
+ width: 100%;
+ height: 30px;
+`;
diff --git a/shared/src/onboarding/components/OnboardDialog.tsx b/shared/src/onboarding/components/OnboardDialog.tsx
new file mode 100644
index 0000000000..654ddd857d
--- /dev/null
+++ b/shared/src/onboarding/components/OnboardDialog.tsx
@@ -0,0 +1,76 @@
+import { FormEvent, ReactNode } from 'react';
+import { Flex, Icon, useToggle } from '@holium/design-system';
+import {
+ OnboardDialogBackButton,
+ OnboardDialogBody,
+ OnboardDialogBodyContainer,
+ OnboardDialogCard,
+ OnboardDialogFooter,
+ OnboardDialogIconContainer,
+} from './OnboardDialog.styles';
+import { SubmitButton } from './hosting/SubmitButton';
+
+type Props = {
+ icon: ReactNode;
+ body: ReactNode;
+ nextText?: string;
+ nextIcon?: ReactNode;
+ onBack?: () => void;
+ onNext?: () => Promise;
+};
+
+export const OnboardDialog = ({
+ icon,
+ body,
+ nextText = 'Next',
+ nextIcon,
+ onBack,
+ onNext,
+}: Props) => {
+ const submitting = useToggle(false);
+
+ const handleSubmit = async (event: FormEvent) => {
+ event.preventDefault();
+ submitting.toggleOn();
+
+ try {
+ const successfull = await onNext?.();
+ if (!successfull) submitting.toggleOff();
+ } catch (error) {
+ submitting.toggleOff();
+ }
+ };
+
+ return (
+
+
+ {icon}
+ {body}
+
+
+
+
+ {onBack && (
+
+
+
+ )}
+
+
+
+
+
+
+
+ );
+};
diff --git a/shared/src/onboarding/components/PatpCard.tsx b/shared/src/onboarding/components/PatpCard.tsx
new file mode 100644
index 0000000000..6b32d1c095
--- /dev/null
+++ b/shared/src/onboarding/components/PatpCard.tsx
@@ -0,0 +1,45 @@
+import styled, { css } from 'styled-components';
+import { Flex, Text, Avatar } from '@holium/design-system';
+
+const PatpCardView = styled(Flex)<{ isSelected: boolean }>`
+ flex: 1;
+ gap: 10px;
+ height: 40px;
+ padding: 7px 6px;
+ border-radius: 6px;
+ cursor: pointer;
+ user-select: none;
+ align-items: center;
+ border: 1px solid rgba(var(--rlm-border-rgba));
+ background-color: rgba(var(--rlm-window-rgba));
+ ${({ isSelected }) =>
+ isSelected &&
+ css`
+ border: 1px solid rgba(var(--rlm-accent-rgba), 0.4);
+ background-color: rgba(var(--rlm-accent-rgba), 0.12);
+ `};
+`;
+
+const PatpCardText = styled(Text.Body)<{ isSelected: boolean }>`
+ user-select: none;
+ color: rgba(var(--rlm-text-rgba));
+ ${({ isSelected }) =>
+ isSelected &&
+ css`
+ color: rgba(var(--rlm-accent-rgba));
+ font-weight: 500;
+ `};
+`;
+
+type Props = {
+ patp: string;
+ isSelected: boolean;
+ onClick: () => void;
+};
+
+export const PatpCard = ({ patp, isSelected, onClick }: Props) => (
+
+
+ {patp}
+
+);
diff --git a/shared/src/onboarding/components/PatpsPaginated.tsx b/shared/src/onboarding/components/PatpsPaginated.tsx
new file mode 100644
index 0000000000..ae2ff0dfaf
--- /dev/null
+++ b/shared/src/onboarding/components/PatpsPaginated.tsx
@@ -0,0 +1,99 @@
+import { Icon } from '@holium/design-system';
+import { useState } from 'react';
+import { PatpCard } from './PatpCard';
+import styled from 'styled-components';
+
+const Paginator = styled.div`
+ grid-column: 1 / 3;
+ display: flex;
+ justify-content: center;
+ gap: 16px;
+`;
+
+type Props = {
+ patps: string[];
+ pageSize?: number;
+ selectedPatp: string | undefined;
+ onSelectPatp: (patp: string) => void;
+};
+
+export const PatpsPaginated = ({
+ patps,
+ pageSize = 6,
+ selectedPatp,
+ onSelectPatp,
+}: Props) => {
+ const [page, setPage] = useState(0);
+ const totalPages = Math.ceil(patps.length / pageSize);
+ const paginatedPatps = patps.slice(page * pageSize, (page + 1) * pageSize);
+ const pages = Array.from({ length: totalPages }).map((_, i) => i);
+
+ return (
+
+ {paginatedPatps.map((patp) => (
+ onSelectPatp(patp)}
+ />
+ ))}
+
+
+ {pages.map((i) => (
+
+ ))}
+
+
+
+ );
+};
diff --git a/shared/src/onboarding/components/hosting/ChangeAccessCode.tsx b/shared/src/onboarding/components/hosting/ChangeAccessCode.tsx
new file mode 100644
index 0000000000..dc7d1797a0
--- /dev/null
+++ b/shared/src/onboarding/components/hosting/ChangeAccessCode.tsx
@@ -0,0 +1,40 @@
+import {
+ Button,
+ Flex,
+ Icon,
+ TextInput,
+ useToggle,
+} from '@holium/design-system';
+import { AccountDialogTableRow } from '../../components/AccountDialogTableRow';
+
+type Props = {
+ shipCode: string;
+};
+
+export const ChangeAccessCode = ({ shipCode }: Props) => {
+ const showAccessKey = useToggle(false);
+
+ return (
+
+
+
+
+
+ }
+ />
+
+
+ );
+};
diff --git a/shared/src/onboarding/components/hosting/ChangeButton.tsx b/shared/src/onboarding/components/hosting/ChangeButton.tsx
new file mode 100644
index 0000000000..740c6e65ad
--- /dev/null
+++ b/shared/src/onboarding/components/hosting/ChangeButton.tsx
@@ -0,0 +1,17 @@
+import styled from 'styled-components';
+import { Button } from '@holium/design-system';
+
+export const ChangeButton = styled(Button.TextButton)`
+ height: 30px;
+`;
+
+export const ChangeButtonGray = styled(ChangeButton)`
+ color: #b8b8b8;
+ background-color: rgba(184, 184, 184, 0.12);
+ &:hover:not([disabled]) {
+ background-color: rgba(184, 184, 184, 0.15);
+ }
+ &:active:not([disabled]) {
+ background-color: rgba(184, 184, 184, 0.2);
+ }
+`;
diff --git a/shared/src/onboarding/components/hosting/ChangeEmailModal.tsx b/shared/src/onboarding/components/hosting/ChangeEmailModal.tsx
new file mode 100644
index 0000000000..de44edad28
--- /dev/null
+++ b/shared/src/onboarding/components/hosting/ChangeEmailModal.tsx
@@ -0,0 +1,79 @@
+import { ChangeEvent, useRef, useState } from 'react';
+import { Text, Flex, useToggle, ErrorBox } from '@holium/design-system';
+import { Modal } from '../Modal';
+import {
+ OnboardDialogInputLabel,
+ OnboardDialogInput,
+} from '../OnboardDialog.styles';
+import { SubmitButton } from './SubmitButton';
+
+type Props = {
+ isOpen: boolean;
+ onDismiss: () => void;
+ onSubmit: (email: string) => Promise;
+};
+
+export const ChangeEmailModal = ({ isOpen, onDismiss, onSubmit }: Props) => {
+ const submitting = useToggle(false);
+ const confirmEmailError = useToggle(false);
+
+ const [errorMessage, setErrorMessage] = useState();
+
+ const emailRef = useRef(null);
+ const confirmEmailRef = useRef(null);
+
+ const onConfirmEmailChange = (e: ChangeEvent) => {
+ const password = emailRef.current?.value;
+ const confirmPassword = e.target.value;
+ confirmEmailError.setToggle(password !== confirmPassword);
+ };
+
+ const handleSubmit = async (event: React.FormEvent) => {
+ setErrorMessage(undefined);
+
+ event.preventDefault();
+ submitting.toggleOn();
+
+ if (emailRef.current && confirmEmailRef.current) {
+ const response = await onSubmit(emailRef.current.value);
+
+ if (!response) {
+ setErrorMessage('Something went wrong. Please try again.');
+ }
+
+ submitting.toggleOff();
+ }
+ };
+
+ return (
+
+ Change email
+
+
+ New email
+
+
+
+
+
+ Confirm email
+
+
+
+
+
+
+ {errorMessage && {errorMessage}}
+
+ );
+};
diff --git a/shared/src/onboarding/components/hosting/ChangeMaintenanceWindow.tsx b/shared/src/onboarding/components/hosting/ChangeMaintenanceWindow.tsx
new file mode 100644
index 0000000000..0f74076f90
--- /dev/null
+++ b/shared/src/onboarding/components/hosting/ChangeMaintenanceWindow.tsx
@@ -0,0 +1,48 @@
+import styled from 'styled-components';
+import { Flex } from '@holium/design-system';
+import { AccountDialogDescription } from '../AccountDialog.styles';
+import { TABLET_WIDTH } from '../OnboardDialog.styles';
+import { ChangeButtonGray } from './ChangeButton';
+import {
+ maintenanceWindows,
+ maintenanceWindowToString,
+} from '../../dialogs/util/maintenanceWindows';
+
+const ChangeMaintenanceWindowContainer = styled(Flex)`
+ width: 100%;
+ height: 40px;
+ flex-direction: row;
+ align-items: center;
+ justify-content: space-between;
+
+ @media (max-width: ${TABLET_WIDTH}px) {
+ height: auto;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 4px;
+ }
+`;
+
+type Props = {
+ maintenanceWindow: number;
+ onClick: () => void;
+};
+
+export const ChangeMaintenanceWindow = ({
+ maintenanceWindow,
+ onClick,
+}: Props) => (
+
+
+
+ Your maintenance window is scheduled for:
+
+
+ {maintenanceWindowToString(maintenanceWindows[maintenanceWindow])}
+
+
+
+ Change
+
+
+);
diff --git a/shared/src/onboarding/components/hosting/ChangeMaintenanceWindowModal.tsx b/shared/src/onboarding/components/hosting/ChangeMaintenanceWindowModal.tsx
new file mode 100644
index 0000000000..0d824b679c
--- /dev/null
+++ b/shared/src/onboarding/components/hosting/ChangeMaintenanceWindowModal.tsx
@@ -0,0 +1,59 @@
+import { FormEvent, useState } from 'react';
+import { Text, Flex, useToggle, RadioList } from '@holium/design-system';
+import { Modal } from '../Modal';
+import { SubmitButton } from './SubmitButton';
+import {
+ maintenanceWindows,
+ maintenanceWindowToString,
+} from '../../dialogs/util/maintenanceWindows';
+
+type Props = {
+ isOpen: boolean;
+ initialSelected?: string;
+ onDismiss: () => void;
+ onSubmit: (maintenanceWindow: string) => Promise;
+};
+
+export const ChangeMaintenanceWindowModal = ({
+ isOpen,
+ initialSelected = '0',
+ onDismiss,
+ onSubmit,
+}: Props) => {
+ const submitting = useToggle(false);
+
+ const [selectedMaintenanceWindow, setSelectedMaintenanceWindow] =
+ useState(initialSelected);
+
+ const handleSubmit = async (event: FormEvent) => {
+ event.preventDefault();
+ submitting.toggleOn();
+
+ const response = await onSubmit(selectedMaintenanceWindow);
+
+ if (!response) submitting.toggleOff();
+ else {
+ // Refresh the page to show the new maintenance window.
+ window.location.reload();
+ }
+ };
+
+ return (
+
+ Change maintenance window
+
+ ({
+ label: maintenanceWindowToString(window),
+ value: index.toString(),
+ }))}
+ selected={selectedMaintenanceWindow}
+ onClick={setSelectedMaintenanceWindow}
+ />
+
+
+
+
+
+ );
+};
diff --git a/shared/src/onboarding/components/hosting/GetNewAccessCodeModal.tsx b/shared/src/onboarding/components/hosting/GetNewAccessCodeModal.tsx
new file mode 100644
index 0000000000..bd064511b0
--- /dev/null
+++ b/shared/src/onboarding/components/hosting/GetNewAccessCodeModal.tsx
@@ -0,0 +1,46 @@
+import { FormEvent } from 'react';
+import { Text, Flex, useToggle } from '@holium/design-system';
+import { Modal } from '../Modal';
+
+import { SubmitButton } from './SubmitButton';
+
+type Props = {
+ isOpen: boolean;
+ onDismiss: () => void;
+ onSubmit: () => Promise;
+};
+
+export const GetNewAccessCodeModal = ({
+ isOpen,
+ onDismiss,
+ onSubmit,
+}: Props) => {
+ const submitting = useToggle(false);
+
+ const handleSubmit = async (event: FormEvent) => {
+ event.preventDefault();
+ submitting.toggleOn();
+
+ const response = await onSubmit();
+
+ if (!response) submitting.toggleOff();
+ else {
+ // Refresh the page to show the new access code
+ window.location.reload();
+ }
+ };
+
+ return (
+
+ New Access Code
+
+ Generating a new access code will disconect all active sessions for this
+ ID and require re-authentication with your new access code (you will
+ remain connected to your ThirdEarth account).
+
+
+
+
+
+ );
+};
diff --git a/shared/src/onboarding/components/hosting/SubmitButton.tsx b/shared/src/onboarding/components/hosting/SubmitButton.tsx
new file mode 100644
index 0000000000..2044bb7901
--- /dev/null
+++ b/shared/src/onboarding/components/hosting/SubmitButton.tsx
@@ -0,0 +1,53 @@
+import { ReactNode } from 'react';
+import styled from 'styled-components';
+import { Button, Text, Flex, Spinner } from '@holium/design-system';
+
+const ButtonText = styled(Text.Body)`
+ font-size: 16px;
+ font-weight: 500;
+ line-height: 19px;
+ color: rgba(var(--rlm-accent-rgba));
+ user-select: none;
+`;
+
+type Props = {
+ text: string;
+ submitting: boolean;
+ icon?: ReactNode;
+ disabled?: boolean;
+ onSubmit?: () => void;
+};
+
+export const SubmitButton = ({
+ submitting,
+ text,
+ icon,
+ disabled,
+ onSubmit,
+}: Props) => (
+
+
+ {text}
+ {icon}
+
+ {submitting && (
+
+
+
+ )}
+
+);
diff --git a/shared/src/onboarding/components/hosting/VerifyEmailModal.tsx b/shared/src/onboarding/components/hosting/VerifyEmailModal.tsx
new file mode 100644
index 0000000000..5e70d84e5e
--- /dev/null
+++ b/shared/src/onboarding/components/hosting/VerifyEmailModal.tsx
@@ -0,0 +1,73 @@
+import { useRef, useState } from 'react';
+import { Text, Flex, useToggle, ErrorBox } from '@holium/design-system';
+import { Modal } from '../Modal';
+import {
+ OnboardDialogInputLabel,
+ OnboardDialogInput,
+} from '../OnboardDialog.styles';
+import { SubmitButton } from './SubmitButton';
+
+type Props = {
+ isOpen: boolean;
+ onDismiss: () => void;
+ onSubmit: (token: string, password: string) => Promise;
+};
+
+export const VerifyEmailModal = ({ isOpen, onDismiss, onSubmit }: Props) => {
+ const submitting = useToggle(false);
+
+ const [errorMessage, setErrorMessage] = useState();
+
+ const tokenRef = useRef(null);
+ const passwordRef = useRef(null);
+
+ const handleSubmit = async (event: React.FormEvent) => {
+ setErrorMessage(undefined);
+
+ event.preventDefault();
+ submitting.toggleOn();
+
+ if (tokenRef.current && passwordRef.current) {
+ const response = await onSubmit(
+ tokenRef.current.value,
+ passwordRef.current.value
+ );
+
+ if (!response) {
+ setErrorMessage('Something went wrong. Please try again.');
+ }
+
+ submitting.toggleOff();
+ }
+ };
+
+ return (
+
+ Verify new email
+
+
+ Authorization token
+
+
+
+
+
+ Password
+
+
+
+
+
+
+ {errorMessage && {errorMessage}}
+
+ );
+};
diff --git a/shared/src/onboarding/components/payment/AccountInformation.tsx b/shared/src/onboarding/components/payment/AccountInformation.tsx
new file mode 100644
index 0000000000..6547a91ebd
--- /dev/null
+++ b/shared/src/onboarding/components/payment/AccountInformation.tsx
@@ -0,0 +1,25 @@
+import { Flex } from '@holium/design-system';
+import {
+ OnboardDialogSubTitle,
+ OnboardDialogDescription,
+} from '../OnboardDialog.styles';
+
+type Props = {
+ patp: string;
+ email: string;
+};
+
+export const AccountInformation = ({ patp, email }: Props) => (
+ <>
+
+
+ Urbit ID
+ {patp}
+
+
+ Contact email
+ {email}
+
+
+ >
+);
diff --git a/shared/src/onboarding/components/payment/PaymentForm.tsx b/shared/src/onboarding/components/payment/PaymentForm.tsx
new file mode 100644
index 0000000000..018c4425ec
--- /dev/null
+++ b/shared/src/onboarding/components/payment/PaymentForm.tsx
@@ -0,0 +1,69 @@
+import {
+ CardNumberElement,
+ CardCvcElement,
+ CardExpiryElement,
+} from '@stripe/react-stripe-js';
+import { Flex } from '@holium/design-system';
+import { OnboardDialogSubTitle } from '../OnboardDialog.styles';
+import styled, { css } from 'styled-components';
+
+const InputCss = css`
+ background-color: white;
+ border: 1px solid rgba(var(--rlm-border-rgba));
+ border-radius: 6px;
+ padding: 10px 12px;
+ font-size: '15px';
+ padding: '10px 12px';
+`;
+
+const CardNumberInput = styled(CardNumberElement)`
+ ${InputCss}
+`;
+
+const CardExpiryInput = styled(CardExpiryElement)`
+ ${InputCss}
+`;
+
+const CardCvcInput = styled(CardCvcElement)`
+ ${InputCss}
+`;
+
+const options = {
+ style: {
+ base: {
+ '::placeholder': {
+ color: 'rgba(165, 172, 184, 1)',
+ fontWeight: 600,
+ },
+ },
+ },
+};
+
+export const PaymentForm = () => (
+
+
+
+ Card number
+
+
+
+
+
+
+
+ Expiration date
+
+
+
+
+
+
+
+ CVC
+
+
+
+
+
+
+);
diff --git a/shared/src/onboarding/components/payment/ProductCard.tsx b/shared/src/onboarding/components/payment/ProductCard.tsx
new file mode 100644
index 0000000000..30d331685b
--- /dev/null
+++ b/shared/src/onboarding/components/payment/ProductCard.tsx
@@ -0,0 +1,77 @@
+import styled, { css } from 'styled-components';
+import { Flex, Text } from '@holium/design-system';
+
+const PlanCard = styled.div<{ isSelected: boolean }>`
+ display: flex;
+ flex: 1;
+ gap: 10px;
+ padding: 12px;
+ border-radius: 6px;
+ flex-direction: column;
+ cursor: pointer;
+ user-select: none;
+ align-items: flex-start;
+ border: 1px solid rgba(var(--rlm-border-rgba));
+ background-color: rgba(var(--rlm-window-rgba));
+ ${({ isSelected }) =>
+ isSelected &&
+ css`
+ border: 1px solid rgba(var(--rlm-accent-rgba));
+ background-color: rgba(var(--rlm-accent-rgba), 0.12);
+ `};
+`;
+
+const PlanCardH2 = styled(Text.H2)<{ isSelected: boolean }>`
+ font-size: 24px;
+ font-weight: 600;
+ line-height: 28px;
+ color: ${({ isSelected }) =>
+ isSelected ? 'rgba(var(--rlm-accent-rgba))' : 'rgba(var(--rlm-text-rgba))'};
+`;
+
+const PlanCardHint = styled(Text.Hint)<{ isSelected: boolean }>`
+ font-size: 11px;
+ color: ${({ isSelected }) =>
+ isSelected
+ ? 'rgba(var(--rlm-accent-rgba), 0.8)'
+ : 'rgba(var(--rlm-text-rgba), 0.7)'};
+`;
+
+const PlanCardText = styled(Text.Body)<{ isSelected: boolean }>`
+ font-size: 14px;
+ color: ${({ isSelected }) =>
+ isSelected
+ ? 'rgba(var(--rlm-accent-rgba), 0.8)'
+ : 'rgba(var(--rlm-text-rgba), 0.7)'};
+`;
+
+type Props = {
+ h2Text: string;
+ bodyText: string;
+ hintText?: string;
+ isSelected: boolean;
+ onClick: () => void;
+};
+
+export const ProductCard = ({
+ h2Text,
+ bodyText,
+ hintText,
+ isSelected,
+ onClick,
+}: Props) => (
+
+
+ {h2Text}
+ {hintText && (
+ {hintText}
+ )}
+
+ {bodyText}
+
+);
diff --git a/shared/src/onboarding/components/payment/ProductCards.tsx b/shared/src/onboarding/components/payment/ProductCards.tsx
new file mode 100644
index 0000000000..9e2e2dbcdb
--- /dev/null
+++ b/shared/src/onboarding/components/payment/ProductCards.tsx
@@ -0,0 +1,27 @@
+import { Flex } from '@holium/design-system';
+import { ProductCard } from './ProductCard';
+import { ThirdEarthProduct } from '../../types/index';
+
+type Props = {
+ products: ThirdEarthProduct[];
+ productId: number;
+ setProductId: (productId: number) => void;
+};
+
+export const ProductCards = ({ products, productId, setProductId }: Props) => (
+
+ {/* Assume the cheapest is monthly and the second yearly. */}
+ {products.sort().map((product, index) => (
+ setProductId(product.id)}
+ />
+ ))}
+
+);
diff --git a/shared/src/onboarding/components/s3-storage/DataSentIndicator.tsx b/shared/src/onboarding/components/s3-storage/DataSentIndicator.tsx
new file mode 100644
index 0000000000..e89f1d7365
--- /dev/null
+++ b/shared/src/onboarding/components/s3-storage/DataSentIndicator.tsx
@@ -0,0 +1,40 @@
+import { Flex, ProgressBar, Text } from '@holium/design-system';
+import { OnboardDialogSubTitle } from '../OnboardDialog.styles';
+import { bytesToString } from '../../dialogs/util/bytes';
+
+type Props = {
+ dataSent: {
+ networkUsage: number;
+ minioUsage: number;
+ };
+};
+
+export const DataSentIndicator = ({ dataSent }: Props) => {
+ const { networkUsage, minioUsage } = dataSent;
+
+ const totalBytes = 214748364800; // 200Gb
+ const networkPercent = ((networkUsage * 1024 * 1024) / totalBytes) * 100;
+ const minioPercent = ((minioUsage * 1024 * 1024) / totalBytes) * 100;
+ const networkBytes = networkUsage * 1024 * 1024;
+ const minioBytes = minioUsage * 1024 * 1024;
+
+ return (
+
+ Monthly Data Sent
+
+
+
+ {bytesToString(Number(networkBytes))} (ship data)
+
+ and
+
+ {bytesToString(Number(minioBytes))} (S3 data)
+
+ of {bytesToString(totalBytes)}.
+
+
+ );
+};
diff --git a/shared/src/onboarding/components/s3-storage/DataStorageIndicator.tsx b/shared/src/onboarding/components/s3-storage/DataStorageIndicator.tsx
new file mode 100644
index 0000000000..336c18192d
--- /dev/null
+++ b/shared/src/onboarding/components/s3-storage/DataStorageIndicator.tsx
@@ -0,0 +1,27 @@
+import { Flex, ProgressBar, Text } from '@holium/design-system';
+import { OnboardDialogSubTitle } from '../OnboardDialog.styles';
+import { bytesToString } from '../../dialogs/util/bytes';
+
+type Props = {
+ dataStorage: {
+ used: number;
+ total: number;
+ };
+};
+
+export const DataStorageIndicator = ({ dataStorage }: Props) => {
+ const storageUsedPercentage = (dataStorage.used / dataStorage.total) * 100;
+
+ return (
+
+ Storage Capacity
+
+
+ {bytesToString(dataStorage.used)} of {bytesToString(dataStorage.total)}
+
+
+ );
+};
diff --git a/shared/src/onboarding/components/s3-storage/S3Password.tsx b/shared/src/onboarding/components/s3-storage/S3Password.tsx
new file mode 100644
index 0000000000..74aaa4b265
--- /dev/null
+++ b/shared/src/onboarding/components/s3-storage/S3Password.tsx
@@ -0,0 +1,40 @@
+import {
+ Button,
+ Flex,
+ Icon,
+ TextInput,
+ useToggle,
+} from '@holium/design-system';
+import { AccountDialogTableRow } from '../../components/AccountDialogTableRow';
+
+type Props = {
+ s3Password: string;
+};
+
+export const S3Password = ({ s3Password }: Props) => {
+ const showS3Password = useToggle(false);
+
+ return (
+
+
+
+
+
+ }
+ />
+
+
+ );
+};
diff --git a/shared/src/onboarding/dialogs/AccountCustomDomainDialog.tsx b/shared/src/onboarding/dialogs/AccountCustomDomainDialog.tsx
new file mode 100644
index 0000000000..5cf89587c9
--- /dev/null
+++ b/shared/src/onboarding/dialogs/AccountCustomDomainDialog.tsx
@@ -0,0 +1,99 @@
+import { FormEvent, useRef } from 'react';
+import styled from 'styled-components';
+import {
+ ErrorBox,
+ SuccessBox,
+ Flex,
+ Input,
+ useToggle,
+} from '@holium/design-system';
+import { AccountDialog, SidebarSection } from '../components/AccountDialog';
+import { AccountDialogDescription } from '../components/AccountDialog.styles';
+import { SubmitButton } from '../components/hosting/SubmitButton';
+
+const DomainInput = styled(Input)`
+ display: block;
+ width: 100%;
+ line-height: 32px;
+ text-align: center;
+`;
+
+type Props = {
+ patps: string[];
+ selectedPatp: string;
+ dropletIp: string;
+ errorMessage?: string;
+ successMessage?: string;
+ setSelectedPatp: (patp: string) => void;
+ onClickSave: (domain: string) => Promise;
+ onClickSidebarSection: (section: SidebarSection) => void;
+ onExit: () => void;
+};
+
+export const AccountCustomDomainDialog = ({
+ patps,
+ selectedPatp,
+ dropletIp,
+ errorMessage,
+ successMessage,
+ setSelectedPatp,
+ onClickSave,
+ onClickSidebarSection,
+ onExit,
+}: Props) => {
+ const disabled = useToggle(true);
+ const submitting = useToggle(false);
+ const emailInputRef = useRef(null);
+
+ const onChangeInput = (event: FormEvent) => {
+ const parts = event.currentTarget.value.split('.');
+ const isValidDomain =
+ parts.length > 1 && parts[0].length > 0 && parts[1].length > 0;
+ disabled.setToggle(!isValidDomain);
+ };
+
+ const handleSubmit = async () => {
+ if (!emailInputRef.current) return;
+
+ submitting.toggleOn();
+
+ await onClickSave(emailInputRef.current.value);
+
+ submitting.toggleOff();
+ };
+
+ return (
+
+
+ You may use a domain name you already own or control as an alternate
+ address for this ship. The domain name must be set to resolve to{' '}
+ {dropletIp}.
+
+
+ Once it is resolving to the correct IP, enter the domain name here.
+
+
+
+
+
+ {errorMessage && {errorMessage}}
+ {successMessage && {successMessage}}
+
+ );
+};
diff --git a/shared/src/onboarding/dialogs/AccountDownloadRealmDialog.tsx b/shared/src/onboarding/dialogs/AccountDownloadRealmDialog.tsx
new file mode 100644
index 0000000000..812e5a8924
--- /dev/null
+++ b/shared/src/onboarding/dialogs/AccountDownloadRealmDialog.tsx
@@ -0,0 +1,60 @@
+import { Flex } from '@holium/design-system';
+import { AccountDialog, SidebarSection } from '../components/AccountDialog';
+import { DownloadRealmBodyProps, DownloadRealmButtons } from './DownloadDialog';
+import {
+ AccountDialogDescription,
+ AccountDialogTitle,
+} from '../components/AccountDialog.styles';
+
+type Props = DownloadRealmBodyProps & {
+ patps: string[];
+ selectedPatp: string;
+ setSelectedPatp: (patp: string) => void;
+ onClickSidebarSection: (section: SidebarSection) => void;
+ onExit: () => void;
+};
+
+export const AccountDownloadRealmDialog = ({
+ patps,
+ selectedPatp,
+ setSelectedPatp,
+ onDownloadMacM1,
+ onDownloadMacIntel,
+ onDownloadWindows,
+ onDownloadLinux,
+ onClickSidebarSection,
+ onExit,
+}: Props) => (
+
+
+ Download Realm for desktop
+
+
+ Realm is a community OS for crypto, groups, and friends. It’s a new OS
+ built on a decentralized network.
+
+
+
+ }
+ onClickSidebarSection={onClickSidebarSection}
+ onExit={onExit}
+ />
+);
diff --git a/shared/src/onboarding/dialogs/AccountHostingDialog.tsx b/shared/src/onboarding/dialogs/AccountHostingDialog.tsx
new file mode 100644
index 0000000000..044681c5f4
--- /dev/null
+++ b/shared/src/onboarding/dialogs/AccountHostingDialog.tsx
@@ -0,0 +1,137 @@
+import styled from 'styled-components';
+import { Flex } from '@holium/design-system';
+import { AccountDialog, SidebarSection } from '../components/AccountDialog';
+import { AccountDialogDescription } from '../components/AccountDialog.styles';
+import { AccountDialogTableRow } from '../components/AccountDialogTableRow';
+import { TABLET_WIDTH } from '../components/OnboardDialog.styles';
+import { ChangeButton } from '../components/hosting/ChangeButton';
+import { ChangeMaintenanceWindow } from '../components/hosting/ChangeMaintenanceWindow';
+import { ChangeAccessCode } from '../components/hosting/ChangeAccessCode';
+
+export const AccountDialogTable = styled(Flex)`
+ flex-direction: column;
+
+ @media (max-width: ${TABLET_WIDTH}px) {
+ gap: 24px;
+ }
+`;
+
+const AccountDialogTableRowContainer = styled(Flex)`
+ flex: 1;
+ align-items: center;
+ justify-content: space-between;
+
+ @media (max-width: ${TABLET_WIDTH}px) {
+ width: 100%;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 4px;
+ }
+`;
+
+const GetNewAccessCodeContainer = styled(Flex)`
+ width: 100%;
+ height: 40px;
+ flex-direction: column;
+ align-items: flex-end;
+ justify-content: center;
+
+ @media (max-width: ${TABLET_WIDTH}px) {
+ height: auto;
+ align-items: flex-start;
+ margin-top: -12px;
+ }
+`;
+
+type Props = {
+ patps: string[];
+ selectedPatp: string;
+ email: string;
+ shipUrl: string;
+ shipCode: string;
+ shipMaintenanceWindow: number;
+ setSelectedPatp: (patp: string) => void;
+ onClickChangeEmail: () => void;
+ onClickManageBilling: () => void;
+ onClickGetNewAccessCode: () => void;
+ onClickChangeMaintenanceWindow: () => void;
+ onClickEjectId: () => void;
+ onClickSidebarSection: (section: SidebarSection) => void;
+ onExit: () => void;
+};
+
+export const AccountHostingDialog = ({
+ patps,
+ selectedPatp,
+ email,
+ shipUrl,
+ shipCode,
+ shipMaintenanceWindow,
+ setSelectedPatp,
+ onClickChangeEmail,
+ onClickManageBilling,
+ onClickGetNewAccessCode,
+ onClickChangeMaintenanceWindow,
+ onClickSidebarSection,
+ onExit,
+}: Props) => (
+
+
+
+
+ {selectedPatp}
+
+
+
+
+ {email}
+
+ Change email
+
+
+
+
+
+
+ Credit Card
+
+
+ Manage billing
+
+
+
+
+ {shipUrl}
+
+
+
+
+ Get new access code
+
+
+
+
+
+ {/*
+
+ Eject ID
+
+ */}
+
+);
diff --git a/shared/src/onboarding/dialogs/AccountS3StorageDialog.tsx b/shared/src/onboarding/dialogs/AccountS3StorageDialog.tsx
new file mode 100644
index 0000000000..f4b7f87d15
--- /dev/null
+++ b/shared/src/onboarding/dialogs/AccountS3StorageDialog.tsx
@@ -0,0 +1,71 @@
+import { AccountDialogDescription } from '../components/AccountDialog.styles';
+import { AccountDialogTableRow } from '../components/AccountDialogTableRow';
+import { AccountDialog, SidebarSection } from '../components/AccountDialog';
+import { AccountDialogTable } from './AccountHostingDialog';
+import { S3Password } from '../components/s3-storage/S3Password';
+import { DataStorageIndicator } from '../components/s3-storage/DataStorageIndicator';
+import { DataSentIndicator } from '../components/s3-storage/DataSentIndicator';
+import { Flex, Spinner } from '@holium/design-system';
+
+type Props = {
+ patps: string[];
+ selectedPatp: string;
+ url: string | undefined;
+ s3Bucket: string | undefined;
+ s3Password: string | undefined;
+ dataStorage: {
+ used: number; // bytes
+ total: number; // bytes
+ };
+ dataSent: {
+ networkUsage: number; // MB
+ minioUsage: number; // MB
+ };
+ setSelectedPatp: (patp: string) => void;
+ onClickSidebarSection: (section: SidebarSection) => void;
+ onExit: () => void;
+};
+
+export const AccountS3StorageDialog = ({
+ patps,
+ selectedPatp,
+ url,
+ s3Bucket,
+ s3Password,
+ dataStorage,
+ dataSent,
+ setSelectedPatp,
+ onClickSidebarSection,
+ onExit,
+}: Props) => {
+ return (
+
+ {!url || !s3Bucket || !s3Password ? (
+
+
+
+ ) : (
+
+
+
+
+ {url}
+
+
+
+ {s3Bucket}
+
+
+
+
+ )}
+
+ );
+};
diff --git a/shared/src/onboarding/dialogs/AccountStatisticsDialog.tsx b/shared/src/onboarding/dialogs/AccountStatisticsDialog.tsx
new file mode 100644
index 0000000000..7eed3ab2d2
--- /dev/null
+++ b/shared/src/onboarding/dialogs/AccountStatisticsDialog.tsx
@@ -0,0 +1,29 @@
+import { Text } from '@holium/design-system';
+import { AccountDialog, SidebarSection } from '../components/AccountDialog';
+
+type Props = {
+ patps: string[];
+ selectedPatp: string;
+ setSelectedPatp: (patp: string) => void;
+ onClickSidebarSection: (section: SidebarSection) => void;
+ onExit: () => void;
+};
+
+export const AccountStatisticsDialog = ({
+ patps,
+ selectedPatp,
+ setSelectedPatp,
+ onClickSidebarSection,
+ onExit,
+}: Props) => (
+
+ Coming soon...
+
+);
diff --git a/shared/src/onboarding/dialogs/BootingDialog.tsx b/shared/src/onboarding/dialogs/BootingDialog.tsx
new file mode 100644
index 0000000000..f3cef30650
--- /dev/null
+++ b/shared/src/onboarding/dialogs/BootingDialog.tsx
@@ -0,0 +1,47 @@
+import styled from 'styled-components';
+import { Flex, Icon, Spinner, Text } from '@holium/design-system';
+import { OnboardDialog } from '../components/OnboardDialog';
+
+type Props = {
+ logs: string[];
+ isBooting: boolean;
+ onNext: () => Promise;
+};
+
+const LogCard = styled(Flex)`
+ flex-direction: column;
+ gap: 4px;
+ height: 200px;
+ padding: 12px 16px;
+ background: rgba(var(--rlm-window-bg-rgba));
+ border: 1px solid rgba(var(--rlm-window-border-rgba));
+ border-radius: 9px;
+ overflow-y: scroll;
+`;
+
+const LogText = styled(Text.Body)`
+ font-family: monospace;
+`;
+
+export const BootingDialog = ({ logs, isBooting, onNext }: Props) => (
+
+ ) : (
+
+ )
+ }
+ body={
+
+ Booting your personal server
+
+ {logs.map((log, i) => (
+ {log}
+ ))}
+
+
+ }
+ onNext={isBooting ? undefined : onNext}
+ />
+);
diff --git a/shared/src/onboarding/dialogs/ChooseIdDialog.tsx b/shared/src/onboarding/dialogs/ChooseIdDialog.tsx
new file mode 100644
index 0000000000..45c53b80d8
--- /dev/null
+++ b/shared/src/onboarding/dialogs/ChooseIdDialog.tsx
@@ -0,0 +1,48 @@
+import { useEffect, useState } from 'react';
+import { Text, Flex } from '@holium/design-system';
+import { IdentityIcon } from '../icons/IdentityIcon';
+import { OnboardDialogDescription } from '../components/OnboardDialog.styles';
+import { PatpsPaginated } from '../components/PatpsPaginated';
+import { OnboardDialog } from '../components/OnboardDialog';
+
+type Props = {
+ patps: string[];
+ onSelectPatp: (patp: string) => void;
+ onNext: () => Promise;
+};
+
+export const ChooseIdDialog = ({ patps, onSelectPatp, onNext }: Props) => {
+ const [selectedPatp, setSelectedPatp] = useState();
+
+ const handleOnSelectPatp = (patp: string) => {
+ onSelectPatp(patp);
+ setSelectedPatp(patp);
+ };
+
+ useEffect(() => {
+ handleOnSelectPatp(patps[0]);
+ }, [patps]);
+
+ return (
+ }
+ body={
+ <>
+
+ Choose ID
+
+ An ID is like a phone number. It’s how your friends connect with
+ you on Realm.
+
+
+
+ >
+ }
+ onNext={onNext}
+ />
+ );
+};
diff --git a/shared/src/onboarding/dialogs/CreateAccountDialog.tsx b/shared/src/onboarding/dialogs/CreateAccountDialog.tsx
new file mode 100644
index 0000000000..5f8733e152
--- /dev/null
+++ b/shared/src/onboarding/dialogs/CreateAccountDialog.tsx
@@ -0,0 +1,114 @@
+import { ChangeEvent, useRef } from 'react';
+import {
+ Flex,
+ HoliumButton,
+ Text,
+ Anchor,
+ useToggle,
+ isValidEmail,
+} from '@holium/design-system';
+import {
+ OnboardDialogDescription,
+ OnboardDialogInput,
+ OnboardDialogInputLabel,
+} from '../components/OnboardDialog.styles';
+import { OnboardDialog } from '../components/OnboardDialog';
+
+type Props = {
+ onAlreadyHaveAccount: () => void;
+ onNext: (email: string, password: string) => Promise;
+};
+
+export const CreateAccountDialog = ({
+ onAlreadyHaveAccount,
+ onNext,
+}: Props) => {
+ const emailRef = useRef(null);
+ const passwordRef = useRef(null);
+ const confirmPasswordRef = useRef(null);
+
+ const emailError = useToggle(false);
+ const confirmPasswordError = useToggle(false);
+
+ const onEmailChange = (e: ChangeEvent) => {
+ const email = e.target.value;
+ emailError.setToggle(!isValidEmail(email));
+ };
+
+ const onPasswordChange = () => {
+ confirmPasswordError.toggleOff();
+ };
+
+ const onConfirmPasswordChange = (e: ChangeEvent) => {
+ const password = passwordRef.current?.value;
+ const confirmPassword = e.target.value;
+ confirmPasswordError.setToggle(password !== confirmPassword);
+ };
+
+ const handleOnNext = () => {
+ const email = emailRef.current?.value;
+ const password = passwordRef.current?.value;
+ const confirmPassword = confirmPasswordRef.current?.value;
+
+ if (!email || !password || !confirmPassword) {
+ return Promise.resolve(false);
+ }
+
+ if (emailError.isOn || confirmPasswordError.isOn) {
+ return Promise.resolve(false);
+ }
+
+ return onNext(email, password);
+ };
+
+ return (
+ }
+ body={
+ <>
+ Create account
+
+
+ Email
+
+
+
+
+
+ Password
+
+
+
+
+
+ Confirm password
+
+
+
+
+ Already have an account?{' '}
+ Log in.
+
+ >
+ }
+ onNext={handleOnNext}
+ />
+ );
+};
diff --git a/shared/src/onboarding/dialogs/CredentialsDialog.tsx b/shared/src/onboarding/dialogs/CredentialsDialog.tsx
new file mode 100644
index 0000000000..8922603b88
--- /dev/null
+++ b/shared/src/onboarding/dialogs/CredentialsDialog.tsx
@@ -0,0 +1,78 @@
+import styled from 'styled-components';
+import { CopyButton, Flex, Text } from '@holium/design-system';
+import { CredentialsIcon } from '../icons/CredentialsIcon';
+import {
+ OnboardDialogDescription,
+ OnboardDialogSubTitle,
+} from '../components/OnboardDialog.styles';
+import { OnboardDialog } from '../components/OnboardDialog';
+
+const InfoCard = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ background: rgba(var(--rlm-window-rgba));
+ filter: brightness(0.9);
+ border-radius: 9px;
+ padding: 16px;
+`;
+
+const InfoCardText = styled(Text.Body)`
+ font-size: 14px;
+ font-weight: 400;
+ color: rgba(var(--rlm-text-rgba), 0.7);
+`;
+
+type Props = {
+ credentials: {
+ id: string;
+ url: string;
+ accessCode: string;
+ };
+ onBack: () => void;
+ onNext: () => Promise;
+};
+
+export const CredentialsDialog = ({ credentials, onBack, onNext }: Props) => (
+ }
+ body={
+
+ Credentials
+
+ Save this information in case you want to connect to your personal
+ server from any other browser or device.
+
+
+
+ ID
+ {credentials.id}
+
+
+ URL
+ {credentials.url}
+
+
+
+ Access Code
+
+ {credentials.accessCode}
+
+
+
+
+
+
+ }
+ onBack={onBack}
+ onNext={onNext}
+ />
+);
diff --git a/shared/src/onboarding/dialogs/DownloadDialog.tsx b/shared/src/onboarding/dialogs/DownloadDialog.tsx
new file mode 100644
index 0000000000..ea8f90699e
--- /dev/null
+++ b/shared/src/onboarding/dialogs/DownloadDialog.tsx
@@ -0,0 +1,79 @@
+import { Flex, Text } from '@holium/design-system';
+import { DownloadButton } from '../components/DownloadButton';
+import { OnboardDialogDescription } from '../components/OnboardDialog.styles';
+import { AppleIcon } from '../icons/AppleIcon';
+import { ArrowRightIcon } from '../icons/ArrowRightIcon';
+import { DownloadIcon } from '../icons/DownloadIcon';
+import { LinuxIcon } from '../icons/LinuxIcon';
+import { WindowsIcon } from '../icons/WindowsIcon';
+import { OnboardDialog } from '../components/OnboardDialog';
+
+export type DownloadRealmBodyProps = {
+ onDownloadMacM1: () => void;
+ onDownloadMacIntel: () => void;
+ onDownloadWindows: () => void;
+ onDownloadLinux: () => void;
+};
+
+export const DownloadRealmButtons = ({
+ onDownloadMacM1,
+ onDownloadMacIntel,
+ onDownloadWindows,
+ onDownloadLinux,
+}: DownloadRealmBodyProps) => (
+
+
+ }
+ hint="M1"
+ onClick={onDownloadMacM1}
+ />
+ } onClick={onDownloadWindows} />
+
+
+ }
+ hint="Intel"
+ onClick={onDownloadMacIntel}
+ />
+ } onClick={onDownloadLinux} />
+
+
+);
+
+type Props = DownloadRealmBodyProps & {
+ onBack: () => void;
+ onNext: () => Promise;
+};
+
+export const DownloadDialog = ({
+ onDownloadMacM1,
+ onDownloadMacIntel,
+ onDownloadWindows,
+ onDownloadLinux,
+ onBack,
+ onNext,
+}: Props) => (
+ }
+ body={
+
+ Download Realm for desktop
+
+ Realm is a community OS for crypto, groups, and friends. It’s a new OS
+ build on a decentralized network.
+
+
+
+ }
+ nextText="Go to account"
+ nextIcon={}
+ onBack={onBack}
+ onNext={onNext}
+ />
+);
diff --git a/shared/src/onboarding/dialogs/LoginDialog.tsx b/shared/src/onboarding/dialogs/LoginDialog.tsx
new file mode 100644
index 0000000000..0b079132c1
--- /dev/null
+++ b/shared/src/onboarding/dialogs/LoginDialog.tsx
@@ -0,0 +1,62 @@
+import { useRef } from 'react';
+import { Anchor, Flex, HoliumButton } from '@holium/design-system';
+import {
+ OnboardDialogDescription,
+ OnboardDialogInput,
+ OnboardDialogInputLabel,
+} from '../components/OnboardDialog.styles';
+import { OnboardDialog } from '../components/OnboardDialog';
+
+type Props = {
+ onNoAccount: () => void;
+ onLogin: (email: string, password: string) => Promise;
+};
+
+export const LoginDialog = ({ onNoAccount, onLogin }: Props) => {
+ const emailRef = useRef(null);
+ const passwordRef = useRef(null);
+
+ const handleOnLogin = () => {
+ const email = emailRef.current?.value;
+ const password = passwordRef.current?.value;
+
+ if (email && password) return onLogin(email, password);
+ return Promise.resolve(false);
+ };
+
+ return (
+ }
+ body={
+ <>
+
+
+ Email
+
+
+
+
+
+ Password
+
+
+
+
+ Don't have an account yet?{' '}
+ Sign up.
+
+ >
+ }
+ nextText="Login"
+ onNext={handleOnLogin}
+ />
+ );
+};
diff --git a/shared/src/onboarding/dialogs/PaymentDialog.tsx b/shared/src/onboarding/dialogs/PaymentDialog.tsx
new file mode 100644
index 0000000000..2026d9d213
--- /dev/null
+++ b/shared/src/onboarding/dialogs/PaymentDialog.tsx
@@ -0,0 +1,136 @@
+import { Stripe, StripeElementsOptions } from '@stripe/stripe-js';
+import {
+ CardNumberElement,
+ useStripe,
+ useElements,
+ Elements,
+} from '@stripe/react-stripe-js';
+import { Flex, Spinner } from '@holium/design-system';
+import { OnboardDialogTitle } from '../components/OnboardDialog.styles';
+import { PaymentIcon } from '../icons/PaymentIcon';
+import { OnboardDialog } from '../components/OnboardDialog';
+import { PaymentForm } from '../components/payment/PaymentForm';
+import { ProductCards } from '../components/payment/ProductCards';
+import { AccountInformation } from '../components/payment/AccountInformation';
+import { ThirdEarthProduct } from '../types';
+
+type Props = {
+ products: ThirdEarthProduct[];
+ productId: number;
+ patp: string;
+ email: string;
+ stripe: Stripe | undefined;
+ stripeOptions: StripeElementsOptions | undefined;
+ setProductId: (productId: number) => void;
+ onBack: () => void;
+ onNext: () => Promise;
+};
+
+const PaymentDialogPresenter = ({
+ products,
+ productId,
+ patp,
+ email,
+ stripeOptions,
+ setProductId,
+ onBack,
+ onNext,
+}: Props) => {
+ const stripe = useStripe();
+ const elements = useElements();
+
+ const handleOnNext = async () => {
+ if (!stripe || !elements) return Promise.resolve(false);
+
+ const card = elements.getElement(CardNumberElement);
+
+ if (!card) return Promise.resolve(false);
+
+ const payload = await stripe.createPaymentMethod({
+ type: 'card',
+ card,
+ });
+
+ // Execute the payment.
+ try {
+ if (!stripeOptions?.clientSecret) return Promise.resolve(false);
+
+ const result = await stripe.confirmCardPayment(
+ stripeOptions.clientSecret,
+ {
+ payment_method: payload.paymentMethod?.id,
+ }
+ );
+
+ if (result.error) {
+ console.error(result.error);
+ } else {
+ if (result.paymentIntent?.status === 'succeeded') {
+ return onNext();
+ }
+ }
+ } catch (e) {
+ console.error(e);
+ }
+
+ return Promise.resolve(false);
+ };
+
+ return (
+ }
+ body={
+
+ Payment
+
+
+
+
+ }
+ nextText="Submit"
+ onBack={onBack}
+ onNext={handleOnNext}
+ />
+ );
+};
+
+export const PaymentDialog = ({ stripe, stripeOptions, ...props }: Props) => {
+ if (!stripe || !stripeOptions) {
+ return (
+ }
+ body={
+
+ Payment
+
+
+
+
+
+
+ }
+ nextText="Submit"
+ onBack={props.onBack}
+ onNext={() => Promise.resolve(false)}
+ />
+ );
+ }
+
+ return (
+
+
+
+ );
+};
diff --git a/shared/src/onboarding/dialogs/VerifyEmailDialog.tsx b/shared/src/onboarding/dialogs/VerifyEmailDialog.tsx
new file mode 100644
index 0000000000..f9756943e3
--- /dev/null
+++ b/shared/src/onboarding/dialogs/VerifyEmailDialog.tsx
@@ -0,0 +1,76 @@
+import { useRef, useState } from 'react';
+import { Anchor, Text, Input, Icon } from '@holium/design-system';
+import { OnboardDialogDescription } from '../components/OnboardDialog.styles';
+import { OnboardDialog } from '../components/OnboardDialog';
+
+type Props = {
+ onResend: () => void;
+ onBack: () => void;
+ onNext: (code: string) => Promise;
+};
+
+export const VerifyEmailDialog = ({ onResend, onBack, onNext }: Props) => {
+ const inputRef = useRef(null);
+ const [resendCooldown, setResendCooldown] = useState(0);
+
+ const handleResend = () => {
+ onResend();
+
+ // Start counting down the cooldown.
+ setResendCooldown(60);
+
+ const interval = setInterval(() => {
+ setResendCooldown((cooldown) => {
+ if (cooldown === 0) {
+ clearInterval(interval);
+ return cooldown;
+ }
+
+ return cooldown - 1;
+ });
+ }, 1000);
+ };
+
+ const handleOnNext = () => {
+ if (!inputRef.current?.value) return Promise.resolve(false);
+
+ return onNext(inputRef.current.value);
+ };
+
+ return (
+ }
+ body={
+ <>
+ Verify email
+
+ You will receive a code via email to verify your account.
+
+
+
+ {resendCooldown > 0 ? (
+ `Please wait ${resendCooldown} seconds to resend.`
+ ) : (
+ <>
+ Haven't received one?{' '}
+ Resend.
+ >
+ )}
+
+ >
+ }
+ onBack={onBack}
+ onNext={handleOnNext}
+ />
+ );
+};
diff --git a/shared/src/onboarding/dialogs/stories/Login.stories.tsx b/shared/src/onboarding/dialogs/stories/Login.stories.tsx
new file mode 100644
index 0000000000..3c30a88ac6
--- /dev/null
+++ b/shared/src/onboarding/dialogs/stories/Login.stories.tsx
@@ -0,0 +1,105 @@
+import { ComponentStory, ComponentMeta } from '@storybook/react';
+import { AccountCustomDomainDialog } from '../AccountCustomDomainDialog';
+import { AccountDownloadRealmDialog } from '../AccountDownloadRealmDialog';
+import { AccountHostingDialog } from '../AccountHostingDialog';
+import { AccountS3StorageDialog } from '../AccountS3StorageDialog';
+import { AccountStatisticsDialog } from '../AccountStatisticsDialog';
+import { LoginDialog } from '../LoginDialog';
+import { OnboardingDialogWrapper } from './helpers';
+
+export default {
+ component: LoginDialog,
+ title: 'Onboarding/Login flow',
+} as ComponentMeta;
+
+export const LoginDialogStory: ComponentStory = () => (
+
+ {}}
+ onLogin={() => Promise.resolve(false)}
+ />
+
+);
+
+LoginDialogStory.storyName = '1. Login';
+
+export const AccountHostingDialogStory: ComponentStory<
+ typeof AccountHostingDialog
+> = () => (
+
+ {}}
+ onClickSidebarSection={() => {}}
+ onExit={() => {}}
+ />
+
+);
+
+AccountHostingDialogStory.storyName = '2. Hosting';
+
+export const AccountS3StorageDialogStory: ComponentStory<
+ typeof AccountS3StorageDialog
+> = () => (
+
+ {}}
+ onExit={() => {}}
+ />
+
+);
+
+AccountS3StorageDialogStory.storyName = '3. S3 Storage';
+
+export const AccountStatisticsDialogStory: ComponentStory<
+ typeof AccountStatisticsDialog
+> = () => (
+
+ {}}
+ onExit={() => {}}
+ />
+
+);
+
+AccountStatisticsDialogStory.storyName = '4. Statistics';
+
+export const AccountCustomDomainDialogStory: ComponentStory<
+ typeof AccountCustomDomainDialog
+> = () => (
+
+ {}}
+ onExit={() => {}}
+ />
+
+);
+
+AccountCustomDomainDialogStory.storyName = '5. Custom Domain';
+
+export const AccountDownloadRealmDialogStory: ComponentStory<
+ typeof AccountDownloadRealmDialog
+> = () => (
+
+ {}}
+ onDownloadMacM1={() => {}}
+ onDownloadMacIntel={() => {}}
+ onDownloadWindows={() => {}}
+ onDownloadLinux={() => {}}
+ onExit={() => {}}
+ />
+
+);
+
+AccountDownloadRealmDialogStory.storyName = '6. Download Realm';
diff --git a/shared/src/onboarding/dialogs/stories/Signup.stories.tsx b/shared/src/onboarding/dialogs/stories/Signup.stories.tsx
new file mode 100644
index 0000000000..71647c228c
--- /dev/null
+++ b/shared/src/onboarding/dialogs/stories/Signup.stories.tsx
@@ -0,0 +1,161 @@
+import { ComponentStory, ComponentMeta } from '@storybook/react';
+import { BootingDialog } from '../BootingDialog';
+import { ChooseIdDialog } from '../ChooseIdDialog';
+import { CreateAccountDialog } from '../CreateAccountDialog';
+import { CredentialsDialog } from '../CredentialsDialog';
+import { DownloadDialog } from '../DownloadDialog';
+import { PaymentDialog } from '../PaymentDialog';
+import { VerifyEmailDialog } from '../VerifyEmailDialog';
+import { OnboardingDialogWrapper } from './helpers';
+
+export default {
+ component: CreateAccountDialog,
+ title: 'Onboarding/Signup flow',
+} as ComponentMeta;
+
+export const CreateAccountDialogStory: ComponentStory<
+ typeof CreateAccountDialog
+> = () => (
+
+ {}}
+ onNext={() => Promise.resolve(false)}
+ />
+
+);
+
+CreateAccountDialogStory.storyName = '1. Create account';
+
+export const VerifyEmailDialogStory: ComponentStory<
+ typeof VerifyEmailDialog
+> = () => (
+
+ {}}
+ onBack={() => {}}
+ onNext={() => Promise.resolve(false)}
+ />
+
+);
+
+VerifyEmailDialogStory.storyName = '2. Verify email';
+
+export const ChooseIdDialogStory: ComponentStory<
+ typeof ChooseIdDialog
+> = () => (
+
+ {}}
+ onNext={() => Promise.resolve(false)}
+ />
+
+);
+
+ChooseIdDialogStory.storyName = '3. Choose ID';
+
+export const PaymentDialogStory: ComponentStory = () => (
+
+ {}}
+ patp="~zod"
+ email="admin@admin.com"
+ stripe={undefined}
+ stripeOptions={undefined}
+ onBack={() => {}}
+ onNext={() => Promise.resolve(false)}
+ />
+
+);
+
+PaymentDialogStory.storyName = '4. Payment';
+
+export const BootingDialogStory: ComponentStory = () => (
+
+ Promise.resolve(false)}
+ />
+
+);
+
+BootingDialogStory.storyName = '5.1 Booting';
+
+export const BootingDialogCompleteStory: ComponentStory<
+ typeof BootingDialog
+> = () => (
+
+ Promise.resolve(false)}
+ />
+
+);
+
+BootingDialogCompleteStory.storyName = '5.2 Booting complete';
+
+export const CredentialsDialogStory: ComponentStory<
+ typeof CredentialsDialog
+> = () => (
+
+ {}}
+ onNext={() => Promise.resolve(false)}
+ />
+
+);
+
+CredentialsDialogStory.storyName = '6. Credentials';
+
+export const DownloadDialogStory: ComponentStory<
+ typeof DownloadDialog
+> = () => (
+
+ {}}
+ onDownloadMacIntel={() => {}}
+ onDownloadWindows={() => {}}
+ onDownloadLinux={() => {}}
+ onBack={() => {}}
+ onNext={() => Promise.resolve(false)}
+ />
+
+);
+
+DownloadDialogStory.storyName = '7. Download';
diff --git a/shared/src/onboarding/dialogs/stories/helpers.tsx b/shared/src/onboarding/dialogs/stories/helpers.tsx
new file mode 100644
index 0000000000..9303f115e9
--- /dev/null
+++ b/shared/src/onboarding/dialogs/stories/helpers.tsx
@@ -0,0 +1,18 @@
+import { ReactNode } from 'react';
+import { Flex } from '@holium/design-system';
+
+export const OnboardingDialogWrapper = ({
+ children,
+}: {
+ children: ReactNode;
+}) => (
+
+ {children}
+
+);
diff --git a/shared/src/onboarding/dialogs/util/bytes.ts b/shared/src/onboarding/dialogs/util/bytes.ts
new file mode 100644
index 0000000000..bf003ac815
--- /dev/null
+++ b/shared/src/onboarding/dialogs/util/bytes.ts
@@ -0,0 +1,7 @@
+export function bytesToString(bytes: number): string {
+ if (bytes === 0) return '0 Bytes';
+
+ const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
+ const i = Math.floor(Math.log(bytes) / Math.log(1024));
+ return `${(bytes / 1024 ** i).toFixed(2)} ${units[i]}`;
+}
diff --git a/shared/src/onboarding/dialogs/util/maintenanceWindows.ts b/shared/src/onboarding/dialogs/util/maintenanceWindows.ts
new file mode 100644
index 0000000000..fea98f1a8d
--- /dev/null
+++ b/shared/src/onboarding/dialogs/util/maintenanceWindows.ts
@@ -0,0 +1,54 @@
+type MaintenanceWindow = {
+ weekDay: string;
+ startTime: string;
+ endTime: string;
+};
+
+export const maintenanceWindows: MaintenanceWindow[] = [
+ {
+ weekDay: 'Monday',
+ startTime: '01:00',
+ endTime: '03:00',
+ },
+ {
+ weekDay: 'Tuesday',
+ startTime: '01:00',
+ endTime: '03:00',
+ },
+ {
+ weekDay: 'Wednesday',
+ startTime: '01:00',
+ endTime: '03:00',
+ },
+ {
+ weekDay: 'Thursday',
+ startTime: '01:00',
+ endTime: '03:00',
+ },
+ {
+ weekDay: 'Friday',
+ startTime: '01:00',
+ endTime: '03:00',
+ },
+ {
+ weekDay: 'Saturday',
+ startTime: '01:00',
+ endTime: '03:00',
+ },
+ {
+ weekDay: 'Sunday',
+ startTime: '01:00',
+ endTime: '03:00',
+ },
+ {
+ weekDay: 'Sunday',
+ startTime: '04:00',
+ endTime: '06:00',
+ },
+];
+
+export const maintenanceWindowToString = ({
+ weekDay,
+ startTime,
+ endTime,
+}: MaintenanceWindow) => `${weekDay} ${startTime} - ${endTime} GMT`;
diff --git a/shared/src/onboarding/icons/AppleIcon.tsx b/shared/src/onboarding/icons/AppleIcon.tsx
new file mode 100644
index 0000000000..b59b877982
--- /dev/null
+++ b/shared/src/onboarding/icons/AppleIcon.tsx
@@ -0,0 +1,14 @@
+export const AppleIcon = () => (
+
+);
diff --git a/shared/src/onboarding/icons/ArrowRightIcon.tsx b/shared/src/onboarding/icons/ArrowRightIcon.tsx
new file mode 100644
index 0000000000..0ac8660ce3
--- /dev/null
+++ b/shared/src/onboarding/icons/ArrowRightIcon.tsx
@@ -0,0 +1,25 @@
+import styled from 'styled-components';
+import { ColorVariants } from '@holium/design-system';
+
+type Props = {
+ fill?: ColorVariants;
+};
+
+const Path = styled.path`
+ ${({ fill }) => fill && `fill: rgba(var(--rlm-${fill}-rgba));`}
+`;
+
+export const ArrowRightIcon = ({ fill }: Props) => (
+
+);
diff --git a/shared/src/onboarding/icons/CredentialsIcon.tsx b/shared/src/onboarding/icons/CredentialsIcon.tsx
new file mode 100644
index 0000000000..bd4abdf351
--- /dev/null
+++ b/shared/src/onboarding/icons/CredentialsIcon.tsx
@@ -0,0 +1,30 @@
+export const CredentialsIcon = () => (
+
+);
diff --git a/shared/src/onboarding/icons/DownloadIcon.tsx b/shared/src/onboarding/icons/DownloadIcon.tsx
new file mode 100644
index 0000000000..4190c87754
--- /dev/null
+++ b/shared/src/onboarding/icons/DownloadIcon.tsx
@@ -0,0 +1,47 @@
+export const DownloadIcon = () => (
+
+);
diff --git a/shared/src/onboarding/icons/IdentityIcon.tsx b/shared/src/onboarding/icons/IdentityIcon.tsx
new file mode 100644
index 0000000000..e920130130
--- /dev/null
+++ b/shared/src/onboarding/icons/IdentityIcon.tsx
@@ -0,0 +1,67 @@
+export const IdentityIcon = () => (
+
+);
diff --git a/shared/src/onboarding/icons/LinuxIcon.tsx b/shared/src/onboarding/icons/LinuxIcon.tsx
new file mode 100644
index 0000000000..bdcdbe997f
--- /dev/null
+++ b/shared/src/onboarding/icons/LinuxIcon.tsx
@@ -0,0 +1,14 @@
+export const LinuxIcon = () => (
+
+);
diff --git a/shared/src/onboarding/icons/PaymentIcon.tsx b/shared/src/onboarding/icons/PaymentIcon.tsx
new file mode 100644
index 0000000000..99afd5b963
--- /dev/null
+++ b/shared/src/onboarding/icons/PaymentIcon.tsx
@@ -0,0 +1,46 @@
+export const PaymentIcon = () => (
+
+);
diff --git a/shared/src/onboarding/icons/WindowsIcon.tsx b/shared/src/onboarding/icons/WindowsIcon.tsx
new file mode 100644
index 0000000000..ceda59d0ed
--- /dev/null
+++ b/shared/src/onboarding/icons/WindowsIcon.tsx
@@ -0,0 +1,14 @@
+export const WindowsIcon = () => (
+
+);
diff --git a/shared/src/onboarding/index.ts b/shared/src/onboarding/index.ts
new file mode 100644
index 0000000000..f257ddfa95
--- /dev/null
+++ b/shared/src/onboarding/index.ts
@@ -0,0 +1,23 @@
+export { AccountCustomDomainDialog } from './dialogs/AccountCustomDomainDialog';
+export { AccountDownloadRealmDialog } from './dialogs/AccountDownloadRealmDialog';
+export { AccountHostingDialog } from './dialogs/AccountHostingDialog';
+export { AccountS3StorageDialog } from './dialogs/AccountS3StorageDialog';
+export { AccountStatisticsDialog } from './dialogs/AccountStatisticsDialog';
+export { BootingDialog } from './dialogs/BootingDialog';
+export { ChooseIdDialog } from './dialogs/ChooseIdDialog';
+export { CreateAccountDialog } from './dialogs/CreateAccountDialog';
+export { CredentialsDialog } from './dialogs/CredentialsDialog';
+export { DownloadDialog } from './dialogs/DownloadDialog';
+export { LoginDialog } from './dialogs/LoginDialog';
+export { PaymentDialog } from './dialogs/PaymentDialog';
+export { VerifyEmailDialog } from './dialogs/VerifyEmailDialog';
+export { ChangeEmailModal } from './components/hosting/ChangeEmailModal';
+export { ChangeMaintenanceWindowModal } from './components/hosting/ChangeMaintenanceWindowModal';
+export { VerifyEmailModal } from './components/hosting/VerifyEmailModal';
+export { GetNewAccessCodeModal } from './components/hosting/GetNewAccessCodeModal';
+
+export type {
+ ThirdEarthShip,
+ ThirdEarthProduct,
+ ThirdEarthPortalSession,
+} from './types';
diff --git a/shared/src/onboarding/types/index.ts b/shared/src/onboarding/types/index.ts
new file mode 100644
index 0000000000..6a1c59b077
--- /dev/null
+++ b/shared/src/onboarding/types/index.ts
@@ -0,0 +1,67 @@
+export type ThirdEarthProduct = {
+ client_id: number;
+ comet_count: string;
+ description: string;
+ droplet_class_id: number;
+ id: number;
+ is_migration: boolean;
+ is_planet: boolean;
+ lang_code: string;
+ long_description: string;
+ price_id: string;
+ priority: number;
+ product_status: string;
+ product_type: string;
+ subscription_price: number;
+ threshold: any;
+ title: string;
+};
+
+export type ThirdEarthShip = {
+ ames_port: string;
+ code: string;
+ created_at: string;
+ description: string;
+ droplet_id: number;
+ droplet_ip: string;
+ email: string;
+ eth_address: string;
+ first_boot: boolean;
+ id: number;
+ invoice_id: string;
+ is_migration: boolean;
+ last_restarted: string;
+ link: string;
+ maintenance_window: number;
+ payment_status: string;
+ patp: string;
+ product_id: number;
+ product_type: string;
+ screen_name: string;
+ ship_status: string;
+ ship_type: string;
+ sigil: string;
+ subscription_id: string;
+ subscription_price: number;
+ sponsor: string;
+ tcp_port: string;
+ title: string;
+ transaction_id: number;
+ updated_at: string;
+ user_id: number;
+};
+
+export type ThirdEarthPortalSession = {
+ bpc: string;
+ configuration: string;
+ created: number;
+ customer: string;
+ flow: any;
+ id: string;
+ livemode: boolean;
+ locale: any;
+ object: string;
+ on_behalf_of: any;
+ return_url: string;
+ url: string;
+};
diff --git a/tsconfig.base.json b/tsconfig.base.json
index 2e01e5b440..5b957e8fd1 100644
--- a/tsconfig.base.json
+++ b/tsconfig.base.json
@@ -29,6 +29,7 @@
"references": [
{ "path": "./app" },
{ "path": "./shared" },
+ { "path": "./onboarding" },
{ "path": "./lib/conduit" },
{ "path": "./lib/design-system" },
{ "path": "./lib/presence" },
diff --git a/tsconfig.json b/tsconfig.json
index 9b996af2f3..88f25a0da6 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -4,6 +4,7 @@
".eslintrc.js",
"app",
"shared",
+ "onboarding",
"lib/conduit",
"lib/design-system",
"lib/presence/code",
diff --git a/yarn.lock b/yarn.lock
index 6e4a9e614c..be4faf7e84 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -23,6 +23,19 @@
"@amplitude/ua-parser-js" "^0.7.31"
tslib "^2.4.1"
+"@amplitude/analytics-browser@^1.9.1":
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/@amplitude/analytics-browser/-/analytics-browser-1.9.1.tgz#a26981c1940cf7602f127d726166fbe09f26418a"
+ integrity sha512-7FkcBl6yI5JkiJEqGrIrkaHFRv/W37Nv16C86QduBDKJWN19pUIafkCi6NR4H05BUswFDBtQAxH6cY5zehm0kA==
+ dependencies:
+ "@amplitude/analytics-client-common" "^0.6.1"
+ "@amplitude/analytics-core" "^0.12.0"
+ "@amplitude/analytics-types" "^0.17.0"
+ "@amplitude/plugin-page-view-tracking-browser" "^0.6.1"
+ "@amplitude/plugin-web-attribution-browser" "^0.6.1"
+ "@amplitude/ua-parser-js" "^0.7.31"
+ tslib "^2.4.1"
+
"@amplitude/analytics-client-common@^0.5.2":
version "0.5.2"
resolved "https://registry.yarnpkg.com/@amplitude/analytics-client-common/-/analytics-client-common-0.5.2.tgz#5a5d20389cfb97b0bc3f8111f1f480433ebe4cec"
@@ -33,6 +46,16 @@
"@amplitude/analytics-types" "^0.14.0"
tslib "^2.4.1"
+"@amplitude/analytics-client-common@^0.6.1":
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/@amplitude/analytics-client-common/-/analytics-client-common-0.6.1.tgz#9023ff4d5b731dd11e97f55ca2033b6910546400"
+ integrity sha512-P9Zb1xfmbYMFy3QPfY7G+wwvbvTsfIOS5BOWSUiig+P9PduRwxslPe1Uscns0is6SaHcqIqrw47uuH58FEmmcg==
+ dependencies:
+ "@amplitude/analytics-connector" "^1.4.5"
+ "@amplitude/analytics-core" "^0.12.0"
+ "@amplitude/analytics-types" "^0.17.0"
+ tslib "^2.4.1"
+
"@amplitude/analytics-connector@^1.4.5":
version "1.4.6"
resolved "https://registry.yarnpkg.com/@amplitude/analytics-connector/-/analytics-connector-1.4.6.tgz#60a66eaf0bcdcd17db4f414ff340c69e63116a72"
@@ -48,11 +71,42 @@
"@amplitude/analytics-types" "^0.14.0"
tslib "^2.4.1"
+"@amplitude/analytics-core@^0.12.0":
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/@amplitude/analytics-core/-/analytics-core-0.12.0.tgz#5ca956a55ee97ab9ac6a6ddc034c335156570ae8"
+ integrity sha512-Qg5own7VApdEOUtOnKwk7vFKbXubZ/YBQq0COYK+QFMCp0eF1xwLLLEiE4ThYiq49EwptvinH/bziU6IMi205g==
+ dependencies:
+ "@amplitude/analytics-types" "^0.17.0"
+ tslib "^2.4.1"
+
"@amplitude/analytics-types@^0.14.0":
version "0.14.0"
resolved "https://registry.yarnpkg.com/@amplitude/analytics-types/-/analytics-types-0.14.0.tgz#06848235e52fe1d46a6e04bbc5d14090bdde15e3"
integrity sha512-O3E/KHyWCb4HAlYevqgCzqQdS+0LhbJV2IeVGox2eyCge+/lGwtGdJV2rJNWcoGf3p+BhnbqJBlhkPMs12iniA==
+"@amplitude/analytics-types@^0.17.0":
+ version "0.17.0"
+ resolved "https://registry.yarnpkg.com/@amplitude/analytics-types/-/analytics-types-0.17.0.tgz#5f129ec2c99d1587b7a3495c9dc808534fb02609"
+ integrity sha512-J6JdlUkYPaOInsqYBBOjxwhYi+3ZFl+ICE6yG/1SySX/Eu7a7jAJbBbrH1HrYk+0Hzl5sdO/WA2zhHi0j00qTQ==
+
+"@amplitude/plugin-page-view-tracking-browser@^0.6.1":
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/@amplitude/plugin-page-view-tracking-browser/-/plugin-page-view-tracking-browser-0.6.1.tgz#9bd4b2131fc18b7cc04c0f8d91ba56d911d0be6d"
+ integrity sha512-vafShnEX4a7+73vlSEr7bsVzaUrA7MlrWWtTobU/AJSh1PzmbSRBQKD/xYQNt8W4qChq1AyXOjp9GKFGnWiiTw==
+ dependencies:
+ "@amplitude/analytics-client-common" "^0.6.1"
+ "@amplitude/analytics-types" "^0.17.0"
+ tslib "^2.4.1"
+
+"@amplitude/plugin-web-attribution-browser@^0.6.1":
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/@amplitude/plugin-web-attribution-browser/-/plugin-web-attribution-browser-0.6.1.tgz#fd635d184be978ac5ce9e55d36591c8b098c9178"
+ integrity sha512-znbnwownJPK4BdFGNTfwTq/ILk4n0USyYm+X5f1oHEi8tgHSsY2sT4vTAqdEvJQ7J1e355flYhn2l73WyBsr9w==
+ dependencies:
+ "@amplitude/analytics-client-common" "^0.6.1"
+ "@amplitude/analytics-types" "^0.17.0"
+ tslib "^2.4.1"
+
"@amplitude/ua-parser-js@0.7.31", "@amplitude/ua-parser-js@^0.7.31":
version "0.7.31"
resolved "https://registry.yarnpkg.com/@amplitude/ua-parser-js/-/ua-parser-js-0.7.31.tgz#749bf7cb633cfcc7ff3c10805bad7c5f6fbdbc61"
@@ -2466,6 +2520,76 @@
call-me-maybe "^1.0.1"
glob-to-regexp "^0.3.0"
+"@next/env@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/env/-/env-13.2.4.tgz#8b763700262b2445140a44a8c8d088cef676dbae"
+ integrity sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA==
+
+"@next/swc-android-arm-eabi@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.4.tgz#758d0403771e549f9cee71cbabc0cb16a6c947c0"
+ integrity sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==
+
+"@next/swc-android-arm64@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.2.4.tgz#834d586523045110d5602e0c8aae9028835ac427"
+ integrity sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==
+
+"@next/swc-darwin-arm64@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.4.tgz#5006fca179a36ef3a24d293abadec7438dbb48c6"
+ integrity sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A==
+
+"@next/swc-darwin-x64@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.4.tgz#6549c7c04322766acc3264ccdb3e1b43fcaf7946"
+ integrity sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw==
+
+"@next/swc-freebsd-x64@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.4.tgz#0bbe28979e3e868debc2cc06e45e186ce195b7f4"
+ integrity sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==
+
+"@next/swc-linux-arm-gnueabihf@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.4.tgz#1d28d2203f5a7427d6e7119d7bcb5fc40959fb3e"
+ integrity sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==
+
+"@next/swc-linux-arm64-gnu@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.4.tgz#eb26448190948cdf4c44b8f34110a3ecea32f1d0"
+ integrity sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg==
+
+"@next/swc-linux-arm64-musl@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.4.tgz#c4227c0acd94a420bb14924820710e6284d234d3"
+ integrity sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw==
+
+"@next/swc-linux-x64-gnu@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.4.tgz#6bcb540944ee9b0209b33bfc23b240c2044dfc3e"
+ integrity sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ==
+
+"@next/swc-linux-x64-musl@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.4.tgz#ce21e43251eaf09a09df39372b2c3e38028c30ff"
+ integrity sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA==
+
+"@next/swc-win32-arm64-msvc@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.4.tgz#68220063d8e5e082f5465498675640dedb670ff1"
+ integrity sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw==
+
+"@next/swc-win32-ia32-msvc@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.4.tgz#7c120ab54a081be9566df310bed834f168252990"
+ integrity sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw==
+
+"@next/swc-win32-x64-msvc@13.2.4":
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.4.tgz#5abda92fe12b9829bf7951c4a221282c56041144"
+ integrity sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==
+
"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1":
version "5.1.1-v1"
resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129"
@@ -2662,6 +2786,11 @@
pirates "^4.0.1"
source-map-support "^0.5.16"
+"@preconstruct/next@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@preconstruct/next/-/next-4.0.0.tgz#4d9c64ed68bb7cdc72d35d79d1dbe26ba2cae61e"
+ integrity sha512-vSrc8wFQgBErU7dKTKSQtr/DLWPHcN9jMoiWOAQodB1+B4Kpqqry6QhGYoRm0DQU5gNL+Rcp+Xb350O1E/gjsg==
+
"@radix-ui/primitive@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.0.0.tgz#e1d8ef30b10ea10e69c76e896f608d9276352253"
@@ -4006,11 +4135,23 @@
dependencies:
prop-types "^15.7.2"
+"@stripe/react-stripe-js@^2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@stripe/react-stripe-js/-/react-stripe-js-2.1.0.tgz#71541107628731fb790e1f31d8994fecbcd6cf13"
+ integrity sha512-Zb6Ycrj5QuhYkvtlvvLzo+cysUyA6wkx3zWHQ7uVnHRYRM/n1jtQD6VGBrdmptC8e8PJN6L091gBCyB5P0FqmA==
+ dependencies:
+ prop-types "^15.7.2"
+
"@stripe/stripe-js@^1.32.0":
version "1.46.0"
resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-1.46.0.tgz#2b9acca0dfa7b90aaecd909e678a049f799a27d6"
integrity sha512-dkm0zCEoRLu5rTnsIgwDf/QG2DKcalOT2dk1IVgMySOHWTChLyOvQwMYhEduGgLvyYWTwNhAUV4WOLPQvjwLwA==
+"@stripe/stripe-js@^1.51.0":
+ version "1.51.0"
+ resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-1.51.0.tgz#d64bf6de7c4acd4bda528de82ee0c8dfc778dd0f"
+ integrity sha512-hr75oz/bGuVSNOOVB/DiwjduvB1GG/RJxj8PKF6Z6p0BamFgmLPQBEDPM4aiqBdEjn5WZhdo2vYwgn+X/pzhkw==
+
"@styled-system/background@^5.1.2":
version "5.1.2"
resolved "https://registry.yarnpkg.com/@styled-system/background/-/background-5.1.2.tgz#75c63d06b497ab372b70186c0bf608d62847a2ba"
@@ -4101,6 +4242,13 @@
"@styled-system/core" "^5.1.2"
"@styled-system/css" "^5.1.5"
+"@swc/helpers@0.4.14":
+ version "0.4.14"
+ resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74"
+ integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==
+ dependencies:
+ tslib "^2.4.0"
+
"@szmarczak/http-timer@^4.0.5":
version "4.0.6"
resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807"
@@ -4550,6 +4698,11 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.11.tgz#cbb15c12ca7c16c85a72b6bdc4d4b01151bb3cae"
integrity sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==
+"@types/node@^18.15.3":
+ version "18.15.3"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.3.tgz#f0b991c32cfc6a4e7f3399d6cb4b8cf9a0315014"
+ integrity sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==
+
"@types/normalize-package-data@^2.4.0":
version "2.4.1"
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301"
@@ -4618,7 +4771,7 @@
dependencies:
"@types/react" "*"
-"@types/react-dom@^18.0.10":
+"@types/react-dom@^18.0.10", "@types/react-dom@^18.0.11":
version "18.0.11"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.11.tgz#321351c1459bc9ca3d216aefc8a167beec334e33"
integrity sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==
@@ -4641,7 +4794,7 @@
"@types/scheduler" "*"
csstype "^3.0.2"
-"@types/react@^18.0.27":
+"@types/react@^18.0.27", "@types/react@^18.0.28":
version "18.0.28"
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.28.tgz#accaeb8b86f4908057ad629a26635fe641480065"
integrity sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==
@@ -6787,6 +6940,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001400:
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001447.tgz#ef1f39ae38d839d7176713735a8e467a0a2523bd"
integrity sha512-bdKU1BQDPeEXe9A39xJnGtY0uRq/z5osrnXUw0TcK+EYno45Y+U7QU9HhHEyzvMDffpYadFXi3idnSNkcwLkTw==
+caniuse-lite@^1.0.30001406:
+ version "1.0.30001468"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001468.tgz#0101837c6a4e38e6331104c33dcfb3bdf367a4b7"
+ integrity sha512-zgAo8D5kbOyUcRAgSmgyuvBkjrGk5CGYG5TYgFdpQv+ywcyEpo1LOWoG8YmoflGnh+V+UsNuKYedsoYs0hzV5A==
+
capture-exit@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4"
@@ -6989,6 +7147,11 @@ cli-truncate@^2.1.0:
slice-ansi "^3.0.0"
string-width "^4.2.0"
+client-only@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1"
+ integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==
+
cliui@^7.0.2:
version "7.0.4"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
@@ -12745,6 +12908,31 @@ next-tick@^1.1.0:
resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
+next@^13.2.4:
+ version "13.2.4"
+ resolved "https://registry.yarnpkg.com/next/-/next-13.2.4.tgz#2363330392b0f7da02ab41301f60857ffa7f67d6"
+ integrity sha512-g1I30317cThkEpvzfXujf0O4wtaQHtDCLhlivwlTJ885Ld+eOgcz7r3TGQzeU+cSRoNHtD8tsJgzxVdYojFssw==
+ dependencies:
+ "@next/env" "13.2.4"
+ "@swc/helpers" "0.4.14"
+ caniuse-lite "^1.0.30001406"
+ postcss "8.4.14"
+ styled-jsx "5.1.1"
+ optionalDependencies:
+ "@next/swc-android-arm-eabi" "13.2.4"
+ "@next/swc-android-arm64" "13.2.4"
+ "@next/swc-darwin-arm64" "13.2.4"
+ "@next/swc-darwin-x64" "13.2.4"
+ "@next/swc-freebsd-x64" "13.2.4"
+ "@next/swc-linux-arm-gnueabihf" "13.2.4"
+ "@next/swc-linux-arm64-gnu" "13.2.4"
+ "@next/swc-linux-arm64-musl" "13.2.4"
+ "@next/swc-linux-x64-gnu" "13.2.4"
+ "@next/swc-linux-x64-musl" "13.2.4"
+ "@next/swc-win32-arm64-msvc" "13.2.4"
+ "@next/swc-win32-ia32-msvc" "13.2.4"
+ "@next/swc-win32-x64-msvc" "13.2.4"
+
nice-try@^1.0.4:
version "1.0.5"
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
@@ -13910,6 +14098,15 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
+postcss@8.4.14:
+ version "8.4.14"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf"
+ integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==
+ dependencies:
+ nanoid "^3.3.4"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
postcss@^7.0.14, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6:
version "7.0.39"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309"
@@ -16004,6 +16201,13 @@ styled-components@^5.3.6:
shallowequal "^1.1.0"
supports-color "^5.5.0"
+styled-jsx@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f"
+ integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==
+ dependencies:
+ client-only "0.0.1"
+
styled-system@^5.1.5:
version "5.1.5"
resolved "https://registry.yarnpkg.com/styled-system/-/styled-system-5.1.5.tgz#e362d73e1dbb5641a2fd749a6eba1263dc85075e"
@@ -16483,7 +16687,7 @@ tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e"
integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==
-tslib@^2.4.1:
+tslib@^2.4.0, tslib@^2.4.1:
version "2.5.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
|