From 7f2e2b600fb746cc36c8464629d63ca3aa1a430b Mon Sep 17 00:00:00 2001
From: John Raptis <johnsitpar@gmail.com>
Date: Tue, 4 Oct 2022 16:13:56 +0300
Subject: [PATCH 01/41] fix(clerk-js): Replace gravatar with Boring avatar

---
 package-lock.json                            | 13 ++++++
 package.json                                 |  3 ++
 packages/clerk-js/src/ui/elements/Avatar.tsx | 44 +++++++++++++-------
 3 files changed, 45 insertions(+), 15 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 93a8111b19b..b2e598642bf 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,6 +8,9 @@
       "name": "@clerk/javascript",
       "version": "0.0.0",
       "license": "MIT",
+      "dependencies": {
+        "boring-avatars": "^1.7.0"
+      },
       "devDependencies": {
         "@commitlint/cli": "^16.0.2",
         "@commitlint/config-conventional": "^16.0.0",
@@ -11854,6 +11857,11 @@
       "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
       "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
     },
+    "node_modules/boring-avatars": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/boring-avatars/-/boring-avatars-1.7.0.tgz",
+      "integrity": "sha512-ZNHd8J7C/V0IjQMGQowLJ5rScEFU23WxePigH6rqKcT2Esf0qhYvYxw8s9i3srmlfCnCV00ddBjaoGey1eNOfA=="
+    },
     "node_modules/boxen": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
@@ -47433,6 +47441,11 @@
       "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
       "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
     },
+    "boring-avatars": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/boring-avatars/-/boring-avatars-1.7.0.tgz",
+      "integrity": "sha512-ZNHd8J7C/V0IjQMGQowLJ5rScEFU23WxePigH6rqKcT2Esf0qhYvYxw8s9i3srmlfCnCV00ddBjaoGey1eNOfA=="
+    },
     "boxen": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
diff --git a/package.json b/package.json
index 01068dd68a0..79931b53af6 100644
--- a/package.json
+++ b/package.json
@@ -49,5 +49,8 @@
     "lerna": "lerna",
     "nuke": "rm -r node_modules; for d in packages/*/node_modules; do echo $d; rm -r $d; done",
     "yalc:all": "for d in packages/*/; do echo $d; cd $d; yalc push --replace; cd '../../'; done"
+  },
+  "dependencies": {
+    "boring-avatars": "^1.7.0"
   }
 }
diff --git a/packages/clerk-js/src/ui/elements/Avatar.tsx b/packages/clerk-js/src/ui/elements/Avatar.tsx
index 86508a0a0d3..758d7ab86a8 100644
--- a/packages/clerk-js/src/ui/elements/Avatar.tsx
+++ b/packages/clerk-js/src/ui/elements/Avatar.tsx
@@ -1,7 +1,8 @@
 import { isRetinaDisplay } from '@clerk/shared/utils/isRetinaDisplay';
+import { default as BoringAvatar } from 'boring-avatars';
 import React from 'react';
 
-import { descriptors, Flex, Image, Text } from '../customizables';
+import { descriptors, Flex, Image, Text, useAppearance } from '../customizables';
 import { ElementDescriptor } from '../customizables/elementDescriptors';
 import { InternalTheme } from '../foundations';
 import { common, ThemableCssProp } from '../styledSystem';
@@ -34,14 +35,11 @@ export const Avatar = (props: AvatarProps) => {
     imageElementDescriptor,
   } = props;
   const [error, setError] = React.useState(false);
-  const initials = getInitials({ firstName, lastName, name });
   const fullName = getFullName({ firstName, lastName, name });
   const avatarExists = hasAvatar(profileImageUrl);
   let src;
 
-  if (!avatarExists) {
-    src = GRAVATAR_DEFAULT_AVATAR;
-  } else if (!optimize && profileImageUrl) {
+  if (avatarExists && !optimize && profileImageUrl) {
     const optimizedHeight = Math.max(profileImageFetchSize) * (isRetinaDisplay() ? 2 : 1);
     const srcUrl = new URL(profileImageUrl);
     srcUrl.searchParams.append('height', optimizedHeight.toString());
@@ -51,14 +49,14 @@ export const Avatar = (props: AvatarProps) => {
   }
 
   const ImgOrFallback =
-    initials && (!avatarExists || error) ? (
+    !avatarExists || error ? (
       <InitialsAvatarFallback {...props} />
     ) : (
       <Image
         elementDescriptor={imageElementDescriptor || descriptors.avatarImage}
         alt={fullName}
         title={fullName}
-        src={src || GRAVATAR_DEFAULT_AVATAR}
+        src={src || (profileImageUrl as string)}
         width='100%'
         height='100%'
         onError={() => setError(true)}
@@ -93,21 +91,37 @@ export const Avatar = (props: AvatarProps) => {
 
 function InitialsAvatarFallback(props: AvatarProps) {
   const initials = getInitials(props);
+  const { parsedInternalTheme } = useAppearance();
 
   return (
-    <Text
-      as='span'
-      sx={{ ...common.centeredFlex('inline-flex'), width: '100%' }}
+    <Flex
+      sx={{ position: 'relative' }}
+      justify='center'
+      align='center'
     >
-      {initials}
-    </Text>
+      <BoringAvatar
+        size={props.size?.(parsedInternalTheme)}
+        name={`${props.firstName} ${props.lastName}`}
+        colors={['#CEEBD1', '#B6DEB9', '#B1CCB4', '#AEBFAF', '#A6ADA7']}
+      />
+      {initials && (
+        <Text
+          as='span'
+          sx={{ ...common.centeredFlex('inline-flex'), width: '100%', position: 'absolute' }}
+        >
+          {initials}
+        </Text>
+      )}
+    </Flex>
   );
 }
 
 const CLERK_IMAGE_URL_REGEX = /https:\/\/images\.(lcl)?clerk/i;
-const GRAVATAR_DEFAULT_AVATAR = 'https://www.gravatar.com/avatar?d=mp';
-
+const GRAVATAR_URL_REGEX = /gravatar/i;
 // TODO: How do we want to handle this?
 export function hasAvatar(profileImageUrl: string | undefined | null): boolean {
-  return CLERK_IMAGE_URL_REGEX.test(profileImageUrl!) || !!profileImageUrl;
+  return (
+    (CLERK_IMAGE_URL_REGEX.test(profileImageUrl!) || !!profileImageUrl) &&
+    !GRAVATAR_URL_REGEX.test(profileImageUrl as string)
+  );
 }

From ca5420b4dd6a6ddb26086c1f1641e9b2b44ea7b2 Mon Sep 17 00:00:00 2001
From: John Raptis <johnsitpar@gmail.com>
Date: Wed, 5 Oct 2022 12:15:11 +0300
Subject: [PATCH 02/41] fix(clerk-js): Extract BoringAvatar library module

fix(clerk-js): Add copyright comment
---
 package-lock.json                             |  13 --
 package.json                                  |   3 -
 .../clerk-js/src/ui/common/BoringAvatar.tsx   | 144 ++++++++++++++++++
 packages/clerk-js/src/ui/common/index.ts      |   1 +
 packages/clerk-js/src/ui/elements/Avatar.tsx  |   6 +-
 5 files changed, 148 insertions(+), 19 deletions(-)
 create mode 100644 packages/clerk-js/src/ui/common/BoringAvatar.tsx

diff --git a/package-lock.json b/package-lock.json
index b2e598642bf..93a8111b19b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,9 +8,6 @@
       "name": "@clerk/javascript",
       "version": "0.0.0",
       "license": "MIT",
-      "dependencies": {
-        "boring-avatars": "^1.7.0"
-      },
       "devDependencies": {
         "@commitlint/cli": "^16.0.2",
         "@commitlint/config-conventional": "^16.0.0",
@@ -11857,11 +11854,6 @@
       "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
       "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
     },
-    "node_modules/boring-avatars": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/boring-avatars/-/boring-avatars-1.7.0.tgz",
-      "integrity": "sha512-ZNHd8J7C/V0IjQMGQowLJ5rScEFU23WxePigH6rqKcT2Esf0qhYvYxw8s9i3srmlfCnCV00ddBjaoGey1eNOfA=="
-    },
     "node_modules/boxen": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
@@ -47441,11 +47433,6 @@
       "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
       "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
     },
-    "boring-avatars": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/boring-avatars/-/boring-avatars-1.7.0.tgz",
-      "integrity": "sha512-ZNHd8J7C/V0IjQMGQowLJ5rScEFU23WxePigH6rqKcT2Esf0qhYvYxw8s9i3srmlfCnCV00ddBjaoGey1eNOfA=="
-    },
     "boxen": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
diff --git a/package.json b/package.json
index 79931b53af6..01068dd68a0 100644
--- a/package.json
+++ b/package.json
@@ -49,8 +49,5 @@
     "lerna": "lerna",
     "nuke": "rm -r node_modules; for d in packages/*/node_modules; do echo $d; rm -r $d; done",
     "yalc:all": "for d in packages/*/; do echo $d; cd $d; yalc push --replace; cd '../../'; done"
-  },
-  "dependencies": {
-    "boring-avatars": "^1.7.0"
   }
 }
diff --git a/packages/clerk-js/src/ui/common/BoringAvatar.tsx b/packages/clerk-js/src/ui/common/BoringAvatar.tsx
new file mode 100644
index 00000000000..402e6340098
--- /dev/null
+++ b/packages/clerk-js/src/ui/common/BoringAvatar.tsx
@@ -0,0 +1,144 @@
+/**
+    This module was extracted from the boring-avatars library (https://github.com/boringdesigners/boring-avatars)
+    MIT License, Copyright (c) 2021 boringdesigners
+ */
+
+const ELEMENTS = 3;
+const SIZE = 80;
+
+export const hashCode = (name: string) => {
+  let hash = 0;
+  for (let i = 0; i < name.length; i++) {
+    const character = name.charCodeAt(i);
+    hash = (hash << 5) - hash + character;
+    hash = hash & hash; // Convert to 32bit integer
+  }
+  return Math.abs(hash);
+};
+
+export const getDigit = (number: number, ntn: number) => {
+  return Math.floor((number / Math.pow(10, ntn)) % 10);
+};
+
+export const getUnit = (number: number, range: number, index?: number) => {
+  const value = number % range;
+
+  if (index && getDigit(number, index) % 2 === 0) {
+    return -value;
+  } else {
+    return value;
+  }
+};
+
+export const getRandomColor = (number: number, colors: string[], range: number) => {
+  return colors[number % range];
+};
+
+function generateColors(name: string, colors: string[]) {
+  const numFromName = hashCode(name);
+  const range = colors && colors.length;
+
+  const elementsProperties = Array.from({ length: ELEMENTS }, (_, i) => ({
+    color: getRandomColor(numFromName + i, colors, range),
+    translateX: getUnit(numFromName * (i + 1), SIZE / 10, 1),
+    translateY: getUnit(numFromName * (i + 1), SIZE / 10, 2),
+    scale: 1.2 + getUnit(numFromName * (i + 1), SIZE / 20) / 10,
+    rotate: getUnit(numFromName * (i + 1), 360, 1),
+  }));
+
+  return elementsProperties;
+}
+
+const AvatarMarble = props => {
+  const properties = generateColors(props.name, props.colors);
+
+  return (
+    <svg
+      viewBox={`0 0 ${SIZE} ${SIZE}`}
+      fill='none'
+      role='img'
+      xmlns='http://www.w3.org/2000/svg'
+      width={props.size}
+      height={props.size}
+    >
+      {props.title && <title>{props.name}</title>}
+      <mask
+        id='mask__marble'
+        maskUnits='userSpaceOnUse'
+        x={0}
+        y={0}
+        width={SIZE}
+        height={SIZE}
+      >
+        <rect
+          width={SIZE}
+          height={SIZE}
+          rx={props.square ? undefined : SIZE * 2}
+          fill='#FFFFFF'
+        />
+      </mask>
+      <g mask='url(#mask__marble)'>
+        <rect
+          width={SIZE}
+          height={SIZE}
+          fill={properties[0].color}
+        />
+        <path
+          filter='url(#prefix__filter0_f)'
+          d='M32.414 59.35L50.376 70.5H72.5v-71H33.728L26.5 13.381l19.057 27.08L32.414 59.35z'
+          fill={properties[1].color}
+          transform={`translate(${properties[1].translateX} ${properties[1].translateY}) rotate(${
+            properties[1].rotate
+          } ${SIZE / 2} ${SIZE / 2}) scale(${properties[2].scale})`}
+        />
+        <path
+          filter='url(#prefix__filter0_f)'
+          style={{
+            mixBlendMode: 'overlay',
+          }}
+          d='M22.216 24L0 46.75l14.108 38.129L78 86l-3.081-59.276-22.378 4.005 12.972 20.186-23.35 27.395L22.215 24z'
+          fill={properties[2].color}
+          transform={`translate(${properties[2].translateX} ${properties[2].translateY}) rotate(${
+            properties[2].rotate
+          } ${SIZE / 2} ${SIZE / 2}) scale(${properties[2].scale})`}
+        />
+      </g>
+      <defs>
+        <filter
+          id='prefix__filter0_f'
+          filterUnits='userSpaceOnUse'
+          colorInterpolationFilters='sRGB'
+        >
+          <feFlood
+            floodOpacity={0}
+            result='BackgroundImageFix'
+          />
+          <feBlend
+            in='SourceGraphic'
+            in2='BackgroundImageFix'
+            result='shape'
+          />
+          <feGaussianBlur
+            stdDeviation={7}
+            result='effect1_foregroundBlur'
+          />
+        </filter>
+      </defs>
+    </svg>
+  );
+};
+
+const Avatar = ({
+  colors = ['#92A1C6', '#146A7C', '#F0AB3D', '#C271B4', '#C20D90'],
+  name = 'Clara Barton',
+  square = false,
+  title = false,
+  size = 40,
+  ...props
+}) => {
+  const avatarProps = { colors, name, title, size, square, ...props };
+
+  return <AvatarMarble {...avatarProps} />;
+};
+
+export default Avatar;
diff --git a/packages/clerk-js/src/ui/common/index.ts b/packages/clerk-js/src/ui/common/index.ts
index 02163dc7b89..31cfac52722 100644
--- a/packages/clerk-js/src/ui/common/index.ts
+++ b/packages/clerk-js/src/ui/common/index.ts
@@ -9,3 +9,4 @@ export * from './EmailLinkVerify';
 export * from './EmailLinkStatusCard';
 export * from './Wizard';
 export * from './PrintableComponent';
+export * from './BoringAvatar';
diff --git a/packages/clerk-js/src/ui/elements/Avatar.tsx b/packages/clerk-js/src/ui/elements/Avatar.tsx
index 758d7ab86a8..b198cd31880 100644
--- a/packages/clerk-js/src/ui/elements/Avatar.tsx
+++ b/packages/clerk-js/src/ui/elements/Avatar.tsx
@@ -1,7 +1,7 @@
 import { isRetinaDisplay } from '@clerk/shared/utils/isRetinaDisplay';
-import { default as BoringAvatar } from 'boring-avatars';
 import React from 'react';
 
+import { default as BoringAvatar } from '../common/BoringAvatar';
 import { descriptors, Flex, Image, Text, useAppearance } from '../customizables';
 import { ElementDescriptor } from '../customizables/elementDescriptors';
 import { InternalTheme } from '../foundations';
@@ -56,7 +56,7 @@ export const Avatar = (props: AvatarProps) => {
         elementDescriptor={imageElementDescriptor || descriptors.avatarImage}
         alt={fullName}
         title={fullName}
-        src={src || (profileImageUrl as string)}
+        src={src || ''}
         width='100%'
         height='100%'
         onError={() => setError(true)}
@@ -100,7 +100,7 @@ function InitialsAvatarFallback(props: AvatarProps) {
       align='center'
     >
       <BoringAvatar
-        size={props.size?.(parsedInternalTheme)}
+        size={Number(props.size?.(parsedInternalTheme))}
         name={`${props.firstName} ${props.lastName}`}
         colors={['#CEEBD1', '#B6DEB9', '#B1CCB4', '#AEBFAF', '#A6ADA7']}
       />

From 703fbd9922c25b4e34fc8b443020e77d54a11afe Mon Sep 17 00:00:00 2001
From: John Raptis <johnsitpar@gmail.com>
Date: Fri, 7 Oct 2022 12:18:24 +0300
Subject: [PATCH 03/41] fix(clerk-js): Add default colors for avatar

---
 packages/clerk-js/src/ui/common/BoringAvatar.tsx | 4 +---
 packages/clerk-js/src/ui/elements/Avatar.tsx     | 6 ++++--
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/packages/clerk-js/src/ui/common/BoringAvatar.tsx b/packages/clerk-js/src/ui/common/BoringAvatar.tsx
index 402e6340098..cbc4f7473e0 100644
--- a/packages/clerk-js/src/ui/common/BoringAvatar.tsx
+++ b/packages/clerk-js/src/ui/common/BoringAvatar.tsx
@@ -128,7 +128,7 @@ const AvatarMarble = props => {
   );
 };
 
-const Avatar = ({
+export const BoringAvatar = ({
   colors = ['#92A1C6', '#146A7C', '#F0AB3D', '#C271B4', '#C20D90'],
   name = 'Clara Barton',
   square = false,
@@ -140,5 +140,3 @@ const Avatar = ({
 
   return <AvatarMarble {...avatarProps} />;
 };
-
-export default Avatar;
diff --git a/packages/clerk-js/src/ui/elements/Avatar.tsx b/packages/clerk-js/src/ui/elements/Avatar.tsx
index b198cd31880..66d410936a7 100644
--- a/packages/clerk-js/src/ui/elements/Avatar.tsx
+++ b/packages/clerk-js/src/ui/elements/Avatar.tsx
@@ -1,7 +1,7 @@
 import { isRetinaDisplay } from '@clerk/shared/utils/isRetinaDisplay';
 import React from 'react';
 
-import { default as BoringAvatar } from '../common/BoringAvatar';
+import { BoringAvatar } from '../common/BoringAvatar';
 import { descriptors, Flex, Image, Text, useAppearance } from '../customizables';
 import { ElementDescriptor } from '../customizables/elementDescriptors';
 import { InternalTheme } from '../foundations';
@@ -89,6 +89,8 @@ export const Avatar = (props: AvatarProps) => {
   );
 };
 
+const avatarColors = ['#6C47FF', '#5BC5EF', '#FBD486', '#BEF972', '#FF8F8F'];
+
 function InitialsAvatarFallback(props: AvatarProps) {
   const initials = getInitials(props);
   const { parsedInternalTheme } = useAppearance();
@@ -102,7 +104,7 @@ function InitialsAvatarFallback(props: AvatarProps) {
       <BoringAvatar
         size={Number(props.size?.(parsedInternalTheme))}
         name={`${props.firstName} ${props.lastName}`}
-        colors={['#CEEBD1', '#B6DEB9', '#B1CCB4', '#AEBFAF', '#A6ADA7']}
+        colors={avatarColors}
       />
       {initials && (
         <Text

From 21cafcb488d66f90a3b0a13a2079d9b0473ecf7e Mon Sep 17 00:00:00 2001
From: Sokratis Vidros <sokratis.vidros@gmail.com>
Date: Mon, 10 Oct 2022 11:10:46 +0300
Subject: [PATCH 04/41] fix(types): Remove unused hideNavigation prop from
 UserProfile

---
 packages/types/src/clerk.ts | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/packages/types/src/clerk.ts b/packages/types/src/clerk.ts
index 48a9bb02af0..034ad9a80ae 100644
--- a/packages/types/src/clerk.ts
+++ b/packages/types/src/clerk.ts
@@ -424,10 +424,6 @@ export type UserProfileProps = {
    * Root URL where the component is mounted on, eg: '/user'
    */
   path?: string;
-  /*
-   * Hides the default navigation bar
-   */
-  hideNavigation?: boolean;
   /*
    * Renders only a specific view of the component eg: 'security'
    */

From 121d6972889fe8ecc3d534e12e40273766b2ba41 Mon Sep 17 00:00:00 2001
From: Haris Chaniotakis <chanioxaris@gmail.com>
Date: Fri, 7 Oct 2022 15:39:05 +0300
Subject: [PATCH 05/41] fix(clerk-js): Introduce FullHeightLoader element and
 replace Spinner in UserProfile

Replace the regular Spinner component with the new FullHeightLoader component in the following UserProfile places:
- Generate backup code page
- Adding TOTP page
- Active session section
---
 .../ui/UserProfile/ActiveDevicesSection.tsx   | 10 ++--
 .../ui/UserProfile/AddAuthenticatorApp.tsx    | 11 ++---
 .../UserProfile/MfaBackupCodeCreatePage.tsx   | 49 +++++++++----------
 .../src/ui/elements/FullHeightLoader.tsx      | 17 +++++++
 packages/clerk-js/src/ui/elements/index.ts    |  1 +
 5 files changed, 47 insertions(+), 41 deletions(-)
 create mode 100644 packages/clerk-js/src/ui/elements/FullHeightLoader.tsx

diff --git a/packages/clerk-js/src/ui/UserProfile/ActiveDevicesSection.tsx b/packages/clerk-js/src/ui/UserProfile/ActiveDevicesSection.tsx
index f0cadbcc826..3ea07a57afe 100644
--- a/packages/clerk-js/src/ui/UserProfile/ActiveDevicesSection.tsx
+++ b/packages/clerk-js/src/ui/UserProfile/ActiveDevicesSection.tsx
@@ -3,7 +3,8 @@ import { SessionWithActivitiesResource } from '@clerk/types';
 import React from 'react';
 
 import { useCoreSession, useCoreUser } from '../contexts';
-import { Badge, Col, descriptors, Flex, Icon, localizationKeys, Spinner, Text } from '../customizables';
+import { Badge, Col, descriptors, Flex, Icon, localizationKeys, Text } from '../customizables';
+import { FullHeightLoader } from '../elements';
 import { DeviceLaptop, DeviceMobile } from '../icons';
 import { mqu } from '../styledSystem';
 import { LinkButtonWithDescription } from './LinkButtonWithDescription';
@@ -25,12 +26,7 @@ export const ActiveDevicesSection = () => {
       title={localizationKeys('userProfile.start.activeDevicesSection.title')}
       id='activeDevices'
     >
-      {!sessionsWithActivities.length && (
-        <Spinner
-          colorScheme='primary'
-          size='lg'
-        />
-      )}
+      {!sessionsWithActivities.length && <FullHeightLoader />}
       {!!sessionsWithActivities.length &&
         sessionsWithActivities.sort(currentSessionFirst(session?.id)).map(sa => (
           <DeviceAccordion
diff --git a/packages/clerk-js/src/ui/UserProfile/AddAuthenticatorApp.tsx b/packages/clerk-js/src/ui/UserProfile/AddAuthenticatorApp.tsx
index 02c4c305c7c..c3d67d71ac5 100644
--- a/packages/clerk-js/src/ui/UserProfile/AddAuthenticatorApp.tsx
+++ b/packages/clerk-js/src/ui/UserProfile/AddAuthenticatorApp.tsx
@@ -3,8 +3,8 @@ import { QRCodeSVG } from 'qrcode.react';
 import React from 'react';
 
 import { useCoreUser } from '../contexts';
-import { Button, Col, Spinner, Text } from '../customizables';
-import { ClipboardInput, useCardState } from '../elements';
+import { Button, Col, Text } from '../customizables';
+import { ClipboardInput, FullHeightLoader, useCardState } from '../elements';
 import { handleError } from '../utils';
 import { FormButtonContainer } from './FormButtons';
 import { NavigateToFlowStartButton } from './NavigateToFlowStartButton';
@@ -39,12 +39,7 @@ export const AddAuthenticatorApp = (props: AddAuthenticatorAppProps) => {
 
   return (
     <ContentPage.Root headerTitle={title}>
-      {!totp && (
-        <Spinner
-          colorScheme='primary'
-          size='lg'
-        />
-      )}
+      {!totp && <FullHeightLoader />}
 
       {totp && (
         <>
diff --git a/packages/clerk-js/src/ui/UserProfile/MfaBackupCodeCreatePage.tsx b/packages/clerk-js/src/ui/UserProfile/MfaBackupCodeCreatePage.tsx
index 5accec01a7c..c4f5b59ce07 100644
--- a/packages/clerk-js/src/ui/UserProfile/MfaBackupCodeCreatePage.tsx
+++ b/packages/clerk-js/src/ui/UserProfile/MfaBackupCodeCreatePage.tsx
@@ -2,8 +2,8 @@ import { BackupCodeResource } from '@clerk/types';
 import React from 'react';
 
 import { useCoreUser } from '../contexts';
-import { localizationKeys, Spinner, Text } from '../customizables';
-import { useCardState } from '../elements';
+import { localizationKeys, Text } from '../customizables';
+import { FullHeightLoader, useCardState } from '../elements';
 import { handleError } from '../utils';
 import { FormButtonContainer } from './FormButtons';
 import { MfaBackupCodeList } from './MfaBackupCodeList';
@@ -34,34 +34,31 @@ export const MfaBackupCodeCreatePage = () => {
     return <ContentPage.Root headerTitle={title} />;
   }
 
-  if (!backupCode) {
-    return (
-      <Spinner
-        colorScheme='primary'
-        size='lg'
-      />
-    );
-  }
-
   return (
     <ContentPage.Root headerTitle={title}>
-      <Text
-        localizationKey={text}
-        variant='regularRegular'
-      />
+      {!backupCode ? (
+        <FullHeightLoader />
+      ) : (
+        <>
+          <Text
+            localizationKey={text}
+            variant='regularRegular'
+          />
 
-      <MfaBackupCodeList
-        subtitle={'Store them securely and keep them secret.'}
-        backupCodes={backupCode.codes}
-      />
+          <MfaBackupCodeList
+            subtitle={'Store them securely and keep them secret.'}
+            backupCodes={backupCode.codes}
+          />
 
-      <FormButtonContainer>
-        <NavigateToFlowStartButton
-          variant='solid'
-          autoFocus
-          localizationKey={localizationKeys('userProfile.formButtonPrimary__finish')}
-        />
-      </FormButtonContainer>
+          <FormButtonContainer>
+            <NavigateToFlowStartButton
+              variant='solid'
+              autoFocus
+              localizationKey={localizationKeys('userProfile.formButtonPrimary__finish')}
+            />
+          </FormButtonContainer>
+        </>
+      )}
     </ContentPage.Root>
   );
 };
diff --git a/packages/clerk-js/src/ui/elements/FullHeightLoader.tsx b/packages/clerk-js/src/ui/elements/FullHeightLoader.tsx
new file mode 100644
index 00000000000..4caa9ef4928
--- /dev/null
+++ b/packages/clerk-js/src/ui/elements/FullHeightLoader.tsx
@@ -0,0 +1,17 @@
+import React from 'react';
+
+import { Flex, Spinner } from '../customizables';
+
+export const FullHeightLoader = (): JSX.Element => {
+  return (
+    <Flex
+      center
+      sx={{ height: '100%' }}
+    >
+      <Spinner
+        colorScheme='primary'
+        size='lg'
+      />
+    </Flex>
+  );
+};
diff --git a/packages/clerk-js/src/ui/elements/index.ts b/packages/clerk-js/src/ui/elements/index.ts
index eefe3ac4ed1..764e36f0a03 100644
--- a/packages/clerk-js/src/ui/elements/index.ts
+++ b/packages/clerk-js/src/ui/elements/index.ts
@@ -27,3 +27,4 @@ export * from './RootBox';
 export * from './InvisibleRootBox';
 export * from './ClipboardInput';
 export * from './TileButton';
+export * from './FullHeightLoader';

From d9428cdf21889318a181310f32ea77fe1f627e7e Mon Sep 17 00:00:00 2001
From: John Raptis <johnsitpar@gmail.com>
Date: Thu, 6 Oct 2022 14:51:23 +0300
Subject: [PATCH 06/41] fix(clerk-js): Implement tabs components

fix(clerk-js): Correct typo
---
 packages/clerk-js/src/ui/elements/Tabs.tsx    | 191 ++++++++++++++++++
 packages/clerk-js/src/ui/elements/index.ts    |   1 +
 .../src/ui/utils/getValidReactChildren.ts     |   5 +
 packages/clerk-js/src/ui/utils/index.ts       |   1 +
 4 files changed, 198 insertions(+)
 create mode 100644 packages/clerk-js/src/ui/elements/Tabs.tsx
 create mode 100644 packages/clerk-js/src/ui/utils/getValidReactChildren.ts

diff --git a/packages/clerk-js/src/ui/elements/Tabs.tsx b/packages/clerk-js/src/ui/elements/Tabs.tsx
new file mode 100644
index 00000000000..796843f7d3e
--- /dev/null
+++ b/packages/clerk-js/src/ui/elements/Tabs.tsx
@@ -0,0 +1,191 @@
+import React from 'react';
+
+import * as Primitives from '../../ui/primitives';
+import { Button, Flex } from '../customizables';
+import { createContextAndHook, getValidChildren } from '../utils';
+
+const { Box } = Primitives;
+
+type TabsContextValue = {
+  selectedIndex: number;
+  setSelectedIndex: (item: number) => void;
+  focusedIndex: number;
+  setFocusedIndex: (item: number) => void;
+};
+export const [TabsContext, useTabsContext] = createContextAndHook<TabsContextValue>('TabsContext');
+export const TabsContextProvider = (props: React.PropsWithChildren<{ value: TabsContextValue }>) => {
+  const ctxValue = React.useMemo(
+    () => ({ value: props.value }),
+    [props.value.selectedIndex, props.value.setFocusedIndex],
+  );
+  return <TabsContext.Provider value={ctxValue}>{props.children}</TabsContext.Provider>;
+};
+
+/**
+ * TabsProps
+ */
+type TabsProps = {
+  children: React.ReactNode;
+  defaultIndex?: number | null;
+};
+
+export const Tabs = ({ children, ...props }: TabsProps) => {
+  const { defaultIndex = null } = props;
+  const [selectedIndex, setSelectedIndex] = React.useState(defaultIndex ?? 0);
+  const [focusedIndex, setFocusedIndex] = React.useState(defaultIndex ?? 0);
+
+  return (
+    <TabsContextProvider value={{ selectedIndex, setSelectedIndex, focusedIndex, setFocusedIndex }}>
+      <Box>{children}</Box>
+    </TabsContextProvider>
+  );
+};
+
+/**
+ * TabsList
+ */
+type TabsListProps = React.PropsWithChildren<any>;
+export const TabsList = (props: TabsListProps) => {
+  const { children } = props;
+  const { setSelectedIndex, selectedIndex, setFocusedIndex } = useTabsContext();
+
+  const validChildren = getValidChildren(children);
+  const childrenWithProps = validChildren.map((child, index) =>
+    React.cloneElement(child as React.ReactElement<React.PropsWithChildren<any>>, {
+      tabIndex: index,
+    }),
+  );
+
+  const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {
+    const tabCount = Object.keys(childrenWithProps).length;
+
+    if (e.key === 'ArrowLeft') {
+      const prev = selectedIndex === 0 ? tabCount - 1 : selectedIndex - 1;
+      setFocusedIndex(prev);
+      return setSelectedIndex(prev);
+    }
+    if (e.key === 'ArrowRight') {
+      const next = tabCount - 1 === selectedIndex ? 0 : selectedIndex + 1;
+      setFocusedIndex(next);
+      return setSelectedIndex(next);
+    }
+  };
+
+  return (
+    <Flex
+      onKeyDown={onKeyDown}
+      direction='row'
+      sx={theme => ({ borderBottom: theme.borders.$normal, borderColor: theme.colors.$blackAlpha300 })}
+    >
+      {childrenWithProps}
+    </Flex>
+  );
+};
+
+/**
+ * Tab
+ */
+type TabProps = React.PropsWithChildren<any>;
+type TabPropsWithTabIndex = TabProps & { tabIndex?: number };
+export const Tab = (props: TabProps) => {
+  const { children, tabIndex } = props as TabPropsWithTabIndex;
+
+  if (tabIndex === undefined) {
+    throw new Error('Tab component must be a direct child of TabList.');
+  }
+
+  const { setSelectedIndex, selectedIndex, focusedIndex, setFocusedIndex } = useTabsContext();
+  const ref = React.useRef<HTMLButtonElement | any>(null);
+  const isActive = tabIndex === selectedIndex;
+  const isFocused = tabIndex === focusedIndex;
+
+  const onClick = () => {
+    setSelectedIndex(tabIndex);
+    setFocusedIndex(-1);
+  };
+
+  React.useEffect(() => {
+    if (ref && isFocused) {
+      ref.current.focus();
+    }
+  }, [ref, isFocused]);
+
+  return (
+    <Flex
+      direction='row'
+      sx={{ position: 'relative' }}
+    >
+      <Button
+        onClick={onClick}
+        focusRing={isFocused}
+        variant='ghost'
+        aria-selected={isActive}
+        id={`tab-${tabIndex}`}
+        aria-controls={`tabpanel-${tabIndex}`}
+        role='tab'
+        ref={ref}
+        sx={t => ({
+          background: t.colors.$transparent,
+          color: isActive ? t.colors.$blackAlpha900 : t.colors.$blackAlpha700,
+          gap: t.space.$1x5,
+          fontWeight: t.fontWeights.$medium,
+          borderBottom: t.borders.$normal,
+          borderColor: isActive ? t.colors.$blackAlpha700 : t.colors.$transparent,
+          borderRadius: 0,
+          width: 'fit-content',
+          '&:hover': { backgroundColor: t.colors.$transparent },
+        })}
+      >
+        {children}
+      </Button>
+    </Flex>
+  );
+};
+
+/**
+ * TabPanels
+ */
+type TabPanelsProps = React.PropsWithChildren<any>;
+export const TabPanels = (props: TabPanelsProps) => {
+  const { children } = props;
+
+  const validChildren = getValidChildren(children);
+  const childrenWithProps = validChildren.map((child, index) =>
+    React.cloneElement(child as React.ReactElement<React.PropsWithChildren<any>>, {
+      tabIndex: index,
+    }),
+  );
+
+  return <Flex>{childrenWithProps}</Flex>;
+};
+
+/**
+ * TabPanel
+ */
+type TabPanelProps = React.PropsWithChildren<any>;
+type TabPanelPropsWithTabIndex = TabPanelProps & { tabIndex?: number };
+export const TabPanel = (props: TabPanelProps) => {
+  const { tabIndex, children } = props as TabPanelPropsWithTabIndex;
+
+  if (tabIndex === undefined) {
+    throw new Error('TabPanel component must be a direct child of TabPanels.');
+  }
+
+  const { selectedIndex } = useTabsContext();
+  const isOpen = tabIndex === selectedIndex;
+
+  if (!isOpen) {
+    return null;
+  }
+
+  return (
+    <Flex
+      id={`tabpanel-${tabIndex}`}
+      role='tabpanel'
+      tabIndex={0}
+      aria-labelledby={`tab-${tabIndex}`}
+    >
+      {children}
+    </Flex>
+  );
+};
diff --git a/packages/clerk-js/src/ui/elements/index.ts b/packages/clerk-js/src/ui/elements/index.ts
index 764e36f0a03..171b2bb169f 100644
--- a/packages/clerk-js/src/ui/elements/index.ts
+++ b/packages/clerk-js/src/ui/elements/index.ts
@@ -28,3 +28,4 @@ export * from './InvisibleRootBox';
 export * from './ClipboardInput';
 export * from './TileButton';
 export * from './FullHeightLoader';
+export * from './Tabs';
diff --git a/packages/clerk-js/src/ui/utils/getValidReactChildren.ts b/packages/clerk-js/src/ui/utils/getValidReactChildren.ts
new file mode 100644
index 00000000000..edf8bae4c9e
--- /dev/null
+++ b/packages/clerk-js/src/ui/utils/getValidReactChildren.ts
@@ -0,0 +1,5 @@
+import React from 'react';
+
+export function getValidChildren(children: React.ReactNode) {
+  return React.Children.toArray(children).filter(child => React.isValidElement(child)) as React.ReactElement[];
+}
diff --git a/packages/clerk-js/src/ui/utils/index.ts b/packages/clerk-js/src/ui/utils/index.ts
index 929a455c97a..28bcac91dca 100644
--- a/packages/clerk-js/src/ui/utils/index.ts
+++ b/packages/clerk-js/src/ui/utils/index.ts
@@ -16,3 +16,4 @@ export * from './getIdentifier';
 export * from './readObjectPath';
 export * from './useFormControl';
 export * from './errorHandler';
+export * from './getValidReactChildren';

From ae87f0025b457ac64a60bd5176406bb46b1d532f Mon Sep 17 00:00:00 2001
From: John Raptis <johnsitpar@gmail.com>
Date: Thu, 6 Oct 2022 17:29:25 +0300
Subject: [PATCH 07/41] fix(clerk-js): Improve keyboard nav and handle disabled
 tabs order of focus

---
 packages/clerk-js/src/ui/elements/Tabs.tsx | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/packages/clerk-js/src/ui/elements/Tabs.tsx b/packages/clerk-js/src/ui/elements/Tabs.tsx
index 796843f7d3e..165bacb4b8c 100644
--- a/packages/clerk-js/src/ui/elements/Tabs.tsx
+++ b/packages/clerk-js/src/ui/elements/Tabs.tsx
@@ -57,15 +57,17 @@ export const TabsList = (props: TabsListProps) => {
   );
 
   const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {
-    const tabCount = Object.keys(childrenWithProps).length;
+    const tabs = childrenWithProps.filter(child => !child.props?.isDisabled).map(child => child.props.tabIndex);
+    const tabsLenth = tabs.length;
+    const current = tabs.indexOf(selectedIndex);
 
     if (e.key === 'ArrowLeft') {
-      const prev = selectedIndex === 0 ? tabCount - 1 : selectedIndex - 1;
+      const prev = current === 0 ? tabs[tabsLenth - 1] : tabs[current - 1];
       setFocusedIndex(prev);
       return setSelectedIndex(prev);
     }
     if (e.key === 'ArrowRight') {
-      const next = tabCount - 1 === selectedIndex ? 0 : selectedIndex + 1;
+      const next = tabsLenth - 1 === current ? tabs[0] : tabs[current + 1];
       setFocusedIndex(next);
       return setSelectedIndex(next);
     }
@@ -88,7 +90,7 @@ export const TabsList = (props: TabsListProps) => {
 type TabProps = React.PropsWithChildren<any>;
 type TabPropsWithTabIndex = TabProps & { tabIndex?: number };
 export const Tab = (props: TabProps) => {
-  const { children, tabIndex } = props as TabPropsWithTabIndex;
+  const { children, tabIndex, isDisabled } = props as TabPropsWithTabIndex;
 
   if (tabIndex === undefined) {
     throw new Error('Tab component must be a direct child of TabList.');
@@ -104,6 +106,12 @@ export const Tab = (props: TabProps) => {
     setFocusedIndex(-1);
   };
 
+  React.useEffect(() => {
+    if (isDisabled && tabIndex === 0) {
+      setSelectedIndex((tabIndex as number) + 1);
+    }
+  }, []);
+
   React.useEffect(() => {
     if (ref && isFocused) {
       ref.current.focus();
@@ -118,6 +126,7 @@ export const Tab = (props: TabProps) => {
       <Button
         onClick={onClick}
         focusRing={isFocused}
+        isDisabled={isDisabled}
         variant='ghost'
         aria-selected={isActive}
         id={`tab-${tabIndex}`}

From 8e1d32b660e33c2131642de0e9d0435e40544362 Mon Sep 17 00:00:00 2001
From: John Raptis <johnsitpar@gmail.com>
Date: Mon, 10 Oct 2022 13:12:25 +0300
Subject: [PATCH 08/41] fix(clerk-js): Minor refactor in naming and types

---
 .../clerk-js/src/ui/UserProfile/RootPage.tsx  | 16 +++++-
 packages/clerk-js/src/ui/elements/Tabs.tsx    | 49 ++++++++-----------
 2 files changed, 35 insertions(+), 30 deletions(-)

diff --git a/packages/clerk-js/src/ui/UserProfile/RootPage.tsx b/packages/clerk-js/src/ui/UserProfile/RootPage.tsx
index 3eecf78492e..4593f4d8025 100644
--- a/packages/clerk-js/src/ui/UserProfile/RootPage.tsx
+++ b/packages/clerk-js/src/ui/UserProfile/RootPage.tsx
@@ -2,7 +2,7 @@ import React from 'react';
 
 import { useEnvironment } from '../contexts';
 import { Col, descriptors, localizationKeys } from '../customizables';
-import { Header } from '../elements';
+import { Header, Tab, TabPanel, TabPanels, Tabs, TabsList } from '../elements';
 import { ActiveDevicesSection } from './ActiveDevicesSection';
 import { ConnectedAccountsSection } from './ConnectedAccountsSection';
 import { EmailsSection } from './EmailSection';
@@ -44,6 +44,20 @@ export const RootPage = () => {
           <Header.Subtitle localizationKey={localizationKeys('userProfile.start.headerSubtitle__account')} />
         </Header.Root>
         <UserProfileSection />
+
+        <Tabs>
+          <TabsList>
+            <Tab>Active</Tab>
+            <Tab>Invited</Tab>
+            <Tab>Danger</Tab>
+          </TabsList>
+          <TabPanels>
+            <TabPanel>section 1</TabPanel>
+            <TabPanel>section 2</TabPanel>
+            <TabPanel>section 3</TabPanel>
+          </TabPanels>
+        </Tabs>
+
         {showUsername && <UsernameSection />}
         {showEmail && <EmailsSection />}
         {showPhone && <PhoneSection />}
diff --git a/packages/clerk-js/src/ui/elements/Tabs.tsx b/packages/clerk-js/src/ui/elements/Tabs.tsx
index 165bacb4b8c..11068883f2c 100644
--- a/packages/clerk-js/src/ui/elements/Tabs.tsx
+++ b/packages/clerk-js/src/ui/elements/Tabs.tsx
@@ -1,11 +1,8 @@
 import React from 'react';
 
-import * as Primitives from '../../ui/primitives';
-import { Button, Flex } from '../customizables';
+import { Button, Col, Flex } from '../customizables';
 import { createContextAndHook, getValidChildren } from '../utils';
 
-const { Box } = Primitives;
-
 type TabsContextValue = {
   selectedIndex: number;
   setSelectedIndex: (item: number) => void;
@@ -26,17 +23,17 @@ export const TabsContextProvider = (props: React.PropsWithChildren<{ value: Tabs
  */
 type TabsProps = {
   children: React.ReactNode;
-  defaultIndex?: number | null;
+  defaultIndex?: number;
 };
 
 export const Tabs = ({ children, ...props }: TabsProps) => {
-  const { defaultIndex = null } = props;
-  const [selectedIndex, setSelectedIndex] = React.useState(defaultIndex ?? 0);
-  const [focusedIndex, setFocusedIndex] = React.useState(defaultIndex ?? 0);
+  const { defaultIndex = 0 } = props;
+  const [selectedIndex, setSelectedIndex] = React.useState(defaultIndex);
+  const [focusedIndex, setFocusedIndex] = React.useState(defaultIndex);
 
   return (
     <TabsContextProvider value={{ selectedIndex, setSelectedIndex, focusedIndex, setFocusedIndex }}>
-      <Box>{children}</Box>
+      <Col>{children}</Col>
     </TabsContextProvider>
   );
 };
@@ -49,9 +46,8 @@ export const TabsList = (props: TabsListProps) => {
   const { children } = props;
   const { setSelectedIndex, selectedIndex, setFocusedIndex } = useTabsContext();
 
-  const validChildren = getValidChildren(children);
-  const childrenWithProps = validChildren.map((child, index) =>
-    React.cloneElement(child as React.ReactElement<React.PropsWithChildren<any>>, {
+  const childrenWithProps = getValidChildren(children).map((child, index) =>
+    React.cloneElement(child, {
       tabIndex: index,
     }),
   );
@@ -76,7 +72,6 @@ export const TabsList = (props: TabsListProps) => {
   return (
     <Flex
       onKeyDown={onKeyDown}
-      direction='row'
       sx={theme => ({ borderBottom: theme.borders.$normal, borderColor: theme.colors.$blackAlpha300 })}
     >
       {childrenWithProps}
@@ -97,7 +92,7 @@ export const Tab = (props: TabProps) => {
   }
 
   const { setSelectedIndex, selectedIndex, focusedIndex, setFocusedIndex } = useTabsContext();
-  const ref = React.useRef<HTMLButtonElement | any>(null);
+  const buttonRef = React.useRef<HTMLButtonElement | any>(null);
   const isActive = tabIndex === selectedIndex;
   const isFocused = tabIndex === focusedIndex;
 
@@ -113,26 +108,23 @@ export const Tab = (props: TabProps) => {
   }, []);
 
   React.useEffect(() => {
-    if (ref && isFocused) {
-      ref.current.focus();
+    if (buttonRef.current && isFocused) {
+      buttonRef.current.focus();
     }
-  }, [ref, isFocused]);
+  }, [isFocused]);
 
   return (
-    <Flex
-      direction='row'
-      sx={{ position: 'relative' }}
-    >
+    <Flex sx={{ position: 'relative' }}>
       <Button
         onClick={onClick}
         focusRing={isFocused}
         isDisabled={isDisabled}
         variant='ghost'
         aria-selected={isActive}
-        id={`tab-${tabIndex}`}
-        aria-controls={`tabpanel-${tabIndex}`}
+        id={`cl-tab-${tabIndex}`}
+        aria-controls={`cl-tabpanel-${tabIndex}`}
         role='tab'
-        ref={ref}
+        ref={buttonRef}
         sx={t => ({
           background: t.colors.$transparent,
           color: isActive ? t.colors.$blackAlpha900 : t.colors.$blackAlpha700,
@@ -158,9 +150,8 @@ type TabPanelsProps = React.PropsWithChildren<any>;
 export const TabPanels = (props: TabPanelsProps) => {
   const { children } = props;
 
-  const validChildren = getValidChildren(children);
-  const childrenWithProps = validChildren.map((child, index) =>
-    React.cloneElement(child as React.ReactElement<React.PropsWithChildren<any>>, {
+  const childrenWithProps = getValidChildren(children).map((child, index) =>
+    React.cloneElement(child, {
       tabIndex: index,
     }),
   );
@@ -189,10 +180,10 @@ export const TabPanel = (props: TabPanelProps) => {
 
   return (
     <Flex
-      id={`tabpanel-${tabIndex}`}
+      id={`cl-tabpanel-${tabIndex}`}
       role='tabpanel'
       tabIndex={0}
-      aria-labelledby={`tab-${tabIndex}`}
+      aria-labelledby={`cl-tab-${tabIndex}`}
     >
       {children}
     </Flex>

From 1f08717c5925573de9d4483f09692b3cb1f83f3f Mon Sep 17 00:00:00 2001
From: Nikos Douvlis <nikosdouvlis@gmail.com>
Date: Thu, 6 Oct 2022 21:54:40 +0300
Subject: [PATCH 09/41] chore(repo): Add a `clean` task to all packages

---
 packages/backend-core/package.json        | 1 +
 packages/clerk-js/package.json            | 2 ++
 packages/edge/package.json                | 3 ++-
 packages/expo/package.json                | 3 ++-
 packages/gatsby-plugin-clerk/package.json | 3 ++-
 packages/nextjs/package.json              | 1 +
 packages/react/package.json               | 1 +
 packages/remix/package.json               | 3 ++-
 packages/sdk-node/package.json            | 1 +
 packages/themes/package.json              | 3 ++-
 packages/types/package.json               | 6 +++---
 11 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json
index e9c760dfb0f..3a8f208265f 100644
--- a/packages/backend-core/package.json
+++ b/packages/backend-core/package.json
@@ -5,6 +5,7 @@
   "description": "Clerk Backend API core resources and authentication utilities for JavaScript environments.",
   "scripts": {
     "build": "tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json && ./moduleTypeFix",
+    "clean": "rimraf ./dist",
     "dev": "tsc -p tsconfig.esm.json --watch",
     "test": "jest"
   },
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index 46f54a55d92..3cd695f242f 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -29,6 +29,7 @@
     "build:bundle": "webpack --config webpack.dev.js --env production",
     "build:declarations": "tsc -p tsconfig.declarations.json",
     "dev": "webpack serve --config webpack.dev.js",
+    "clean": "rimraf ./dist",
     "prepublishOnly": "npm run build",
     "postpublish": "node ./scripts/purge-cache.mjs",
     "start": "echo \"Noop\"",
@@ -37,6 +38,7 @@
   },
   "dependencies": {
     "@clerk/types": "^3.10.1",
+    "@clerk/common": "^0.0.1",
     "@emotion/cache": "^11.7.1",
     "@emotion/react": "^11.9.0",
     "@floating-ui/react-dom-interactions": "^0.6.3",
diff --git a/packages/edge/package.json b/packages/edge/package.json
index 92895933bda..2b80b93ca7a 100644
--- a/packages/edge/package.json
+++ b/packages/edge/package.json
@@ -33,7 +33,8 @@
     }
   },
   "scripts": {
-    "build": "node ./scripts/info.cjs && tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json && ./moduleTypeFix"
+    "build": "node ./scripts/info.cjs && tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json && ./moduleTypeFix",
+    "clean": "rimraf ./dist"
   },
   "dependencies": {
     "@clerk/backend-core": "^2.8.1",
diff --git a/packages/expo/package.json b/packages/expo/package.json
index 6c63aad5711..02e5eea3e5e 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -22,7 +22,8 @@
   ],
   "scripts": {
     "build": "tsc -p tsconfig.build.json",
-    "dev": "tsc -p tsconfig.build.json --watch"
+    "dev": "tsc -p tsconfig.build.json --watch",
+    "clean": "rimraf ./dist"
   },
   "dependencies": {
     "@clerk/clerk-js": "^4.9.0",
diff --git a/packages/gatsby-plugin-clerk/package.json b/packages/gatsby-plugin-clerk/package.json
index a53cbd688b8..c5613819df6 100644
--- a/packages/gatsby-plugin-clerk/package.json
+++ b/packages/gatsby-plugin-clerk/package.json
@@ -27,7 +27,8 @@
   "scripts": {
     "prepublishOnly": "npm run build",
     "build": "tsc -p tsconfig.build.json",
-    "dev": "tsc -p tsconfig.build.json --watch"
+    "dev": "tsc -p tsconfig.build.json --watch",
+    "clean": "rimraf ./dist"
   },
   "dependencies": {
     "@clerk/clerk-react": "^4.2.0-staging.0",
diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json
index a3a8fefdc8f..b06cf54160d 100644
--- a/packages/nextjs/package.json
+++ b/packages/nextjs/package.json
@@ -30,6 +30,7 @@
   "scripts": {
     "prepublishOnly": "npm run build",
     "build": "tsc -p tsconfig.build.json",
+    "clean": "rimraf ./dist",
     "dev": "tsc -p tsconfig.build.json --watch"
   },
   "dependencies": {
diff --git a/packages/react/package.json b/packages/react/package.json
index 2b575b88f54..973502d0247 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -22,6 +22,7 @@
   "scripts": {
     "build": "node ./scripts/info.js && tsc -p tsconfig.build.json",
     "dev": "node ./scripts/info.js && tsc -p tsconfig.build.json --watch",
+    "clean": "rimraf ./dist",
     "prepublishOnly": "npm run build",
     "test:coverage": "echo \"Error: no test specified yet\"",
     "test": "jest"
diff --git a/packages/remix/package.json b/packages/remix/package.json
index d4edea1f167..7728e72f1ce 100644
--- a/packages/remix/package.json
+++ b/packages/remix/package.json
@@ -28,7 +28,8 @@
   "scripts": {
     "prepublishOnly": "npm run build",
     "build": "tsc -p tsconfig.build.json",
-    "dev": "tsc -p tsconfig.build.json --watch"
+    "dev": "tsc -p tsconfig.build.json --watch",
+    "clean": "rimraf ./dist"
   },
   "dependencies": {
     "@clerk/clerk-react": "^4.2.6",
diff --git a/packages/sdk-node/package.json b/packages/sdk-node/package.json
index 06571644680..12565acc828 100644
--- a/packages/sdk-node/package.json
+++ b/packages/sdk-node/package.json
@@ -17,6 +17,7 @@
     "build:es5": "node ./scripts/info.js && tsc -p tsconfig.build.json",
     "build:esm": "node ./scripts/info.js && tsc -p tsconfig.esm.json",
     "build": "run-p build:es5 build:esm",
+    "clean": "rimraf ./dist",
     "test": "jest",
     "lint": "eslint ./src --ext .ts",
     "pack": "npm pack"
diff --git a/packages/themes/package.json b/packages/themes/package.json
index 597dba7ca24..8004b58fc75 100644
--- a/packages/themes/package.json
+++ b/packages/themes/package.json
@@ -23,7 +23,8 @@
   ],
   "scripts": {
     "build": "tsc -p tsconfig.build.json",
-    "dev": "tsc -p tsconfig.build.json --watch"
+    "dev": "tsc -p tsconfig.build.json --watch",
+    "clean": "rimraf ./dist"
   },
   "devDependencies": {
     "@clerk/types": "^3.10.1",
diff --git a/packages/types/package.json b/packages/types/package.json
index e07b580a824..4d6471ad488 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -17,13 +17,13 @@
   "main": "dist/index.js",
   "typings": "dist/index.d.ts",
   "files": [
-    "dist",
-    "src"
+    "dist"
   ],
   "scripts": {
     "prepublishOnly": "npm run build",
     "build": "tsc -p tsconfig.build.json",
-    "dev": "tsc -p tsconfig.build.json --watch"
+    "dev": "tsc -p tsconfig.build.json --watch",
+    "clean": "rimraf ./dist"
   },
   "dependencies": {
     "csstype": "^3.1.0"

From c994fcc73ace07120de8c1957fe32c0e0d1e94b5 Mon Sep 17 00:00:00 2001
From: Nikos Douvlis <nikosdouvlis@gmail.com>
Date: Thu, 6 Oct 2022 21:55:47 +0300
Subject: [PATCH 10/41] chore(repo): Update turbo and move all pipelines to
 turbo.json instead of lerna

---
 package.json         |  9 +++++----
 tsconfig.eslint.json |  2 +-
 tsconfig.json        |  1 -
 turbo.json           | 14 +++++++++++---
 4 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/package.json b/package.json
index 01068dd68a0..8ba38415564 100644
--- a/package.json
+++ b/package.json
@@ -28,11 +28,14 @@
     "prettier": "^2.6.0",
     "pretty-quick": "^3.1.3",
     "rimraf": "^3.0.2",
-    "turbo": "^1.1.5",
+    "turbo": "^1.5.5",
     "typescript": "^4.6.4"
   },
   "scripts": {
-    "dev": "lerna run dev --parallel --ignore @clerk/{expo}",
+    "dev": "turbo dev --filter=!@clerk/expo",
+    "build": "turbo build --concurrency=${TURBO_CONCURRENCY:-2}",
+    "test": "turbo test --concurrency=${TURBO_CONCURRENCY:-2}",
+    "clean": "turbo clean",
     "lint-fix": "eslint . --ext .ts",
     "bump": "lerna version",
     "bump:next": "lerna version --conventional-prerelease --preid next  --no-changelog",
@@ -42,8 +45,6 @@
     "release": "lerna publish from-package",
     "prerelease": "npx rimraf packages/*/dist && turbo run build test --concurrency=${TURBO_CONCURRENCY:-2}",
     "release:next": "lerna publish from-package --dist-tag next",
-    "build": "turbo run build --concurrency=${TURBO_CONCURRENCY:-2}",
-    "test": "turbo run test --concurrency=${TURBO_CONCURRENCY:-2}",
     "prepare": "husky install",
     "version": "./scripts/version-info.sh",
     "lerna": "lerna",
diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json
index 763a0535fca..995f938ee24 100644
--- a/tsconfig.eslint.json
+++ b/tsconfig.eslint.json
@@ -3,5 +3,5 @@
   "compilerOptions": {
     "noEmit": true
   },
-  "include": ["packages/*/src", "packages/*/*.js"]
+  "include": ["packages/*/src", "packages/*/*.js", "packages/*/*.config.ts"]
 }
diff --git a/tsconfig.json b/tsconfig.json
index 2f81a5b4bcb..72561fa78a9 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -22,7 +22,6 @@
     "pretty": true,
     "sourceMap": false,
     "strict": true,
-    //    "types": ["node"],
     "target": "ES2019",
     "noErrorTruncation": true
   },
diff --git a/turbo.json b/turbo.json
index 92aa1d5b0fd..0e72acae02b 100644
--- a/turbo.json
+++ b/turbo.json
@@ -1,14 +1,22 @@
 {
-  "npmClient": "npm",
-  "baseBranch": "origin/main",
+  "$schema": "https://turborepo.org/schema.json",
   "pipeline": {
     "build": {
       "dependsOn": ["^build"],
       "outputs": []
     },
+    "dev": {
+      "dependsOn": [],
+      "cache": false
+    },
+    "clean": {
+      "dependsOn": [],
+      "cache": false
+    },
     "test": {
       "dependsOn": ["build"],
-      "outputs": []
+      "outputs": [],
+      "inputs": ["src/**/*.tsx", "src/**/*.ts", "test/**/*.ts", "test/**/*.tsx"]
     }
   }
 }

From ea37b0a2d2c30c3ea0015bfd3544fc5bbe5b05c6 Mon Sep 17 00:00:00 2001
From: Nikos Douvlis <nikosdouvlis@gmail.com>
Date: Thu, 6 Oct 2022 22:17:10 +0300
Subject: [PATCH 11/41] chore(repo): Extract eslint config to the
 eslint-config-custom package

---
 .eslintrc.js                               | 41 +--------------------
 package.json                               |  7 +---
 packages/eslint-config-custom/index.js     | 43 ++++++++++++++++++++++
 packages/eslint-config-custom/package.json | 17 +++++++++
 4 files changed, 63 insertions(+), 45 deletions(-)
 create mode 100644 packages/eslint-config-custom/index.js
 create mode 100644 packages/eslint-config-custom/package.json

diff --git a/.eslintrc.js b/.eslintrc.js
index b61de76c5e3..03ee7431b98 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -1,43 +1,4 @@
 module.exports = {
   root: true,
-  parser: '@typescript-eslint/parser',
-  env: {
-    node: true,
-    browser: true,
-  },
-  parserOptions: {
-    tsconfigRootDir: __dirname,
-    project: ['./tsconfig.eslint.json'],
-  },
-  plugins: ['@typescript-eslint', 'simple-import-sort'],
-  extends: [
-    'eslint:recommended',
-    'plugin:@typescript-eslint/recommended',
-    'plugin:@typescript-eslint/recommended-requiring-type-checking',
-    'prettier',
-  ],
-  rules: {
-    curly: 'error',
-    '@typescript-eslint/no-non-null-assertion': 'warn',
-    '@typescript-eslint/no-unsafe-assignment': 'off',
-    '@typescript-eslint/no-unsafe-call': 'off',
-    '@typescript-eslint/no-unsafe-argument': 'off',
-    '@typescript-eslint/no-unsafe-member-access': 'off',
-    '@typescript-eslint/no-unsafe-return': 'off',
-    '@typescript-eslint/restrict-template-expressions': 'off',
-    '@typescript-eslint/ban-ts-comment': 'off',
-    'simple-import-sort/imports': 'error',
-    'no-restricted-imports': [
-      'error',
-      {
-        patterns: [
-          {
-            group: ['@emotion/*'],
-            message:
-              'Please do not import emotion directly. Import helpers from ./design-system or ./primitives instead.',
-          },
-        ],
-      },
-    ],
-  },
+  extends: ['custom'],
 };
diff --git a/package.json b/package.json
index 8ba38415564..8deffc4998c 100644
--- a/package.json
+++ b/package.json
@@ -17,12 +17,9 @@
     "@commitlint/cli": "^16.0.2",
     "@commitlint/config-conventional": "^16.0.0",
     "@commitlint/config-lerna-scopes": "^16.0.0",
-    "@typescript-eslint/eslint-plugin": "^5.15.0",
-    "@typescript-eslint/parser": "^5.15.0",
     "conventional-changelog-conventionalcommits": "^4.6.3",
-    "eslint": "^8.11.0",
-    "eslint-config-prettier": "^8.5.0",
-    "eslint-plugin-simple-import-sort": "^7.0.0",
+    "eslint": "^8.24.0",
+    "eslint-config-custom": "*",
     "husky": "^7.0.4",
     "lerna": "^4.0.0",
     "prettier": "^2.6.0",
diff --git a/packages/eslint-config-custom/index.js b/packages/eslint-config-custom/index.js
new file mode 100644
index 00000000000..3498db30582
--- /dev/null
+++ b/packages/eslint-config-custom/index.js
@@ -0,0 +1,43 @@
+module.exports = {
+  parser: '@typescript-eslint/parser',
+  env: {
+    node: true,
+    browser: true,
+  },
+  parserOptions: {
+    tsconfigRootDir: __dirname,
+    project: ['../../tsconfig.eslint.json'],
+  },
+  plugins: ['@typescript-eslint', 'simple-import-sort'],
+  extends: [
+    'eslint:recommended',
+    'plugin:@typescript-eslint/recommended',
+    'plugin:@typescript-eslint/recommended-requiring-type-checking',
+    'prettier',
+    'turbo',
+  ],
+  rules: {
+    curly: 'error',
+    '@typescript-eslint/no-non-null-assertion': 'warn',
+    '@typescript-eslint/no-unsafe-assignment': 'off',
+    '@typescript-eslint/no-unsafe-call': 'off',
+    '@typescript-eslint/no-unsafe-argument': 'off',
+    '@typescript-eslint/no-unsafe-member-access': 'off',
+    '@typescript-eslint/no-unsafe-return': 'off',
+    '@typescript-eslint/restrict-template-expressions': 'off',
+    '@typescript-eslint/ban-ts-comment': 'off',
+    'simple-import-sort/imports': 'error',
+    'no-restricted-imports': [
+      'error',
+      {
+        patterns: [
+          {
+            group: ['@emotion/*'],
+            message:
+              'Please do not import emotion directly. Import helpers from ./design-system or ./primitives instead.',
+          },
+        ],
+      },
+    ],
+  },
+};
diff --git a/packages/eslint-config-custom/package.json b/packages/eslint-config-custom/package.json
new file mode 100644
index 00000000000..64700ad4a0c
--- /dev/null
+++ b/packages/eslint-config-custom/package.json
@@ -0,0 +1,17 @@
+{
+  "name": "eslint-config-custom",
+  "version": "0.0.0",
+  "main": "index.js",
+  "license": "MIT",
+  "dependencies": {
+    "eslint-config-prettier": "^8.5.0",
+    "eslint-plugin-react": "7.28.0",
+    "eslint-config-turbo": "latest",
+    "@typescript-eslint/eslint-plugin": "^5.15.0",
+    "@typescript-eslint/parser": "^5.15.0",
+    "eslint-plugin-simple-import-sort": "^7.0.0"
+  },
+  "publishConfig": {
+    "access": "public"
+  }
+}

From c057a31d30ca94a13be3766ce32bda6d2e639c48 Mon Sep 17 00:00:00 2001
From: Nikos Douvlis <nikosdouvlis@gmail.com>
Date: Thu, 6 Oct 2022 22:18:57 +0300
Subject: [PATCH 12/41] chore(repo): Add a `lint` task to all packages

---
 package.json                              | 7 ++++---
 packages/backend-core/package.json        | 1 +
 packages/clerk-js/package.json            | 1 +
 packages/edge/package.json                | 3 ++-
 packages/expo/package.json                | 3 ++-
 packages/gatsby-plugin-clerk/package.json | 3 ++-
 packages/nextjs/package.json              | 1 +
 packages/react/package.json               | 1 +
 packages/remix/package.json               | 3 ++-
 packages/sdk-node/package.json            | 2 +-
 packages/themes/package.json              | 3 ++-
 packages/types/package.json               | 3 ++-
 turbo.json                                | 4 ++++
 13 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/package.json b/package.json
index 8deffc4998c..059f3178486 100644
--- a/package.json
+++ b/package.json
@@ -20,7 +20,7 @@
     "conventional-changelog-conventionalcommits": "^4.6.3",
     "eslint": "^8.24.0",
     "eslint-config-custom": "*",
-    "husky": "^7.0.4",
+    "husky": "^8.0.1",
     "lerna": "^4.0.0",
     "prettier": "^2.6.0",
     "pretty-quick": "^3.1.3",
@@ -33,6 +33,7 @@
     "build": "turbo build --concurrency=${TURBO_CONCURRENCY:-2}",
     "test": "turbo test --concurrency=${TURBO_CONCURRENCY:-2}",
     "clean": "turbo clean",
+    "lint": "turbo lint",
     "lint-fix": "eslint . --ext .ts",
     "bump": "lerna version",
     "bump:next": "lerna version --conventional-prerelease --preid next  --no-changelog",
@@ -42,10 +43,10 @@
     "release": "lerna publish from-package",
     "prerelease": "npx rimraf packages/*/dist && turbo run build test --concurrency=${TURBO_CONCURRENCY:-2}",
     "release:next": "lerna publish from-package --dist-tag next",
-    "prepare": "husky install",
     "version": "./scripts/version-info.sh",
     "lerna": "lerna",
     "nuke": "rm -r node_modules; for d in packages/*/node_modules; do echo $d; rm -r $d; done",
-    "yalc:all": "for d in packages/*/; do echo $d; cd $d; yalc push --replace; cd '../../'; done"
+    "yalc:all": "for d in packages/*/; do echo $d; cd $d; yalc push --replace; cd '../../'; done",
+    "prepare": "husky install"
   }
 }
diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json
index 3a8f208265f..76344ec8411 100644
--- a/packages/backend-core/package.json
+++ b/packages/backend-core/package.json
@@ -6,6 +6,7 @@
   "scripts": {
     "build": "tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json && ./moduleTypeFix",
     "clean": "rimraf ./dist",
+    "lint": "eslint .",
     "dev": "tsc -p tsconfig.esm.json --watch",
     "test": "jest"
   },
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index 3cd695f242f..c2c90f8b661 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -30,6 +30,7 @@
     "build:declarations": "tsc -p tsconfig.declarations.json",
     "dev": "webpack serve --config webpack.dev.js",
     "clean": "rimraf ./dist",
+    "lint": "eslint .",
     "prepublishOnly": "npm run build",
     "postpublish": "node ./scripts/purge-cache.mjs",
     "start": "echo \"Noop\"",
diff --git a/packages/edge/package.json b/packages/edge/package.json
index 2b80b93ca7a..8cbdd8246eb 100644
--- a/packages/edge/package.json
+++ b/packages/edge/package.json
@@ -34,7 +34,8 @@
   },
   "scripts": {
     "build": "node ./scripts/info.cjs && tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json && ./moduleTypeFix",
-    "clean": "rimraf ./dist"
+    "clean": "rimraf ./dist",
+    "lint": "eslint ."
   },
   "dependencies": {
     "@clerk/backend-core": "^2.8.1",
diff --git a/packages/expo/package.json b/packages/expo/package.json
index 02e5eea3e5e..c2016c3047d 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -23,7 +23,8 @@
   "scripts": {
     "build": "tsc -p tsconfig.build.json",
     "dev": "tsc -p tsconfig.build.json --watch",
-    "clean": "rimraf ./dist"
+    "clean": "rimraf ./dist",
+    "lint": "eslint ."
   },
   "dependencies": {
     "@clerk/clerk-js": "^4.9.0",
diff --git a/packages/gatsby-plugin-clerk/package.json b/packages/gatsby-plugin-clerk/package.json
index c5613819df6..31342231ce0 100644
--- a/packages/gatsby-plugin-clerk/package.json
+++ b/packages/gatsby-plugin-clerk/package.json
@@ -28,7 +28,8 @@
     "prepublishOnly": "npm run build",
     "build": "tsc -p tsconfig.build.json",
     "dev": "tsc -p tsconfig.build.json --watch",
-    "clean": "rimraf ./dist"
+    "clean": "rimraf ./dist",
+    "lint": "eslint ."
   },
   "dependencies": {
     "@clerk/clerk-react": "^4.2.0-staging.0",
diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json
index b06cf54160d..7187939f639 100644
--- a/packages/nextjs/package.json
+++ b/packages/nextjs/package.json
@@ -31,6 +31,7 @@
     "prepublishOnly": "npm run build",
     "build": "tsc -p tsconfig.build.json",
     "clean": "rimraf ./dist",
+    "lint": "eslint .",
     "dev": "tsc -p tsconfig.build.json --watch"
   },
   "dependencies": {
diff --git a/packages/react/package.json b/packages/react/package.json
index 973502d0247..673b517ae76 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -23,6 +23,7 @@
     "build": "node ./scripts/info.js && tsc -p tsconfig.build.json",
     "dev": "node ./scripts/info.js && tsc -p tsconfig.build.json --watch",
     "clean": "rimraf ./dist",
+    "lint": "eslint .",
     "prepublishOnly": "npm run build",
     "test:coverage": "echo \"Error: no test specified yet\"",
     "test": "jest"
diff --git a/packages/remix/package.json b/packages/remix/package.json
index 7728e72f1ce..c6fafeffc19 100644
--- a/packages/remix/package.json
+++ b/packages/remix/package.json
@@ -29,7 +29,8 @@
     "prepublishOnly": "npm run build",
     "build": "tsc -p tsconfig.build.json",
     "dev": "tsc -p tsconfig.build.json --watch",
-    "clean": "rimraf ./dist"
+    "clean": "rimraf ./dist",
+    "lint": "eslint ."
   },
   "dependencies": {
     "@clerk/clerk-react": "^4.2.6",
diff --git a/packages/sdk-node/package.json b/packages/sdk-node/package.json
index 12565acc828..6c8ea295381 100644
--- a/packages/sdk-node/package.json
+++ b/packages/sdk-node/package.json
@@ -18,8 +18,8 @@
     "build:esm": "node ./scripts/info.js && tsc -p tsconfig.esm.json",
     "build": "run-p build:es5 build:esm",
     "clean": "rimraf ./dist",
+    "lint": "eslint .",
     "test": "jest",
-    "lint": "eslint ./src --ext .ts",
     "pack": "npm pack"
   },
   "name": "@clerk/clerk-sdk-node",
diff --git a/packages/themes/package.json b/packages/themes/package.json
index 8004b58fc75..49997974fd2 100644
--- a/packages/themes/package.json
+++ b/packages/themes/package.json
@@ -24,7 +24,8 @@
   "scripts": {
     "build": "tsc -p tsconfig.build.json",
     "dev": "tsc -p tsconfig.build.json --watch",
-    "clean": "rimraf ./dist"
+    "clean": "rimraf ./dist",
+    "lint": "eslint ."
   },
   "devDependencies": {
     "@clerk/types": "^3.10.1",
diff --git a/packages/types/package.json b/packages/types/package.json
index 4d6471ad488..df74beaab0a 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -23,7 +23,8 @@
     "prepublishOnly": "npm run build",
     "build": "tsc -p tsconfig.build.json",
     "dev": "tsc -p tsconfig.build.json --watch",
-    "clean": "rimraf ./dist"
+    "clean": "rimraf ./dist",
+    "lint": "eslint ."
   },
   "dependencies": {
     "csstype": "^3.1.0"
diff --git a/turbo.json b/turbo.json
index 0e72acae02b..787e64329fc 100644
--- a/turbo.json
+++ b/turbo.json
@@ -17,6 +17,10 @@
       "dependsOn": ["build"],
       "outputs": [],
       "inputs": ["src/**/*.tsx", "src/**/*.ts", "test/**/*.ts", "test/**/*.tsx"]
+    },
+    "lint": {
+      "dependsOn": [],
+      "outputs": []
     }
   }
 }

From 52bb1cb950edc88b53c8ea05c88b3cfd6b1d377e Mon Sep 17 00:00:00 2001
From: Nikos Douvlis <nikosdouvlis@gmail.com>
Date: Sun, 9 Oct 2022 14:44:01 +0300
Subject: [PATCH 13/41] fix(clerk-js): Fix useSupportEmail.test.tsx

---
 .../clerk-js/src/ui/hooks/useSupportEmail.test.tsx   | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/packages/clerk-js/src/ui/hooks/useSupportEmail.test.tsx b/packages/clerk-js/src/ui/hooks/useSupportEmail.test.tsx
index 5fa5eeccafd..ec3d2d3a280 100644
--- a/packages/clerk-js/src/ui/hooks/useSupportEmail.test.tsx
+++ b/packages/clerk-js/src/ui/hooks/useSupportEmail.test.tsx
@@ -1,19 +1,19 @@
-import { renderHook } from '@clerk/shared/testUtils';
+import { renderHook } from '@clerk/common/testUtils';
+
+import { useSupportEmail } from './useSupportEmail';
 
 const mockUseOptions = jest.fn();
 const mockUseEnvironment = jest.fn();
 
-import { useSupportEmail } from './useSupportEmail';
-
-jest.mock('ui/contexts', () => {
+jest.mock('../contexts', () => {
   return {
     useCoreClerk: () => {
       return {
         frontendApi: 'clerk.clerk.dev',
       };
     },
-    useEnvironment: mockUseEnvironment,
-    useOptions: mockUseOptions,
+    useEnvironment: () => mockUseEnvironment(),
+    useOptions: () => mockUseOptions(),
   };
 });
 

From dbf1ea1ba263352976b34f1f9a5879943fe940e2 Mon Sep 17 00:00:00 2001
From: Nikos Douvlis <nikosdouvlis@gmail.com>
Date: Sun, 9 Oct 2022 19:49:39 +0300
Subject: [PATCH 14/41] chore(repo): Bump typescript to 8.6.4

---
 package-lock.json                             | 734 +++++++++---------
 package.json                                  |   6 +-
 packages/backend-core/package.json            |   2 +-
 packages/backend-core/tsconfig.json           |   3 +-
 packages/clerk-js/package.json                |   2 +-
 .../src/ui/contexts/CoreSessionContext.tsx    |   2 +-
 .../src/ui/contexts/CoreUserContext.tsx       |   2 +-
 .../src/ui/hooks/useSupportEmail.test.tsx     |   2 +-
 packages/edge/package.json                    |   2 +-
 packages/edge/src/vercel-edge/types.ts        |   6 +-
 packages/expo/package.json                    |   2 +-
 packages/gatsby-plugin-clerk/package.json     |   2 +-
 packages/gatsby-plugin-clerk/src/ssr/types.ts |   4 +-
 packages/nextjs/package.json                  |   2 +-
 packages/nextjs/src/middleware/types.ts       |   4 +-
 packages/react/package.json                   |   2 +-
 .../src/utils/useMaxAllowedInstancesGuard.tsx |   2 +-
 packages/remix/package.json                   |   2 +-
 packages/remix/src/ssr/types.ts               |   2 +-
 packages/sdk-node/package.json                |   2 +-
 packages/themes/package.json                  |   2 +-
 packages/types/package.json                   |   2 +-
 22 files changed, 417 insertions(+), 372 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 54457502695..25dc21fcd89 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,19 +12,16 @@
         "@commitlint/cli": "^16.0.2",
         "@commitlint/config-conventional": "^16.0.0",
         "@commitlint/config-lerna-scopes": "^16.0.0",
-        "@typescript-eslint/eslint-plugin": "^5.15.0",
-        "@typescript-eslint/parser": "^5.15.0",
         "conventional-changelog-conventionalcommits": "^4.6.3",
-        "eslint": "^8.11.0",
-        "eslint-config-prettier": "^8.5.0",
-        "eslint-plugin-simple-import-sort": "^7.0.0",
-        "husky": "^7.0.4",
+        "eslint": "^8.24.0",
+        "eslint-config-custom": "*",
+        "husky": "^8.0.1",
         "lerna": "^4.0.0",
         "prettier": "^2.6.0",
         "pretty-quick": "^3.1.3",
         "rimraf": "^3.0.2",
-        "turbo": "^1.1.5",
-        "typescript": "^4.6.4"
+        "turbo": "^1.5.5",
+        "typescript": "4.8.4"
       },
       "engines": {
         "node": ">=16.8.0",
@@ -2839,28 +2836,31 @@
       }
     },
     "node_modules/@eslint/eslintrc": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz",
-      "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz",
+      "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==",
       "dependencies": {
         "ajv": "^6.12.4",
         "debug": "^4.3.2",
-        "espree": "^9.3.1",
-        "globals": "^13.9.0",
+        "espree": "^9.4.0",
+        "globals": "^13.15.0",
         "ignore": "^5.2.0",
         "import-fresh": "^3.2.1",
         "js-yaml": "^4.1.0",
-        "minimatch": "^3.0.4",
+        "minimatch": "^3.1.2",
         "strip-json-comments": "^3.1.1"
       },
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
       }
     },
     "node_modules/@eslint/eslintrc/node_modules/globals": {
-      "version": "13.13.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz",
-      "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==",
+      "version": "13.17.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
+      "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
       "dependencies": {
         "type-fest": "^0.20.2"
       },
@@ -3627,9 +3627,9 @@
       }
     },
     "node_modules/@humanwhocodes/config-array": {
-      "version": "0.9.5",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
-      "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
+      "version": "0.10.7",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz",
+      "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==",
       "dependencies": {
         "@humanwhocodes/object-schema": "^1.2.1",
         "debug": "^4.1.1",
@@ -3639,6 +3639,18 @@
         "node": ">=10.10.0"
       }
     },
+    "node_modules/@humanwhocodes/module-importer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+      "engines": {
+        "node": ">=12.22"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
     "node_modules/@humanwhocodes/object-schema": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
@@ -9835,7 +9847,6 @@
       "version": "5.15.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.15.0.tgz",
       "integrity": "sha512-u6Db5JfF0Esn3tiAKELvoU5TpXVSkOpZ78cEGn/wXtT2RVqs2vkt4ge6N8cRCyw7YVKhmmLDbwI2pg92mlv7cA==",
-      "dev": true,
       "dependencies": {
         "@typescript-eslint/scope-manager": "5.15.0",
         "@typescript-eslint/type-utils": "5.15.0",
@@ -9868,7 +9879,6 @@
       "version": "7.3.5",
       "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
       "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
-      "dev": true,
       "dependencies": {
         "lru-cache": "^6.0.0"
       },
@@ -10005,7 +10015,6 @@
       "version": "5.15.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.15.0.tgz",
       "integrity": "sha512-NGAYP/+RDM2sVfmKiKOCgJYPstAO40vPAgACoWPO/+yoYKSgAXIFaBKsV8P0Cc7fwKgvj27SjRNX4L7f4/jCKQ==",
-      "dev": true,
       "dependencies": {
         "@typescript-eslint/scope-manager": "5.15.0",
         "@typescript-eslint/types": "5.15.0",
@@ -10032,7 +10041,6 @@
       "version": "5.15.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.15.0.tgz",
       "integrity": "sha512-EFiZcSKrHh4kWk0pZaa+YNJosvKE50EnmN4IfgjkA3bTHElPtYcd2U37QQkNTqwMCS7LXeDeZzEqnsOH8chjSg==",
-      "dev": true,
       "dependencies": {
         "@typescript-eslint/types": "5.15.0",
         "@typescript-eslint/visitor-keys": "5.15.0"
@@ -10049,7 +10057,6 @@
       "version": "5.15.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.15.0.tgz",
       "integrity": "sha512-KGeDoEQ7gHieLydujGEFLyLofipe9PIzfvA/41urz4hv+xVxPEbmMQonKSynZ0Ks2xDhJQ4VYjB3DnRiywvKDA==",
-      "dev": true,
       "dependencies": {
         "@typescript-eslint/utils": "5.15.0",
         "debug": "^4.3.2",
@@ -10075,7 +10082,6 @@
       "version": "5.15.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.15.0.tgz",
       "integrity": "sha512-yEiTN4MDy23vvsIksrShjNwQl2vl6kJeG9YkVJXjXZnkJElzVK8nfPsWKYxcsGWG8GhurYXP4/KGj3aZAxbeOA==",
-      "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       },
@@ -10088,7 +10094,6 @@
       "version": "5.15.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.15.0.tgz",
       "integrity": "sha512-Hb0e3dGc35b75xLzixM3cSbG1sSbrTBQDfIScqdyvrfJZVEi4XWAT+UL/HMxEdrJNB8Yk28SKxPLtAhfCbBInA==",
-      "dev": true,
       "dependencies": {
         "@typescript-eslint/types": "5.15.0",
         "@typescript-eslint/visitor-keys": "5.15.0",
@@ -10115,7 +10120,6 @@
       "version": "7.3.5",
       "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
       "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
-      "dev": true,
       "dependencies": {
         "lru-cache": "^6.0.0"
       },
@@ -10130,7 +10134,6 @@
       "version": "5.15.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.15.0.tgz",
       "integrity": "sha512-081rWu2IPKOgTOhHUk/QfxuFog8m4wxW43sXNOMSCdh578tGJ1PAaWPsj42LOa7pguh173tNlMigsbrHvh/mtA==",
-      "dev": true,
       "dependencies": {
         "@types/json-schema": "^7.0.9",
         "@typescript-eslint/scope-manager": "5.15.0",
@@ -10154,7 +10157,6 @@
       "version": "5.15.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.15.0.tgz",
       "integrity": "sha512-+vX5FKtgvyHbmIJdxMJ2jKm9z2BIlXJiuewI8dsDYMp5LzPUcuTT78Ya5iwvQg3VqSVdmxyM8Anj1Jeq7733ZQ==",
-      "dev": true,
       "dependencies": {
         "@typescript-eslint/types": "5.15.0",
         "eslint-visitor-keys": "^3.0.0"
@@ -10874,7 +10876,6 @@
       "version": "3.1.5",
       "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz",
       "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==",
-      "peer": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.4",
@@ -10939,7 +10940,6 @@
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz",
       "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==",
-      "peer": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
@@ -15476,7 +15476,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
       "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
-      "peer": true,
       "dependencies": {
         "has": "^1.0.3"
       }
@@ -16051,12 +16050,13 @@
       }
     },
     "node_modules/eslint": {
-      "version": "8.11.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz",
-      "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==",
+      "version": "8.25.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz",
+      "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==",
       "dependencies": {
-        "@eslint/eslintrc": "^1.2.1",
-        "@humanwhocodes/config-array": "^0.9.2",
+        "@eslint/eslintrc": "^1.3.3",
+        "@humanwhocodes/config-array": "^0.10.5",
+        "@humanwhocodes/module-importer": "^1.0.1",
         "ajv": "^6.10.0",
         "chalk": "^4.0.0",
         "cross-spawn": "^7.0.2",
@@ -16066,30 +16066,32 @@
         "eslint-scope": "^7.1.1",
         "eslint-utils": "^3.0.0",
         "eslint-visitor-keys": "^3.3.0",
-        "espree": "^9.3.1",
+        "espree": "^9.4.0",
         "esquery": "^1.4.0",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
         "file-entry-cache": "^6.0.1",
-        "functional-red-black-tree": "^1.0.1",
+        "find-up": "^5.0.0",
         "glob-parent": "^6.0.1",
-        "globals": "^13.6.0",
+        "globals": "^13.15.0",
+        "globby": "^11.1.0",
+        "grapheme-splitter": "^1.0.4",
         "ignore": "^5.2.0",
         "import-fresh": "^3.0.0",
         "imurmurhash": "^0.1.4",
         "is-glob": "^4.0.0",
+        "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.0.4",
+        "minimatch": "^3.1.2",
         "natural-compare": "^1.4.0",
         "optionator": "^0.9.1",
         "regexpp": "^3.2.0",
         "strip-ansi": "^6.0.1",
         "strip-json-comments": "^3.1.0",
-        "text-table": "^0.2.0",
-        "v8-compile-cache": "^2.0.3"
+        "text-table": "^0.2.0"
       },
       "bin": {
         "eslint": "bin/eslint.js"
@@ -16101,11 +16103,14 @@
         "url": "https://opencollective.com/eslint"
       }
     },
+    "node_modules/eslint-config-custom": {
+      "resolved": "packages/eslint-config-custom",
+      "link": true
+    },
     "node_modules/eslint-config-prettier": {
       "version": "8.5.0",
       "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz",
       "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==",
-      "dev": true,
       "bin": {
         "eslint-config-prettier": "bin/cli.js"
       },
@@ -16113,6 +16118,17 @@
         "eslint": ">=7.0.0"
       }
     },
+    "node_modules/eslint-config-turbo": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/eslint-config-turbo/-/eslint-config-turbo-0.0.4.tgz",
+      "integrity": "sha512-HErPS/wfWkSdV9Yd2dDkhZt3W2B78Ih/aWPFfaHmCMjzPalh+5KxRRGTf8MOBQLCebcWJX0lP1Zvc1rZIHlXGg==",
+      "dependencies": {
+        "eslint-plugin-turbo": "0.0.4"
+      },
+      "peerDependencies": {
+        "eslint": "^7.23.0 || ^8.0.0"
+      }
+    },
     "node_modules/eslint-import-resolver-node": {
       "version": "0.3.6",
       "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
@@ -16399,11 +16415,18 @@
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-7.0.0.tgz",
       "integrity": "sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw==",
-      "dev": true,
       "peerDependencies": {
         "eslint": ">=5.0.0"
       }
     },
+    "node_modules/eslint-plugin-turbo": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-0.0.4.tgz",
+      "integrity": "sha512-dfmYE/iPvoJInQq+5E/0mj140y/rYwKtzZkn3uVK8+nvwC5zmWKQ6ehMWrL4bYBkGzSgpOndZM+jOXhPQ2m8Cg==",
+      "peerDependencies": {
+        "eslint": "^7.23.0 || ^8.0.0"
+      }
+    },
     "node_modules/eslint-scope": {
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
@@ -16570,9 +16593,9 @@
       }
     },
     "node_modules/eslint/node_modules/globals": {
-      "version": "13.12.1",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz",
-      "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==",
+      "version": "13.17.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
+      "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
       "dependencies": {
         "type-fest": "^0.20.2"
       },
@@ -16603,16 +16626,19 @@
       }
     },
     "node_modules/espree": {
-      "version": "9.3.1",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz",
-      "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==",
+      "version": "9.4.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz",
+      "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==",
       "dependencies": {
-        "acorn": "^8.7.0",
-        "acorn-jsx": "^5.3.1",
+        "acorn": "^8.8.0",
+        "acorn-jsx": "^5.3.2",
         "eslint-visitor-keys": "^3.3.0"
       },
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
       }
     },
     "node_modules/esprima": {
@@ -17895,7 +17921,6 @@
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
       "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
-      "peer": true,
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -21063,6 +21088,11 @@
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
       "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ=="
     },
+    "node_modules/grapheme-splitter": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+      "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ=="
+    },
     "node_modules/graphql": {
       "version": "15.8.0",
       "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz",
@@ -21893,15 +21923,15 @@
       }
     },
     "node_modules/husky": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz",
-      "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==",
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.1.tgz",
+      "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==",
       "dev": true,
       "bin": {
         "husky": "lib/bin.js"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=14"
       },
       "funding": {
         "url": "https://github.com/sponsors/typicode"
@@ -25303,6 +25333,11 @@
       "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
       "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ=="
     },
+    "node_modules/js-sdsl": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz",
+      "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q=="
+    },
     "node_modules/js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -25528,7 +25563,6 @@
       "version": "3.3.3",
       "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz",
       "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==",
-      "peer": true,
       "dependencies": {
         "array-includes": "^3.1.5",
         "object.assign": "^4.1.3"
@@ -28152,7 +28186,6 @@
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz",
       "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==",
-      "peer": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
@@ -28166,7 +28199,6 @@
       "version": "2.0.5",
       "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz",
       "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==",
-      "peer": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
@@ -28200,7 +28232,6 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz",
       "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==",
-      "peer": true,
       "dependencies": {
         "define-properties": "^1.1.4",
         "es-abstract": "^1.19.5"
@@ -28226,7 +28257,6 @@
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
       "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
-      "peer": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
@@ -31888,7 +31918,6 @@
       "version": "1.4.3",
       "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
       "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
-      "peer": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
@@ -33940,7 +33969,6 @@
       "version": "4.0.7",
       "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz",
       "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==",
-      "peer": true,
       "dependencies": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
@@ -35675,33 +35703,27 @@
       }
     },
     "node_modules/turbo": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo/-/turbo-1.1.5.tgz",
-      "integrity": "sha512-jXW8G4lr01/E/jS/66LYpEjwWFQAksC8TxR8gi3VGea7OeNj28l8zmXoY3IgT5H22MBnhmtOKV/GhsbPjI2Jrg==",
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/turbo/-/turbo-1.5.5.tgz",
+      "integrity": "sha512-PVQSDl0STC9WXIyHcYUWs9gXsf8JjQig/FuHfuB8N6+XlgCGB3mPbfMEE6zrChGz2hufH4/guKRX1XJuNL6XTA==",
       "dev": true,
       "hasInstallScript": true,
       "bin": {
         "turbo": "bin/turbo"
       },
       "optionalDependencies": {
-        "turbo-darwin-64": "1.1.5",
-        "turbo-darwin-arm64": "1.1.5",
-        "turbo-freebsd-64": "1.1.5",
-        "turbo-freebsd-arm64": "1.1.5",
-        "turbo-linux-32": "1.1.5",
-        "turbo-linux-64": "1.1.5",
-        "turbo-linux-arm": "1.1.5",
-        "turbo-linux-arm64": "1.1.5",
-        "turbo-linux-mips64le": "1.1.5",
-        "turbo-linux-ppc64le": "1.1.5",
-        "turbo-windows-32": "1.1.5",
-        "turbo-windows-64": "1.1.5"
+        "turbo-darwin-64": "1.5.5",
+        "turbo-darwin-arm64": "1.5.5",
+        "turbo-linux-64": "1.5.5",
+        "turbo-linux-arm64": "1.5.5",
+        "turbo-windows-64": "1.5.5",
+        "turbo-windows-arm64": "1.5.5"
       }
     },
     "node_modules/turbo-darwin-64": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-1.1.5.tgz",
-      "integrity": "sha512-qdGMylQ408NmYhzuMmx+25W0iHFyFMRPO4579tDEv+WBiVDfAEYEzjajE4c+CQOLhd1aVEaPdSa+YhngQUgoDQ==",
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-1.5.5.tgz",
+      "integrity": "sha512-HvEn6P2B+NXDekq9LRpRgUjcT9/oygLTcK47U0qsAJZXRBSq/2hvD7lx4nAwgY/4W3rhYJeWtHTzbhoN6BXqGQ==",
       "cpu": [
         "x64"
       ],
@@ -35712,9 +35734,9 @@
       ]
     },
     "node_modules/turbo-darwin-arm64": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-1.1.5.tgz",
-      "integrity": "sha512-mXU324d3vYzxRT9FSSkW9yG2BvFosd0f4DUvqy4qms8wzM6Yv9Aeo4zZTL86rF88UYGUkbiRaPQUeceb/QARVg==",
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-1.5.5.tgz",
+      "integrity": "sha512-Dmxr09IUy6M0nc7/xWod9galIO2DD500B75sJSkHeT+CCdJOWnlinux0ZPF8CSygNqymwYO8AO2l15/6yxcycg==",
       "cpu": [
         "arm64"
       ],
@@ -35724,49 +35746,10 @@
         "darwin"
       ]
     },
-    "node_modules/turbo-freebsd-64": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-freebsd-64/-/turbo-freebsd-64-1.1.5.tgz",
-      "integrity": "sha512-qjjPTnZKOxw2x1Ito3yZAYDcwsCEg/5kYJwbPVvDn1jyXoxr3pUxTHUohroxQ6EmyxQ28qL7QpCVWDoQpDwrOQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "freebsd"
-      ]
-    },
-    "node_modules/turbo-freebsd-arm64": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-freebsd-arm64/-/turbo-freebsd-arm64-1.1.5.tgz",
-      "integrity": "sha512-jYW+Th9Y6yEYevaFe7v3lFQoxyrpd8wX5KuuvqLazMRbNxvKgqTDmT7AbCOGJY5ejzqGnMlTGkQr8c3g3B8ndA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "freebsd"
-      ]
-    },
-    "node_modules/turbo-linux-32": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-linux-32/-/turbo-linux-32-1.1.5.tgz",
-      "integrity": "sha512-c5I8tdR1jD8L8pJWk+rlO734bpWI1gwGdvNOaA/IGZxzOfDSn4CGoUErnUPgOadT8azi7lT9UPQf/pLfEvjCOw==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
     "node_modules/turbo-linux-64": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-1.1.5.tgz",
-      "integrity": "sha512-BZAxLfIkEtQa7u+VPYpdeVVJH6ab4WwXv4oCrUDaZf2BseDUxr57y2ASAWNFsg40T3oXXt4Kcbdc5LibjWQdtQ==",
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-1.5.5.tgz",
+      "integrity": "sha512-wd07TZ4zXXWjzZE00FcFMLmkybQQK/NV9ff66vvAV0vdiuacSMBCNLrD6Mm4ncfrUPW/rwFW5kU/7hyuEqqtDw==",
       "cpu": [
         "x64"
       ],
@@ -35776,23 +35759,10 @@
         "linux"
       ]
     },
-    "node_modules/turbo-linux-arm": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-linux-arm/-/turbo-linux-arm-1.1.5.tgz",
-      "integrity": "sha512-X6J05gQSWTc2c/TCkOQdFLhr35pUjEExY6K8yanYs2QKgd4GvDHmxYaBZ+6f90qcIUHYpe++adDPJcuAUv+8ug==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
     "node_modules/turbo-linux-arm64": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-1.1.5.tgz",
-      "integrity": "sha512-8/yz5L0B6Jb0pNcvx/08LcPswizqggxQ0zlFEw+Oh9RAC+ZM5+X2YiMyKolvLCpkoRqrlKku0lmXH7mx6DWbig==",
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-1.5.5.tgz",
+      "integrity": "sha512-q3q33tuo74R7gicnfvFbnZZvqmlq7Vakcvx0eshifnJw4PR+oMnTCb4w8ElVFx070zsb8DVTibq99y8NJH8T1Q==",
       "cpu": [
         "arm64"
       ],
@@ -35802,38 +35772,12 @@
         "linux"
       ]
     },
-    "node_modules/turbo-linux-mips64le": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-linux-mips64le/-/turbo-linux-mips64le-1.1.5.tgz",
-      "integrity": "sha512-K26bEFcLDGPkcaW7Eq4CMSxUbJf/x58aE92+0tONhrxXzamaBqTrSxPYlk/T8OoH7HxOvja2ctkpeI/NRAoIyw==",
-      "cpu": [
-        "mips64el"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/turbo-linux-ppc64le": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-linux-ppc64le/-/turbo-linux-ppc64le-1.1.5.tgz",
-      "integrity": "sha512-fr1/5yf8fe1BJiW/6Y9lmV+kxZZC3u3xvSBC5AXDSl9u3aJFZl96CRE9tOJbTZMaOVGxhplKD+EiHbjIxUnTrA==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/turbo-windows-32": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-windows-32/-/turbo-windows-32-1.1.5.tgz",
-      "integrity": "sha512-K9LdIgQXJ7jL0aLJS0l2asJAH/vYBFP7qFzODiAcJ1EeKBjYqAVnIxFQrUN07lzNDtL9WK/aN5q0bJCDnhwTQw==",
+    "node_modules/turbo-windows-64": {
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-1.5.5.tgz",
+      "integrity": "sha512-lPp9kHonNFfqgovbaW+UAPO5cLmoAN+m3G3FzqcrRPnlzt97vXYsDhDd/4Zy3oAKoAcprtP4CGy0ddisqsKTVw==",
       "cpu": [
-        "ia32"
+        "x64"
       ],
       "dev": true,
       "optional": true,
@@ -35841,12 +35785,12 @@
         "win32"
       ]
     },
-    "node_modules/turbo-windows-64": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-1.1.5.tgz",
-      "integrity": "sha512-c2Jkmw8yGZVz4opzEvB5HAf9XkA8CZBnorie46s44ec0FaNbcP9SCuUNvgAHxqDIHTGWC4A5PoPn0owkD3ss6A==",
+    "node_modules/turbo-windows-arm64": {
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-1.5.5.tgz",
+      "integrity": "sha512-3AfGULKNZiZVrEzsIE+W79ZRW1+f5r4nM4wLlJ1PTBHyRxBZdD6KTH1tijGfy/uTlcV5acYnKHEkDc6Q9PAXGQ==",
       "cpu": [
-        "x64"
+        "arm64"
       ],
       "dev": true,
       "optional": true,
@@ -35929,9 +35873,9 @@
       }
     },
     "node_modules/typescript": {
-      "version": "4.6.4",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz",
-      "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==",
+      "version": "4.8.4",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
+      "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
       "bin": {
         "tsc": "bin/tsc",
         "tsserver": "bin/tsserver"
@@ -36526,7 +36470,8 @@
     "node_modules/v8-compile-cache": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
-      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA=="
+      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+      "peer": true
     },
     "node_modules/v8-to-istanbul": {
       "version": "8.1.1",
@@ -38378,7 +38323,7 @@
         "jest": "^27.4.7",
         "nock": "^13.2.1",
         "ts-jest": "^27.1.3",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       },
       "engines": {
         "node": ">=14"
@@ -38414,6 +38359,7 @@
       "version": "4.9.0",
       "license": "MIT",
       "dependencies": {
+        "@clerk/common": "^0.0.1",
         "@clerk/types": "^3.10.1",
         "@emotion/cache": "^11.7.1",
         "@emotion/react": "^11.9.0",
@@ -38483,7 +38429,7 @@
         "ts-jest": "^27.1.3",
         "ts-loader": "^9.3.0",
         "type-fest": "^0.20.2",
-        "typescript": "^4.6.4",
+        "typescript": "*",
         "webpack": "^5.72.1",
         "webpack-bundle-analyzer": "^4.5.0",
         "webpack-cli": "^4.9.2",
@@ -38574,7 +38520,7 @@
         "@types/jest": "^27.4.0",
         "jest": "^27.4.7",
         "ts-jest": "^27.1.3",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       },
       "engines": {
         "node": ">=12"
@@ -38851,6 +38797,80 @@
         }
       }
     },
+    "packages/eslint-config-custom": {
+      "version": "0.0.0",
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/eslint-plugin": "^5.15.0",
+        "@typescript-eslint/parser": "^5.15.0",
+        "eslint-config-prettier": "^8.5.0",
+        "eslint-config-turbo": "latest",
+        "eslint-plugin-react": "7.28.0",
+        "eslint-plugin-simple-import-sort": "^7.0.0"
+      }
+    },
+    "packages/eslint-config-custom/node_modules/doctrine": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+      "dependencies": {
+        "esutils": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "packages/eslint-config-custom/node_modules/eslint-plugin-react": {
+      "version": "7.28.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz",
+      "integrity": "sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==",
+      "dependencies": {
+        "array-includes": "^3.1.4",
+        "array.prototype.flatmap": "^1.2.5",
+        "doctrine": "^2.1.0",
+        "estraverse": "^5.3.0",
+        "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+        "minimatch": "^3.0.4",
+        "object.entries": "^1.1.5",
+        "object.fromentries": "^2.0.5",
+        "object.hasown": "^1.1.0",
+        "object.values": "^1.1.5",
+        "prop-types": "^15.7.2",
+        "resolve": "^2.0.0-next.3",
+        "semver": "^6.3.0",
+        "string.prototype.matchall": "^4.0.6"
+      },
+      "engines": {
+        "node": ">=4"
+      },
+      "peerDependencies": {
+        "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+      }
+    },
+    "packages/eslint-config-custom/node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "packages/eslint-config-custom/node_modules/resolve": {
+      "version": "2.0.0-next.4",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
+      "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"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "packages/expo": {
       "name": "@clerk/clerk-expo",
       "version": "0.9.62",
@@ -38872,7 +38892,7 @@
         "react-dom": "17.0.2",
         "ts-jest": "^27.1.3",
         "tslib": "^2.3.1",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       },
       "engines": {
         "node": ">=14"
@@ -38899,7 +38919,7 @@
       "devDependencies": {
         "@types/cookie": "^0.5.0",
         "@types/node": "^16.11.55",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       },
       "engines": {
         "node": ">=16"
@@ -39003,7 +39023,7 @@
         "react": "17.0.2",
         "react-dom": "17.0.2",
         "ts-jest": "^27.1.3",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       },
       "engines": {
         "node": ">=14"
@@ -39340,7 +39360,7 @@
         "react": "17.0.2",
         "react-dom": "17.0.2",
         "ts-jest": "^27.1.3",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       },
       "engines": {
         "node": ">=14"
@@ -39376,7 +39396,7 @@
         "react": "17.0.2",
         "react-dom": "17.0.2",
         "ts-jest": "^27.1.3",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       },
       "engines": {
         "node": ">=16"
@@ -39434,7 +39454,7 @@
         "npm-run-all": "^4.1.5",
         "prettier": "^2.5.0",
         "ts-jest": "^27.1.3",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       },
       "engines": {
         "node": ">=14"
@@ -39517,7 +39537,7 @@
       "license": "MIT",
       "devDependencies": {
         "@clerk/types": "^3.10.1",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       },
       "engines": {
         "node": ">=14"
@@ -39537,7 +39557,7 @@
         "@types/jest": "^27.4.0",
         "jest": "^27.4.7",
         "ts-jest": "^27.1.3",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       },
       "engines": {
         "node": ">=14"
@@ -41012,7 +41032,7 @@
         "snakecase-keys": "^5.1.2",
         "ts-jest": "^27.1.3",
         "tslib": "^2.3.1",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       },
       "dependencies": {
         "@types/node": {
@@ -41039,7 +41059,7 @@
         "react-native-url-polyfill": "^1.3.0",
         "ts-jest": "^27.1.3",
         "tslib": "^2.3.1",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       },
       "dependencies": {
         "@types/node": {
@@ -41059,6 +41079,7 @@
         "@babel/preset-env": "^7.12.1",
         "@babel/preset-react": "^7.12.5",
         "@babel/preset-typescript": "^7.12.1",
+        "@clerk/common": "^0.0.1",
         "@clerk/shared": "^0.3.27",
         "@clerk/types": "^3.10.1",
         "@emotion/cache": "^11.7.1",
@@ -41120,7 +41141,7 @@
         "ts-jest": "^27.1.3",
         "ts-loader": "^9.3.0",
         "type-fest": "^0.20.2",
-        "typescript": "^4.6.4",
+        "typescript": "*",
         "webpack": "^5.72.1",
         "webpack-bundle-analyzer": "^4.5.0",
         "webpack-cli": "^4.9.2",
@@ -41188,7 +41209,7 @@
         "swr": "^1.3.0",
         "ts-jest": "^27.1.3",
         "tslib": "^2.3.1",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       },
       "dependencies": {
         "@types/node": {
@@ -41223,7 +41244,7 @@
         "snakecase-keys": "^3.2.1",
         "ts-jest": "^27.1.3",
         "tslib": "^2.3.1",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       },
       "dependencies": {
         "snakecase-keys": {
@@ -41256,7 +41277,7 @@
         "jest": "^27.4.7",
         "next": "^12.2.0",
         "ts-jest": "^27.1.3",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       },
       "dependencies": {
         "@next/env": {
@@ -41404,7 +41425,7 @@
         "react-dom": "17.0.2",
         "ts-jest": "^27.1.3",
         "tslib": "^2.3.1",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       },
       "dependencies": {
         "@next/env": {
@@ -41572,7 +41593,7 @@
         "react-dom": "17.0.2",
         "ts-jest": "^27.1.3",
         "tslib": "^2.3.1",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       },
       "dependencies": {
         "@types/cookie": {
@@ -41647,7 +41668,7 @@
       "version": "file:packages/themes",
       "requires": {
         "@clerk/types": "^3.10.1",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       }
     },
     "@clerk/types": {
@@ -41657,7 +41678,7 @@
         "csstype": "^3.1.0",
         "jest": "^27.4.7",
         "ts-jest": "^27.1.3",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       }
     },
     "@commitlint/cli": {
@@ -42188,25 +42209,25 @@
       "peer": true
     },
     "@eslint/eslintrc": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz",
-      "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz",
+      "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==",
       "requires": {
         "ajv": "^6.12.4",
         "debug": "^4.3.2",
-        "espree": "^9.3.1",
-        "globals": "^13.9.0",
+        "espree": "^9.4.0",
+        "globals": "^13.15.0",
         "ignore": "^5.2.0",
         "import-fresh": "^3.2.1",
         "js-yaml": "^4.1.0",
-        "minimatch": "^3.0.4",
+        "minimatch": "^3.1.2",
         "strip-json-comments": "^3.1.1"
       },
       "dependencies": {
         "globals": {
-          "version": "13.13.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz",
-          "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==",
+          "version": "13.17.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
+          "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
           "requires": {
             "type-fest": "^0.20.2"
           }
@@ -42846,15 +42867,20 @@
       }
     },
     "@humanwhocodes/config-array": {
-      "version": "0.9.5",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
-      "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
+      "version": "0.10.7",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz",
+      "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==",
       "requires": {
         "@humanwhocodes/object-schema": "^1.2.1",
         "debug": "^4.1.1",
         "minimatch": "^3.0.4"
       }
     },
+    "@humanwhocodes/module-importer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="
+    },
     "@humanwhocodes/object-schema": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
@@ -47608,7 +47634,6 @@
       "version": "5.15.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.15.0.tgz",
       "integrity": "sha512-u6Db5JfF0Esn3tiAKELvoU5TpXVSkOpZ78cEGn/wXtT2RVqs2vkt4ge6N8cRCyw7YVKhmmLDbwI2pg92mlv7cA==",
-      "dev": true,
       "requires": {
         "@typescript-eslint/scope-manager": "5.15.0",
         "@typescript-eslint/type-utils": "5.15.0",
@@ -47625,7 +47650,6 @@
           "version": "7.3.5",
           "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
           "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
-          "dev": true,
           "requires": {
             "lru-cache": "^6.0.0"
           }
@@ -47708,7 +47732,6 @@
       "version": "5.15.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.15.0.tgz",
       "integrity": "sha512-NGAYP/+RDM2sVfmKiKOCgJYPstAO40vPAgACoWPO/+yoYKSgAXIFaBKsV8P0Cc7fwKgvj27SjRNX4L7f4/jCKQ==",
-      "dev": true,
       "requires": {
         "@typescript-eslint/scope-manager": "5.15.0",
         "@typescript-eslint/types": "5.15.0",
@@ -47720,7 +47743,6 @@
       "version": "5.15.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.15.0.tgz",
       "integrity": "sha512-EFiZcSKrHh4kWk0pZaa+YNJosvKE50EnmN4IfgjkA3bTHElPtYcd2U37QQkNTqwMCS7LXeDeZzEqnsOH8chjSg==",
-      "dev": true,
       "requires": {
         "@typescript-eslint/types": "5.15.0",
         "@typescript-eslint/visitor-keys": "5.15.0"
@@ -47730,7 +47752,6 @@
       "version": "5.15.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.15.0.tgz",
       "integrity": "sha512-KGeDoEQ7gHieLydujGEFLyLofipe9PIzfvA/41urz4hv+xVxPEbmMQonKSynZ0Ks2xDhJQ4VYjB3DnRiywvKDA==",
-      "dev": true,
       "requires": {
         "@typescript-eslint/utils": "5.15.0",
         "debug": "^4.3.2",
@@ -47740,14 +47761,12 @@
     "@typescript-eslint/types": {
       "version": "5.15.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.15.0.tgz",
-      "integrity": "sha512-yEiTN4MDy23vvsIksrShjNwQl2vl6kJeG9YkVJXjXZnkJElzVK8nfPsWKYxcsGWG8GhurYXP4/KGj3aZAxbeOA==",
-      "dev": true
+      "integrity": "sha512-yEiTN4MDy23vvsIksrShjNwQl2vl6kJeG9YkVJXjXZnkJElzVK8nfPsWKYxcsGWG8GhurYXP4/KGj3aZAxbeOA=="
     },
     "@typescript-eslint/typescript-estree": {
       "version": "5.15.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.15.0.tgz",
       "integrity": "sha512-Hb0e3dGc35b75xLzixM3cSbG1sSbrTBQDfIScqdyvrfJZVEi4XWAT+UL/HMxEdrJNB8Yk28SKxPLtAhfCbBInA==",
-      "dev": true,
       "requires": {
         "@typescript-eslint/types": "5.15.0",
         "@typescript-eslint/visitor-keys": "5.15.0",
@@ -47762,7 +47781,6 @@
           "version": "7.3.5",
           "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
           "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
-          "dev": true,
           "requires": {
             "lru-cache": "^6.0.0"
           }
@@ -47773,7 +47791,6 @@
       "version": "5.15.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.15.0.tgz",
       "integrity": "sha512-081rWu2IPKOgTOhHUk/QfxuFog8m4wxW43sXNOMSCdh578tGJ1PAaWPsj42LOa7pguh173tNlMigsbrHvh/mtA==",
-      "dev": true,
       "requires": {
         "@types/json-schema": "^7.0.9",
         "@typescript-eslint/scope-manager": "5.15.0",
@@ -47787,7 +47804,6 @@
       "version": "5.15.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.15.0.tgz",
       "integrity": "sha512-+vX5FKtgvyHbmIJdxMJ2jKm9z2BIlXJiuewI8dsDYMp5LzPUcuTT78Ya5iwvQg3VqSVdmxyM8Anj1Jeq7733ZQ==",
-      "dev": true,
       "requires": {
         "@typescript-eslint/types": "5.15.0",
         "eslint-visitor-keys": "^3.0.0"
@@ -48371,7 +48387,6 @@
       "version": "3.1.5",
       "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz",
       "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==",
-      "peer": true,
       "requires": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.4",
@@ -48415,7 +48430,6 @@
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz",
       "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==",
-      "peer": true,
       "requires": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
@@ -51962,7 +51976,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
       "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
-      "peer": true,
       "requires": {
         "has": "^1.0.3"
       }
@@ -52306,12 +52319,13 @@
       }
     },
     "eslint": {
-      "version": "8.11.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz",
-      "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==",
+      "version": "8.25.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz",
+      "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==",
       "requires": {
-        "@eslint/eslintrc": "^1.2.1",
-        "@humanwhocodes/config-array": "^0.9.2",
+        "@eslint/eslintrc": "^1.3.3",
+        "@humanwhocodes/config-array": "^0.10.5",
+        "@humanwhocodes/module-importer": "^1.0.1",
         "ajv": "^6.10.0",
         "chalk": "^4.0.0",
         "cross-spawn": "^7.0.2",
@@ -52321,30 +52335,32 @@
         "eslint-scope": "^7.1.1",
         "eslint-utils": "^3.0.0",
         "eslint-visitor-keys": "^3.3.0",
-        "espree": "^9.3.1",
+        "espree": "^9.4.0",
         "esquery": "^1.4.0",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
         "file-entry-cache": "^6.0.1",
-        "functional-red-black-tree": "^1.0.1",
+        "find-up": "^5.0.0",
         "glob-parent": "^6.0.1",
-        "globals": "^13.6.0",
+        "globals": "^13.15.0",
+        "globby": "^11.1.0",
+        "grapheme-splitter": "^1.0.4",
         "ignore": "^5.2.0",
         "import-fresh": "^3.0.0",
         "imurmurhash": "^0.1.4",
         "is-glob": "^4.0.0",
+        "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.0.4",
+        "minimatch": "^3.1.2",
         "natural-compare": "^1.4.0",
         "optionator": "^0.9.1",
         "regexpp": "^3.2.0",
         "strip-ansi": "^6.0.1",
         "strip-json-comments": "^3.1.0",
-        "text-table": "^0.2.0",
-        "v8-compile-cache": "^2.0.3"
+        "text-table": "^0.2.0"
       },
       "dependencies": {
         "ansi-styles": {
@@ -52397,9 +52413,9 @@
           "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
         },
         "globals": {
-          "version": "13.12.1",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz",
-          "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==",
+          "version": "13.17.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
+          "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
           "requires": {
             "type-fest": "^0.20.2"
           }
@@ -52419,13 +52435,77 @@
         }
       }
     },
+    "eslint-config-custom": {
+      "version": "file:packages/eslint-config-custom",
+      "requires": {
+        "@typescript-eslint/eslint-plugin": "^5.15.0",
+        "@typescript-eslint/parser": "^5.15.0",
+        "eslint-config-prettier": "^8.5.0",
+        "eslint-config-turbo": "latest",
+        "eslint-plugin-react": "7.28.0",
+        "eslint-plugin-simple-import-sort": "^7.0.0"
+      },
+      "dependencies": {
+        "doctrine": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+          "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+          "requires": {
+            "esutils": "^2.0.2"
+          }
+        },
+        "eslint-plugin-react": {
+          "version": "7.28.0",
+          "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz",
+          "integrity": "sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==",
+          "requires": {
+            "array-includes": "^3.1.4",
+            "array.prototype.flatmap": "^1.2.5",
+            "doctrine": "^2.1.0",
+            "estraverse": "^5.3.0",
+            "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+            "minimatch": "^3.0.4",
+            "object.entries": "^1.1.5",
+            "object.fromentries": "^2.0.5",
+            "object.hasown": "^1.1.0",
+            "object.values": "^1.1.5",
+            "prop-types": "^15.7.2",
+            "resolve": "^2.0.0-next.3",
+            "semver": "^6.3.0",
+            "string.prototype.matchall": "^4.0.6"
+          }
+        },
+        "estraverse": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
+        },
+        "resolve": {
+          "version": "2.0.0-next.4",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
+          "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
+          "requires": {
+            "is-core-module": "^2.9.0",
+            "path-parse": "^1.0.7",
+            "supports-preserve-symlinks-flag": "^1.0.0"
+          }
+        }
+      }
+    },
     "eslint-config-prettier": {
       "version": "8.5.0",
       "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz",
       "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==",
-      "dev": true,
       "requires": {}
     },
+    "eslint-config-turbo": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/eslint-config-turbo/-/eslint-config-turbo-0.0.4.tgz",
+      "integrity": "sha512-HErPS/wfWkSdV9Yd2dDkhZt3W2B78Ih/aWPFfaHmCMjzPalh+5KxRRGTf8MOBQLCebcWJX0lP1Zvc1rZIHlXGg==",
+      "requires": {
+        "eslint-plugin-turbo": "0.0.4"
+      }
+    },
     "eslint-import-resolver-node": {
       "version": "0.3.6",
       "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
@@ -52660,7 +52740,12 @@
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-7.0.0.tgz",
       "integrity": "sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw==",
-      "dev": true,
+      "requires": {}
+    },
+    "eslint-plugin-turbo": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-0.0.4.tgz",
+      "integrity": "sha512-dfmYE/iPvoJInQq+5E/0mj140y/rYwKtzZkn3uVK8+nvwC5zmWKQ6ehMWrL4bYBkGzSgpOndZM+jOXhPQ2m8Cg==",
       "requires": {}
     },
     "eslint-scope": {
@@ -52725,12 +52810,12 @@
       }
     },
     "espree": {
-      "version": "9.3.1",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz",
-      "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==",
+      "version": "9.4.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz",
+      "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==",
       "requires": {
-        "acorn": "^8.7.0",
-        "acorn-jsx": "^5.3.1",
+        "acorn": "^8.8.0",
+        "acorn-jsx": "^5.3.2",
         "eslint-visitor-keys": "^3.3.0"
       }
     },
@@ -53708,8 +53793,7 @@
     "functions-have-names": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
-      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
-      "peer": true
+      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
     },
     "gatsby": {
       "version": "4.20.0",
@@ -55542,7 +55626,7 @@
         "@types/node": "^16.11.55",
         "cookie": "^0.5.0",
         "tslib": "^2.3.1",
-        "typescript": "^4.6.4"
+        "typescript": "*"
       },
       "dependencies": {
         "@clerk/backend-core": {
@@ -56203,6 +56287,11 @@
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
       "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ=="
     },
+    "grapheme-splitter": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+      "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ=="
+    },
     "graphql": {
       "version": "15.8.0",
       "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz",
@@ -56853,9 +56942,9 @@
       }
     },
     "husky": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz",
-      "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==",
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.1.tgz",
+      "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==",
       "dev": true
     },
     "iconv-lite": {
@@ -59390,6 +59479,11 @@
       "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
       "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ=="
     },
+    "js-sdsl": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz",
+      "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q=="
+    },
     "js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -59570,7 +59664,6 @@
       "version": "3.3.3",
       "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz",
       "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==",
-      "peer": true,
       "requires": {
         "array-includes": "^3.1.5",
         "object.assign": "^4.1.3"
@@ -61671,7 +61764,6 @@
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz",
       "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==",
-      "peer": true,
       "requires": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
@@ -61682,7 +61774,6 @@
       "version": "2.0.5",
       "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz",
       "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==",
-      "peer": true,
       "requires": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
@@ -61704,7 +61795,6 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz",
       "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==",
-      "peer": true,
       "requires": {
         "define-properties": "^1.1.4",
         "es-abstract": "^1.19.5"
@@ -61724,7 +61814,6 @@
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
       "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
-      "peer": true,
       "requires": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
@@ -64441,7 +64530,6 @@
       "version": "1.4.3",
       "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
       "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
-      "peer": true,
       "requires": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
@@ -66056,7 +66144,6 @@
       "version": "4.0.7",
       "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz",
       "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==",
-      "peer": true,
       "requires": {
         "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
@@ -67226,106 +67313,58 @@
       }
     },
     "turbo": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo/-/turbo-1.1.5.tgz",
-      "integrity": "sha512-jXW8G4lr01/E/jS/66LYpEjwWFQAksC8TxR8gi3VGea7OeNj28l8zmXoY3IgT5H22MBnhmtOKV/GhsbPjI2Jrg==",
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/turbo/-/turbo-1.5.5.tgz",
+      "integrity": "sha512-PVQSDl0STC9WXIyHcYUWs9gXsf8JjQig/FuHfuB8N6+XlgCGB3mPbfMEE6zrChGz2hufH4/guKRX1XJuNL6XTA==",
       "dev": true,
       "requires": {
-        "turbo-darwin-64": "1.1.5",
-        "turbo-darwin-arm64": "1.1.5",
-        "turbo-freebsd-64": "1.1.5",
-        "turbo-freebsd-arm64": "1.1.5",
-        "turbo-linux-32": "1.1.5",
-        "turbo-linux-64": "1.1.5",
-        "turbo-linux-arm": "1.1.5",
-        "turbo-linux-arm64": "1.1.5",
-        "turbo-linux-mips64le": "1.1.5",
-        "turbo-linux-ppc64le": "1.1.5",
-        "turbo-windows-32": "1.1.5",
-        "turbo-windows-64": "1.1.5"
+        "turbo-darwin-64": "1.5.5",
+        "turbo-darwin-arm64": "1.5.5",
+        "turbo-linux-64": "1.5.5",
+        "turbo-linux-arm64": "1.5.5",
+        "turbo-windows-64": "1.5.5",
+        "turbo-windows-arm64": "1.5.5"
       }
     },
     "turbo-darwin-64": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-1.1.5.tgz",
-      "integrity": "sha512-qdGMylQ408NmYhzuMmx+25W0iHFyFMRPO4579tDEv+WBiVDfAEYEzjajE4c+CQOLhd1aVEaPdSa+YhngQUgoDQ==",
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-1.5.5.tgz",
+      "integrity": "sha512-HvEn6P2B+NXDekq9LRpRgUjcT9/oygLTcK47U0qsAJZXRBSq/2hvD7lx4nAwgY/4W3rhYJeWtHTzbhoN6BXqGQ==",
       "dev": true,
       "optional": true
     },
     "turbo-darwin-arm64": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-1.1.5.tgz",
-      "integrity": "sha512-mXU324d3vYzxRT9FSSkW9yG2BvFosd0f4DUvqy4qms8wzM6Yv9Aeo4zZTL86rF88UYGUkbiRaPQUeceb/QARVg==",
-      "dev": true,
-      "optional": true
-    },
-    "turbo-freebsd-64": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-freebsd-64/-/turbo-freebsd-64-1.1.5.tgz",
-      "integrity": "sha512-qjjPTnZKOxw2x1Ito3yZAYDcwsCEg/5kYJwbPVvDn1jyXoxr3pUxTHUohroxQ6EmyxQ28qL7QpCVWDoQpDwrOQ==",
-      "dev": true,
-      "optional": true
-    },
-    "turbo-freebsd-arm64": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-freebsd-arm64/-/turbo-freebsd-arm64-1.1.5.tgz",
-      "integrity": "sha512-jYW+Th9Y6yEYevaFe7v3lFQoxyrpd8wX5KuuvqLazMRbNxvKgqTDmT7AbCOGJY5ejzqGnMlTGkQr8c3g3B8ndA==",
-      "dev": true,
-      "optional": true
-    },
-    "turbo-linux-32": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-linux-32/-/turbo-linux-32-1.1.5.tgz",
-      "integrity": "sha512-c5I8tdR1jD8L8pJWk+rlO734bpWI1gwGdvNOaA/IGZxzOfDSn4CGoUErnUPgOadT8azi7lT9UPQf/pLfEvjCOw==",
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-1.5.5.tgz",
+      "integrity": "sha512-Dmxr09IUy6M0nc7/xWod9galIO2DD500B75sJSkHeT+CCdJOWnlinux0ZPF8CSygNqymwYO8AO2l15/6yxcycg==",
       "dev": true,
       "optional": true
     },
     "turbo-linux-64": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-1.1.5.tgz",
-      "integrity": "sha512-BZAxLfIkEtQa7u+VPYpdeVVJH6ab4WwXv4oCrUDaZf2BseDUxr57y2ASAWNFsg40T3oXXt4Kcbdc5LibjWQdtQ==",
-      "dev": true,
-      "optional": true
-    },
-    "turbo-linux-arm": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-linux-arm/-/turbo-linux-arm-1.1.5.tgz",
-      "integrity": "sha512-X6J05gQSWTc2c/TCkOQdFLhr35pUjEExY6K8yanYs2QKgd4GvDHmxYaBZ+6f90qcIUHYpe++adDPJcuAUv+8ug==",
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-1.5.5.tgz",
+      "integrity": "sha512-wd07TZ4zXXWjzZE00FcFMLmkybQQK/NV9ff66vvAV0vdiuacSMBCNLrD6Mm4ncfrUPW/rwFW5kU/7hyuEqqtDw==",
       "dev": true,
       "optional": true
     },
     "turbo-linux-arm64": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-1.1.5.tgz",
-      "integrity": "sha512-8/yz5L0B6Jb0pNcvx/08LcPswizqggxQ0zlFEw+Oh9RAC+ZM5+X2YiMyKolvLCpkoRqrlKku0lmXH7mx6DWbig==",
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-1.5.5.tgz",
+      "integrity": "sha512-q3q33tuo74R7gicnfvFbnZZvqmlq7Vakcvx0eshifnJw4PR+oMnTCb4w8ElVFx070zsb8DVTibq99y8NJH8T1Q==",
       "dev": true,
       "optional": true
     },
-    "turbo-linux-mips64le": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-linux-mips64le/-/turbo-linux-mips64le-1.1.5.tgz",
-      "integrity": "sha512-K26bEFcLDGPkcaW7Eq4CMSxUbJf/x58aE92+0tONhrxXzamaBqTrSxPYlk/T8OoH7HxOvja2ctkpeI/NRAoIyw==",
-      "dev": true,
-      "optional": true
-    },
-    "turbo-linux-ppc64le": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-linux-ppc64le/-/turbo-linux-ppc64le-1.1.5.tgz",
-      "integrity": "sha512-fr1/5yf8fe1BJiW/6Y9lmV+kxZZC3u3xvSBC5AXDSl9u3aJFZl96CRE9tOJbTZMaOVGxhplKD+EiHbjIxUnTrA==",
-      "dev": true,
-      "optional": true
-    },
-    "turbo-windows-32": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-windows-32/-/turbo-windows-32-1.1.5.tgz",
-      "integrity": "sha512-K9LdIgQXJ7jL0aLJS0l2asJAH/vYBFP7qFzODiAcJ1EeKBjYqAVnIxFQrUN07lzNDtL9WK/aN5q0bJCDnhwTQw==",
+    "turbo-windows-64": {
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-1.5.5.tgz",
+      "integrity": "sha512-lPp9kHonNFfqgovbaW+UAPO5cLmoAN+m3G3FzqcrRPnlzt97vXYsDhDd/4Zy3oAKoAcprtP4CGy0ddisqsKTVw==",
       "dev": true,
       "optional": true
     },
-    "turbo-windows-64": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-1.1.5.tgz",
-      "integrity": "sha512-c2Jkmw8yGZVz4opzEvB5HAf9XkA8CZBnorie46s44ec0FaNbcP9SCuUNvgAHxqDIHTGWC4A5PoPn0owkD3ss6A==",
+    "turbo-windows-arm64": {
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-1.5.5.tgz",
+      "integrity": "sha512-3AfGULKNZiZVrEzsIE+W79ZRW1+f5r4nM4wLlJ1PTBHyRxBZdD6KTH1tijGfy/uTlcV5acYnKHEkDc6Q9PAXGQ==",
       "dev": true,
       "optional": true
     },
@@ -67389,9 +67428,9 @@
       }
     },
     "typescript": {
-      "version": "4.6.4",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz",
-      "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg=="
+      "version": "4.8.4",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
+      "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ=="
     },
     "ua-parser-js": {
       "version": "0.7.31",
@@ -67835,7 +67874,8 @@
     "v8-compile-cache": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
-      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA=="
+      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+      "peer": true
     },
     "v8-to-istanbul": {
       "version": "8.1.1",
diff --git a/package.json b/package.json
index 059f3178486..064946ccef0 100644
--- a/package.json
+++ b/package.json
@@ -26,10 +26,11 @@
     "pretty-quick": "^3.1.3",
     "rimraf": "^3.0.2",
     "turbo": "^1.5.5",
-    "typescript": "^4.6.4"
+    "typescript": "4.8.4"
   },
   "scripts": {
-    "dev": "turbo dev --filter=!@clerk/expo",
+    "dev": "turbo dev --filter=@clerk/* --filter=!@clerk/expo",
+    "dev:playground": "echo 'Not ready for use yet' && exit 1 && turbo dev --filter=@playground/*",
     "build": "turbo build --concurrency=${TURBO_CONCURRENCY:-2}",
     "test": "turbo test --concurrency=${TURBO_CONCURRENCY:-2}",
     "clean": "turbo clean",
@@ -44,7 +45,6 @@
     "prerelease": "npx rimraf packages/*/dist && turbo run build test --concurrency=${TURBO_CONCURRENCY:-2}",
     "release:next": "lerna publish from-package --dist-tag next",
     "version": "./scripts/version-info.sh",
-    "lerna": "lerna",
     "nuke": "rm -r node_modules; for d in packages/*/node_modules; do echo $d; rm -r $d; done",
     "yalc:all": "for d in packages/*/; do echo $d; cd $d; yalc push --replace; cd '../../'; done",
     "prepare": "husky install"
diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json
index 76344ec8411..d7882493cca 100644
--- a/packages/backend-core/package.json
+++ b/packages/backend-core/package.json
@@ -28,7 +28,7 @@
     "jest": "^27.4.7",
     "nock": "^13.2.1",
     "ts-jest": "^27.1.3",
-    "typescript": "^4.6.4"
+    "typescript": "*"
   },
   "publishConfig": {
     "access": "public"
diff --git a/packages/backend-core/tsconfig.json b/packages/backend-core/tsconfig.json
index b5d6ae5dc28..145d275b1dc 100644
--- a/packages/backend-core/tsconfig.json
+++ b/packages/backend-core/tsconfig.json
@@ -14,7 +14,8 @@
     "resolveJsonModule": true,
     "sourceMap": false,
     "strict": true,
-    "target": "ES2020"
+    "target": "ES2020",
+    "skipLibCheck": true
   },
   "include": ["src"],
   "exclude": ["node_modules", "dist", "src/**/*.spec.ts", "src/**/*.test.ts", "src/__tests__"]
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index c2c90f8b661..2cf85f50fbf 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -108,7 +108,7 @@
     "ts-jest": "^27.1.3",
     "ts-loader": "^9.3.0",
     "type-fest": "^0.20.2",
-    "typescript": "^4.6.4",
+    "typescript": "*",
     "webpack": "^5.72.1",
     "webpack-bundle-analyzer": "^4.5.0",
     "webpack-cli": "^4.9.2",
diff --git a/packages/clerk-js/src/ui/contexts/CoreSessionContext.tsx b/packages/clerk-js/src/ui/contexts/CoreSessionContext.tsx
index 47f860c1708..dcd6539e28f 100644
--- a/packages/clerk-js/src/ui/contexts/CoreSessionContext.tsx
+++ b/packages/clerk-js/src/ui/contexts/CoreSessionContext.tsx
@@ -31,7 +31,7 @@ export function withCoreSessionSwitchGuard<P>(Component: React.ComponentType<P>)
     if (context.value === undefined) {
       return null;
     }
-    return <Component {...props} />;
+    return <Component {...(props as any)} />;
   };
 
   const displayName = Component.displayName || Component.name || 'Component';
diff --git a/packages/clerk-js/src/ui/contexts/CoreUserContext.tsx b/packages/clerk-js/src/ui/contexts/CoreUserContext.tsx
index 808f42ffa65..8ddb62ff677 100644
--- a/packages/clerk-js/src/ui/contexts/CoreUserContext.tsx
+++ b/packages/clerk-js/src/ui/contexts/CoreUserContext.tsx
@@ -25,7 +25,7 @@ export function withCoreUserGuard<P>(Component: React.ComponentType<P>): React.C
     if (!user) {
       return null;
     }
-    return <Component {...props} />;
+    return <Component {...(props as any)} />;
   };
 
   const displayName = Component.displayName || Component.name || 'Component';
diff --git a/packages/clerk-js/src/ui/hooks/useSupportEmail.test.tsx b/packages/clerk-js/src/ui/hooks/useSupportEmail.test.tsx
index ec3d2d3a280..11454ee7684 100644
--- a/packages/clerk-js/src/ui/hooks/useSupportEmail.test.tsx
+++ b/packages/clerk-js/src/ui/hooks/useSupportEmail.test.tsx
@@ -1,4 +1,4 @@
-import { renderHook } from '@clerk/common/testUtils';
+import { renderHook } from '@clerk/shared/testUtils';
 
 import { useSupportEmail } from './useSupportEmail';
 
diff --git a/packages/edge/package.json b/packages/edge/package.json
index 8cbdd8246eb..589605f774a 100644
--- a/packages/edge/package.json
+++ b/packages/edge/package.json
@@ -54,7 +54,7 @@
     "@types/jest": "^27.4.0",
     "jest": "^27.4.7",
     "ts-jest": "^27.1.3",
-    "typescript": "^4.6.4"
+    "typescript": "*"
   },
   "repository": {
     "type": "git",
diff --git a/packages/edge/src/vercel-edge/types.ts b/packages/edge/src/vercel-edge/types.ts
index a31e84b4aa0..3a7669c296c 100644
--- a/packages/edge/src/vercel-edge/types.ts
+++ b/packages/edge/src/vercel-edge/types.ts
@@ -10,12 +10,12 @@ export type WithEdgeMiddlewareAuthOptions = {
   strict?: boolean;
 };
 
-export type WithEdgeMiddlewareAuthCallback<Return, Options> = (
+export type WithEdgeMiddlewareAuthCallback<Return, Options extends WithEdgeMiddlewareAuthOptions> = (
   req: RequestWithAuth<Options>,
   event: NextFetchEvent,
 ) => Return;
 
-export type WithEdgeMiddlewareAuthMiddlewareResult<CallbackReturn, Options> = (
+export type WithEdgeMiddlewareAuthMiddlewareResult<CallbackReturn, Options extends WithEdgeMiddlewareAuthOptions> = (
   req: RequestWithAuth<Options>,
   event: NextFetchEvent,
 ) => Promise<Awaited<CallbackReturn>>;
@@ -30,7 +30,7 @@ export type RequestWithAuth<Options extends WithEdgeMiddlewareAuthOptions = any>
 type NextMiddlewareReturnOptions = NextResponse | Response | null | undefined;
 export type NextMiddlewareResult = NextMiddlewareReturnOptions;
 
-export type WithAuthNextMiddlewareHandler<Options> = (
+export type WithAuthNextMiddlewareHandler<Options extends WithEdgeMiddlewareAuthOptions> = (
   req: RequestWithAuth<Options>,
   event: NextFetchEvent,
 ) => NextMiddlewareResult | Promise<NextMiddlewareResult>;
diff --git a/packages/expo/package.json b/packages/expo/package.json
index c2016c3047d..6a18a01f5ec 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -43,7 +43,7 @@
     "react-dom": "17.0.2",
     "ts-jest": "^27.1.3",
     "tslib": "^2.3.1",
-    "typescript": "^4.6.4"
+    "typescript": "*"
   },
   "peerDependencies": {
     "react": ">=16"
diff --git a/packages/gatsby-plugin-clerk/package.json b/packages/gatsby-plugin-clerk/package.json
index 31342231ce0..b356f53864b 100644
--- a/packages/gatsby-plugin-clerk/package.json
+++ b/packages/gatsby-plugin-clerk/package.json
@@ -41,7 +41,7 @@
   "devDependencies": {
     "@types/cookie": "^0.5.0",
     "@types/node": "^16.11.55",
-    "typescript": "^4.6.4"
+    "typescript": "*"
   },
   "peerDependencies": {
     "gatsby": "^4.0.0"
diff --git a/packages/gatsby-plugin-clerk/src/ssr/types.ts b/packages/gatsby-plugin-clerk/src/ssr/types.ts
index 7fe6ea7325d..e870ff5497f 100644
--- a/packages/gatsby-plugin-clerk/src/ssr/types.ts
+++ b/packages/gatsby-plugin-clerk/src/ssr/types.ts
@@ -9,7 +9,9 @@ export type GetServerDataPropsWithAuth<Options extends WithServerAuthOptions = a
 } & (Options extends { loadSession: true } ? { session: Session | null } : {}) &
   (Options extends { loadUser: true } ? { user: User | null } : {});
 
-export type WithServerAuthCallback<Return, Options> = (props: GetServerDataPropsWithAuth<Options>) => Return;
+export type WithServerAuthCallback<Return, Options extends WithServerAuthOptions> = (
+  props: GetServerDataPropsWithAuth<Options>,
+) => Return;
 
 export type WithServerAuthOptions = {
   loadUser?: boolean;
diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json
index 7187939f639..2f0a03e8978 100644
--- a/packages/nextjs/package.json
+++ b/packages/nextjs/package.json
@@ -51,7 +51,7 @@
     "react": "17.0.2",
     "react-dom": "17.0.2",
     "ts-jest": "^27.1.3",
-    "typescript": "^4.6.4"
+    "typescript": "*"
   },
   "peerDependencies": {
     "next": ">=10"
diff --git a/packages/nextjs/src/middleware/types.ts b/packages/nextjs/src/middleware/types.ts
index 66c55037e2e..6855bc7dfcf 100644
--- a/packages/nextjs/src/middleware/types.ts
+++ b/packages/nextjs/src/middleware/types.ts
@@ -13,7 +13,9 @@ export type WithServerSideAuthOptions = {
   authorizedParties?: string[];
 };
 
-export type WithServerSideAuthCallback<Return, Options> = (context: ContextWithAuth<Options>) => Return;
+export type WithServerSideAuthCallback<Return, Options extends WithServerSideAuthOptions> = (
+  context: ContextWithAuth<Options>,
+) => Return;
 
 export type WithServerSideAuthResult<CallbackReturn> = (
   context: GetServerSidePropsContext,
diff --git a/packages/react/package.json b/packages/react/package.json
index 673b517ae76..2547e6b46a4 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -50,7 +50,7 @@
     "react": "17.0.2",
     "react-dom": "17.0.2",
     "ts-jest": "^27.1.3",
-    "typescript": "^4.6.4"
+    "typescript": "*"
   },
   "peerDependencies": {
     "react": ">=16"
diff --git a/packages/react/src/utils/useMaxAllowedInstancesGuard.tsx b/packages/react/src/utils/useMaxAllowedInstancesGuard.tsx
index 71e902167bb..cd2c223c12a 100644
--- a/packages/react/src/utils/useMaxAllowedInstancesGuard.tsx
+++ b/packages/react/src/utils/useMaxAllowedInstancesGuard.tsx
@@ -24,7 +24,7 @@ export function withMaxAllowedInstancesGuard<P>(
   const displayName = WrappedComponent.displayName || WrappedComponent.name || name || 'Component';
   const Hoc = (props: P) => {
     useMaxAllowedInstancesGuard(name, error);
-    return <WrappedComponent {...props} />;
+    return <WrappedComponent {...(props as any)} />;
   };
   Hoc.displayName = `withMaxAllowedInstancesGuard(${displayName})`;
   return Hoc;
diff --git a/packages/remix/package.json b/packages/remix/package.json
index c6fafeffc19..03e4fad55ab 100644
--- a/packages/remix/package.json
+++ b/packages/remix/package.json
@@ -49,7 +49,7 @@
     "react": "17.0.2",
     "react-dom": "17.0.2",
     "ts-jest": "^27.1.3",
-    "typescript": "^4.6.4"
+    "typescript": "*"
   },
   "peerDependencies": {
     "@remix-run/react": "^1.2.1",
diff --git a/packages/remix/src/ssr/types.ts b/packages/remix/src/ssr/types.ts
index 67f2bc2d870..17515efdd12 100644
--- a/packages/remix/src/ssr/types.ts
+++ b/packages/remix/src/ssr/types.ts
@@ -12,7 +12,7 @@ export type RootAuthLoaderOptions = {
   authorizedParties?: [];
 };
 
-export type RootAuthLoaderCallback<Options> = (
+export type RootAuthLoaderCallback<Options extends RootAuthLoaderOptions> = (
   args: LoaderFunctionArgsWithAuth<Options>,
 ) => RootAuthLoaderCallbackReturn;
 
diff --git a/packages/sdk-node/package.json b/packages/sdk-node/package.json
index 6c8ea295381..3abf5747834 100644
--- a/packages/sdk-node/package.json
+++ b/packages/sdk-node/package.json
@@ -35,7 +35,7 @@
     "npm-run-all": "^4.1.5",
     "prettier": "^2.5.0",
     "ts-jest": "^27.1.3",
-    "typescript": "^4.6.4"
+    "typescript": "*"
   },
   "dependencies": {
     "@clerk/backend-core": "^2.8.1",
diff --git a/packages/themes/package.json b/packages/themes/package.json
index 49997974fd2..b77231a8274 100644
--- a/packages/themes/package.json
+++ b/packages/themes/package.json
@@ -29,7 +29,7 @@
   },
   "devDependencies": {
     "@clerk/types": "^3.10.1",
-    "typescript": "^4.6.4"
+    "typescript": "*"
   },
   "peerDependencies": {
     "react": ">=16"
diff --git a/packages/types/package.json b/packages/types/package.json
index df74beaab0a..89066632e3d 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -33,7 +33,7 @@
     "@types/jest": "^27.4.0",
     "jest": "^27.4.7",
     "ts-jest": "^27.1.3",
-    "typescript": "^4.6.4"
+    "typescript": "*"
   },
   "engines": {
     "node": ">=14"

From dd8c4165799272b9a8552a56dd2cd917254e56b5 Mon Sep 17 00:00:00 2001
From: Nikos Douvlis <nikosdouvlis@gmail.com>
Date: Sun, 9 Oct 2022 20:18:46 +0300
Subject: [PATCH 15/41] chore(repo): Introduce @clerk/common

---
 .gitignore                                    |   1 +
 package-lock.json                             | 262 +++++-------------
 packages/backend-core/package.json            |   2 +-
 packages/clerk-js/package.json                |   2 -
 packages/clerk-js/src/core/clerk.ts           |   4 +-
 packages/clerk-js/src/core/fapiClient.ts      |   2 +-
 .../src/core/resources/EmailAddress.ts        |   2 +-
 .../src/core/resources/ExternalAccount.ts     |   2 +-
 .../clerk-js/src/core/resources/Session.ts    |   2 +-
 .../clerk-js/src/core/resources/SignIn.ts     |   4 +-
 .../clerk-js/src/core/resources/SignUp.ts     |   2 +-
 packages/clerk-js/src/ui/Components.tsx       |   1 -
 .../src/ui/SignUp/signUpFormHelpers.ts        |   2 +-
 .../ui/UserProfile/ActiveDevicesSection.tsx   |   2 +-
 .../clerk-js/src/ui/common/authPropHelpers.ts |   2 +-
 .../src/ui/common/withRedirectToHome.test.tsx |   2 +-
 .../src/ui/contexts/CoreUserContext.tsx       |   2 +-
 packages/clerk-js/src/ui/elements/Avatar.tsx  |   2 +-
 .../src/ui/hooks/useSupportEmail.test.tsx     |   2 +-
 .../src/ui/router/HashRouter.test.tsx         |   2 +-
 .../src/ui/router/PathRouter.test.tsx         |   2 +-
 .../clerk-js/src/ui/router/Switch.test.tsx    |   2 +-
 .../src/ui/router/VirtualRouter.test.tsx      |   2 +-
 .../src/ui/router/__mocks__/RouteContext.tsx  |   2 +-
 packages/clerk-js/src/utils/cookies/client.ts |   2 +-
 .../clerk-js/src/utils/cookies/client_uat.ts  |   2 +-
 .../clerk-js/src/utils/cookies/handler.ts     |   2 +-
 .../clerk-js/src/utils/cookies/initted.ts     |   2 +-
 .../clerk-js/src/utils/cookies/session.ts     |   2 +-
 .../src/utils/ignoreEventValue.test.ts        |   2 +-
 packages/clerk-js/src/utils/pageLifecycle.ts  |   2 +-
 packages/clerk-js/src/utils/url.ts            |   2 +-
 packages/common/global.d.ts                   |   6 +
 packages/common/package.json                  |  39 +++
 packages/common/src/index.ts                  |   1 +
 packages/common/src/testUtils/index.ts        |   1 +
 packages/common/src/testUtils/testUtils.ts    |  36 +++
 packages/common/src/utils/array.test.ts       |  17 ++
 packages/common/src/utils/array.ts            |  12 +
 packages/common/src/utils/browser.test.ts     |   7 +
 packages/common/src/utils/browser.ts          |   3 +
 .../src/utils/color/cssColorUtils.test.ts     |  71 +++++
 .../common/src/utils/color/cssColorUtils.ts   | 151 ++++++++++
 packages/common/src/utils/color/index.ts      |   2 +
 packages/common/src/utils/color/predicates.ts |  37 +++
 packages/common/src/utils/cookies.ts          |  27 ++
 packages/common/src/utils/date.test.ts        |  67 +++++
 packages/common/src/utils/date.ts             |  81 ++++++
 packages/common/src/utils/file.ts             |  18 ++
 packages/common/src/utils/index.ts            |  16 ++
 packages/common/src/utils/isRetinaDisplay.ts  |   9 +
 .../localStorageBroadcastChannel.test.ts      |  44 +++
 .../src/utils/localStorageBroadcastChannel.ts |  52 ++++
 .../common/src/utils/mimeTypeExtensions.ts    |  14 +
 packages/common/src/utils/noop.ts             |   3 +
 packages/common/src/utils/object.test.ts      | 145 ++++++++++
 packages/common/src/utils/object.ts           |  48 ++++
 packages/common/src/utils/poller.ts           |  33 +++
 packages/common/src/utils/ssr.ts              |   3 +
 packages/common/src/utils/string.test.ts      |  20 ++
 packages/common/src/utils/string.ts           |  19 ++
 packages/common/src/utils/url.test.ts         |  16 ++
 packages/common/src/utils/url.ts              |   6 +
 packages/common/testUtils/package.json        |   6 +
 packages/common/tsconfig.json                 |  19 ++
 packages/common/tsup.config.ts                |  19 ++
 packages/common/vite.config.ts                |   8 +
 .../src/components/SignInButton.test.tsx      |   2 +-
 .../SignInWithMetamaskButton.test.tsx         |   2 +-
 .../src/components/SignOutButton.test.tsx     |   2 +-
 .../src/components/SignUpButton.test.tsx      |   2 +-
 .../useMaxAllowedInstancesGuard.test.tsx      |   2 +-
 packages/shared/package.json                  |   5 +-
 73 files changed, 1167 insertions(+), 230 deletions(-)
 create mode 100644 packages/common/global.d.ts
 create mode 100644 packages/common/package.json
 create mode 100644 packages/common/src/index.ts
 create mode 100644 packages/common/src/testUtils/index.ts
 create mode 100644 packages/common/src/testUtils/testUtils.ts
 create mode 100644 packages/common/src/utils/array.test.ts
 create mode 100644 packages/common/src/utils/array.ts
 create mode 100644 packages/common/src/utils/browser.test.ts
 create mode 100644 packages/common/src/utils/browser.ts
 create mode 100644 packages/common/src/utils/color/cssColorUtils.test.ts
 create mode 100644 packages/common/src/utils/color/cssColorUtils.ts
 create mode 100644 packages/common/src/utils/color/index.ts
 create mode 100644 packages/common/src/utils/color/predicates.ts
 create mode 100644 packages/common/src/utils/cookies.ts
 create mode 100644 packages/common/src/utils/date.test.ts
 create mode 100644 packages/common/src/utils/date.ts
 create mode 100644 packages/common/src/utils/file.ts
 create mode 100644 packages/common/src/utils/index.ts
 create mode 100644 packages/common/src/utils/isRetinaDisplay.ts
 create mode 100644 packages/common/src/utils/localStorageBroadcastChannel.test.ts
 create mode 100644 packages/common/src/utils/localStorageBroadcastChannel.ts
 create mode 100644 packages/common/src/utils/mimeTypeExtensions.ts
 create mode 100644 packages/common/src/utils/noop.ts
 create mode 100644 packages/common/src/utils/object.test.ts
 create mode 100644 packages/common/src/utils/object.ts
 create mode 100644 packages/common/src/utils/poller.ts
 create mode 100644 packages/common/src/utils/ssr.ts
 create mode 100644 packages/common/src/utils/string.test.ts
 create mode 100644 packages/common/src/utils/string.ts
 create mode 100644 packages/common/src/utils/url.test.ts
 create mode 100644 packages/common/src/utils/url.ts
 create mode 100644 packages/common/testUtils/package.json
 create mode 100644 packages/common/tsconfig.json
 create mode 100644 packages/common/tsup.config.ts
 create mode 100644 packages/common/vite.config.ts

diff --git a/.gitignore b/.gitignore
index 169707027f8..56a856da391 100644
--- a/.gitignore
+++ b/.gitignore
@@ -51,3 +51,4 @@ Thumbs.db
 
 lerna-debug.log
 playground
+playground1
diff --git a/package-lock.json b/package-lock.json
index 25dc21fcd89..94dcedb6357 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8877,7 +8877,6 @@
       "version": "7.31.2",
       "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.31.2.tgz",
       "integrity": "sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==",
-      "dev": true,
       "dependencies": {
         "@babel/code-frame": "^7.10.4",
         "@babel/runtime": "^7.12.5",
@@ -8896,7 +8895,6 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
       "dependencies": {
         "color-convert": "^2.0.1"
       },
@@ -8911,7 +8909,6 @@
       "version": "4.1.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
       "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
       "dependencies": {
         "ansi-styles": "^4.1.0",
         "supports-color": "^7.1.0"
@@ -8927,7 +8924,6 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
       "dependencies": {
         "color-name": "~1.1.4"
       },
@@ -8938,14 +8934,12 @@
     "node_modules/@testing-library/dom/node_modules/color-name": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
     },
     "node_modules/@testing-library/dom/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -8954,7 +8948,6 @@
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
       "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
       "dependencies": {
         "has-flag": "^4.0.0"
       },
@@ -8966,7 +8959,6 @@
       "version": "5.16.2",
       "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.2.tgz",
       "integrity": "sha512-6ewxs1MXWwsBFZXIk4nKKskWANelkdUehchEOokHsN8X7c2eKXGw+77aRV63UU8f/DTSVUPLaGxdrj4lN7D/ug==",
-      "dev": true,
       "dependencies": {
         "@babel/runtime": "^7.9.2",
         "@types/testing-library__jest-dom": "^5.9.1",
@@ -8988,7 +8980,6 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
       "dependencies": {
         "color-convert": "^2.0.1"
       },
@@ -9003,7 +8994,6 @@
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz",
       "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==",
-      "dev": true,
       "engines": {
         "node": ">=6.0"
       }
@@ -9012,7 +9002,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
       "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
-      "dev": true,
       "dependencies": {
         "ansi-styles": "^4.1.0",
         "supports-color": "^7.1.0"
@@ -9025,7 +9014,6 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
       "dependencies": {
         "color-name": "~1.1.4"
       },
@@ -9036,14 +9024,12 @@
     "node_modules/@testing-library/jest-dom/node_modules/color-name": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
     },
     "node_modules/@testing-library/jest-dom/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -9052,7 +9038,6 @@
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
       "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
       "dependencies": {
         "has-flag": "^4.0.0"
       },
@@ -9064,7 +9049,6 @@
       "version": "11.2.7",
       "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-11.2.7.tgz",
       "integrity": "sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA==",
-      "dev": true,
       "dependencies": {
         "@babel/runtime": "^7.12.5",
         "@testing-library/dom": "^7.28.1"
@@ -9081,7 +9065,6 @@
       "version": "3.7.0",
       "resolved": "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-3.7.0.tgz",
       "integrity": "sha512-TwfbY6BWtWIHitjT05sbllyLIProcysC0dF0q1bbDa7OHLC6A6rJOYJwZ13hzfz3O4RtOuInmprBozJRyyo7/g==",
-      "dev": true,
       "dependencies": {
         "@babel/runtime": "^7.12.5",
         "@types/testing-library__react-hooks": "^3.4.0"
@@ -9095,7 +9078,6 @@
       "version": "12.8.3",
       "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz",
       "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==",
-      "dev": true,
       "dependencies": {
         "@babel/runtime": "^7.12.5"
       },
@@ -9175,8 +9157,7 @@
     "node_modules/@types/aria-query": {
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz",
-      "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==",
-      "dev": true
+      "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig=="
     },
     "node_modules/@types/babel__core": {
       "version": "7.1.18",
@@ -9448,14 +9429,12 @@
     "node_modules/@types/istanbul-lib-coverage": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
-      "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
-      "dev": true
+      "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g=="
     },
     "node_modules/@types/istanbul-lib-report": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
       "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
-      "dev": true,
       "dependencies": {
         "@types/istanbul-lib-coverage": "*"
       }
@@ -9464,7 +9443,6 @@
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
       "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-      "dev": true,
       "dependencies": {
         "@types/istanbul-lib-report": "*"
       }
@@ -9473,7 +9451,6 @@
       "version": "27.4.0",
       "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.0.tgz",
       "integrity": "sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ==",
-      "dev": true,
       "dependencies": {
         "jest-diff": "^27.0.0",
         "pretty-format": "^27.0.0"
@@ -9483,7 +9460,6 @@
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
       "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
-      "dev": true,
       "engines": {
         "node": ">=10"
       },
@@ -9495,7 +9471,6 @@
       "version": "27.4.6",
       "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.6.tgz",
       "integrity": "sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g==",
-      "dev": true,
       "dependencies": {
         "ansi-regex": "^5.0.1",
         "ansi-styles": "^5.0.0",
@@ -9506,9 +9481,9 @@
       }
     },
     "node_modules/@types/js-cookie": {
-      "version": "2.2.7",
-      "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz",
-      "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.2.tgz",
+      "integrity": "sha512-6+0ekgfusHftJNYpihfkMu8BWdeHs9EOJuGcSofErjstGPfPGEu9yTu4t460lTzzAMl2cM5zngQJqPMHbbnvYA==",
       "dev": true
     },
     "node_modules/@types/json-buffer": {
@@ -9669,7 +9644,6 @@
       "version": "17.0.1",
       "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz",
       "integrity": "sha512-3Fi2O6Zzq/f3QR9dRnlnHso9bMl7weKCviFmfF6B4LS1Uat6Hkm15k0ZAQuDz+UBq6B3+g+NM6IT2nr5QgPzCw==",
-      "dev": true,
       "dependencies": {
         "@types/react": "*"
       }
@@ -9768,7 +9742,6 @@
       "version": "5.14.2",
       "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.2.tgz",
       "integrity": "sha512-vehbtyHUShPxIa9SioxDwCvgxukDMH//icJG90sXQBUm5lJOHLT5kNeU9tnivhnA/TkOFMzGIXN2cTc4hY8/kg==",
-      "dev": true,
       "dependencies": {
         "@types/jest": "*"
       }
@@ -9777,7 +9750,6 @@
       "version": "3.4.1",
       "resolved": "https://registry.npmjs.org/@types/testing-library__react-hooks/-/testing-library__react-hooks-3.4.1.tgz",
       "integrity": "sha512-G4JdzEcq61fUyV6wVW9ebHWEiLK2iQvaBuCHHn9eMSbZzVh4Z4wHnUGIvQOYCCYeu5DnUtFyNYuAAgbSaO/43Q==",
-      "dev": true,
       "dependencies": {
         "@types/react-test-renderer": "*"
       }
@@ -9834,8 +9806,7 @@
     "node_modules/@types/yargs-parser": {
       "version": "20.2.1",
       "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz",
-      "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==",
-      "dev": true
+      "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw=="
     },
     "node_modules/@types/yoga-layout": {
       "version": "1.9.2",
@@ -11101,7 +11072,6 @@
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
       "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
-      "devOptional": true,
       "bin": {
         "atob": "bin/atob.js"
       },
@@ -13887,7 +13857,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz",
       "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==",
-      "dev": true,
       "dependencies": {
         "inherits": "^2.0.4",
         "source-map": "^0.6.1",
@@ -14100,7 +14069,6 @@
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -14948,7 +14916,6 @@
       "version": "27.4.0",
       "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz",
       "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==",
-      "dev": true,
       "engines": {
         "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
       }
@@ -15005,8 +14972,7 @@
     "node_modules/dom-accessibility-api": {
       "version": "0.5.11",
       "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.11.tgz",
-      "integrity": "sha512-7X6GvzjYf4yTdRKuCVScV+aA9Fvh5r8WzWrXBH9w82ZWB/eYDMGCnazoC/YAqAzUJWHzLOnZqr46K3iEyUhUvw==",
-      "dev": true
+      "integrity": "sha512-7X6GvzjYf4yTdRKuCVScV+aA9Fvh5r8WzWrXBH9w82ZWB/eYDMGCnazoC/YAqAzUJWHzLOnZqr46K3iEyUhUvw=="
     },
     "node_modules/dom-converter": {
       "version": "0.2.0",
@@ -22112,7 +22078,6 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
       "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
-      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -23746,7 +23711,6 @@
       "version": "27.4.6",
       "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.6.tgz",
       "integrity": "sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w==",
-      "dev": true,
       "dependencies": {
         "chalk": "^4.0.0",
         "diff-sequences": "^27.4.0",
@@ -23761,7 +23725,6 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
       "dependencies": {
         "color-convert": "^2.0.1"
       },
@@ -23776,7 +23739,6 @@
       "version": "4.1.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
       "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
       "dependencies": {
         "ansi-styles": "^4.1.0",
         "supports-color": "^7.1.0"
@@ -23792,7 +23754,6 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
       "dependencies": {
         "color-name": "~1.1.4"
       },
@@ -23803,14 +23764,12 @@
     "node_modules/jest-diff/node_modules/color-name": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
     },
     "node_modules/jest-diff/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -23819,7 +23778,6 @@
       "version": "27.4.6",
       "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.6.tgz",
       "integrity": "sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g==",
-      "dev": true,
       "dependencies": {
         "ansi-regex": "^5.0.1",
         "ansi-styles": "^5.0.0",
@@ -23833,7 +23791,6 @@
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
       "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
-      "dev": true,
       "engines": {
         "node": ">=10"
       },
@@ -23845,7 +23802,6 @@
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
       "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
       "dependencies": {
         "has-flag": "^4.0.0"
       },
@@ -24016,7 +23972,6 @@
       "version": "27.4.0",
       "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz",
       "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==",
-      "dev": true,
       "engines": {
         "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
       }
@@ -25329,9 +25284,13 @@
       "dev": true
     },
     "node_modules/js-cookie": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
-      "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ=="
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz",
+      "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      }
     },
     "node_modules/js-sdsl": {
       "version": "4.1.5",
@@ -26329,7 +26288,6 @@
       "version": "1.4.4",
       "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz",
       "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=",
-      "dev": true,
       "bin": {
         "lz-string": "bin/bin.js"
       }
@@ -26735,7 +26693,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
       "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
-      "dev": true,
       "engines": {
         "node": ">=4"
       }
@@ -30302,7 +30259,6 @@
       "version": "26.6.2",
       "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
       "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
-      "dev": true,
       "dependencies": {
         "@jest/types": "^26.6.2",
         "ansi-regex": "^5.0.0",
@@ -30317,7 +30273,6 @@
       "version": "26.6.2",
       "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
       "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-      "dev": true,
       "dependencies": {
         "@types/istanbul-lib-coverage": "^2.0.0",
         "@types/istanbul-reports": "^3.0.0",
@@ -30333,7 +30288,6 @@
       "version": "15.0.14",
       "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz",
       "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==",
-      "dev": true,
       "dependencies": {
         "@types/yargs-parser": "*"
       }
@@ -30342,7 +30296,6 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
       "dependencies": {
         "color-convert": "^2.0.1"
       },
@@ -30357,7 +30310,6 @@
       "version": "4.1.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
       "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
       "dependencies": {
         "ansi-styles": "^4.1.0",
         "supports-color": "^7.1.0"
@@ -30373,7 +30325,6 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
       "dependencies": {
         "color-name": "~1.1.4"
       },
@@ -30384,14 +30335,12 @@
     "node_modules/pretty-format/node_modules/color-name": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
     },
     "node_modules/pretty-format/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -30400,7 +30349,6 @@
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
       "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
       "dependencies": {
         "has-flag": "^4.0.0"
       },
@@ -31304,8 +31252,7 @@
     "node_modules/react-is": {
       "version": "17.0.2",
       "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-      "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-      "dev": true
+      "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
     },
     "node_modules/react-lifecycles-compat": {
       "version": "3.0.4",
@@ -31386,7 +31333,6 @@
       "version": "16.14.1",
       "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz",
       "integrity": "sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg==",
-      "dev": true,
       "dependencies": {
         "object-assign": "^4.1.1",
         "react-is": "^16.12.0 || ^17.0.0"
@@ -31399,7 +31345,6 @@
       "version": "17.0.2",
       "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-17.0.2.tgz",
       "integrity": "sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ==",
-      "dev": true,
       "dependencies": {
         "object-assign": "^4.1.1",
         "react-is": "^17.0.2",
@@ -31844,7 +31789,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
       "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
-      "dev": true,
       "dependencies": {
         "indent-string": "^4.0.0",
         "strip-indent": "^3.0.0"
@@ -33067,9 +33011,9 @@
       }
     },
     "node_modules/snakecase-keys": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-5.1.2.tgz",
-      "integrity": "sha512-fvtDQZqPBqYb0dEY97TGuOMbN2NJ05Tj4MaoKwjTKkmjcG6mrd58JYGr23UWZRi6Aqv49Fk4HtjTIStOQenaug==",
+      "version": "5.4.4",
+      "resolved": "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-5.4.4.tgz",
+      "integrity": "sha512-YTywJG93yxwHLgrYLZjlC75moVEX04LZM4FHfihjHe1FCXm+QaLOFfSf535aXOAd0ArVQMWUAe8ZPm4VtWyXaA==",
       "dependencies": {
         "map-obj": "^4.1.0",
         "snake-case": "^3.0.4",
@@ -33496,7 +33440,6 @@
       "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz",
       "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==",
       "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
-      "dev": true,
       "dependencies": {
         "atob": "^2.1.2",
         "decode-uri-component": "^0.2.0"
@@ -34065,7 +34008,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
       "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
-      "dev": true,
       "dependencies": {
         "min-indent": "^1.0.0"
       },
@@ -38315,7 +38257,7 @@
         "@types/node-fetch": "^2",
         "node-fetch": "^2.6.0",
         "query-string": "^7.0.1",
-        "snakecase-keys": "^5.1.2",
+        "snakecase-keys": "^5.4.4",
         "tslib": "^2.3.1"
       },
       "devDependencies": {
@@ -38371,7 +38313,6 @@
         "core-js": "^3.18.3",
         "deepmerge": "^4.2.2",
         "dequal": "^2.0.2",
-        "js-cookie": "^2.2.1",
         "qrcode.react": "^3.1.0",
         "qs": "^6.9.4",
         "react": "17.0.2",
@@ -38386,7 +38327,6 @@
         "@babel/preset-env": "^7.12.1",
         "@babel/preset-react": "^7.12.5",
         "@babel/preset-typescript": "^7.12.1",
-        "@clerk/shared": "^0.3.27",
         "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7",
         "@svgr/webpack": "^6.2.1",
         "@testing-library/dom": "^7.28.1",
@@ -38497,12 +38437,25 @@
       }
     },
     "packages/common": {
+      "name": "@clerk/common",
       "version": "0.0.1",
       "license": "ISC",
       "devDependencies": {
+        "@clerk/types": "^3.10.1",
+        "@types/js-cookie": "^3.0.2",
+        "js-cookie": "^3.0.1",
         "tsup": "^6.2.3",
-        "typescript": "^4.6.4",
+        "typescript": "*",
         "vitest": "^0.23.4"
+      },
+      "peerDependencies": {
+        "@testing-library/dom": "^7.28.1",
+        "@testing-library/jest-dom": "^5.11.6",
+        "@testing-library/react": "^11.2.1",
+        "@testing-library/react-hooks": "^3.4.2",
+        "@testing-library/user-event": "^12.2.2",
+        "react": "17.0.2",
+        "react-dom": "17.0.2"
       }
     },
     "packages/edge": {
@@ -39492,7 +39445,6 @@
         "@types/babel__preset-env": "^7",
         "@types/classnames": "^2",
         "@types/jest": "^27.4.0",
-        "@types/js-cookie": "^2",
         "@types/node": "^16.11.55",
         "@types/react": "^17.0.39",
         "@types/react-color": "^3.0.4",
@@ -39505,7 +39457,6 @@
         "core-js": "^3.18.3",
         "identity-obj-proxy": "^3.0.0",
         "jest": "^27.4.7",
-        "js-cookie": "^2.2.1",
         "react": "17.0.2",
         "react-color": "2.19.3",
         "react-dom": "17.0.2",
@@ -39517,7 +39468,6 @@
         "@popperjs/core": "^2.5.4",
         "@svgr/webpack": "^6.2.1",
         "core-js": "^3.18.3",
-        "js-cookie": "^2.2.1",
         "react": "17.0.2",
         "react-color": "2.19.3",
         "react-dom": "17.0.2",
@@ -41029,7 +40979,7 @@
         "nock": "^13.2.1",
         "node-fetch": "^2.6.0",
         "query-string": "^7.0.1",
-        "snakecase-keys": "^5.1.2",
+        "snakecase-keys": "^5.4.4",
         "ts-jest": "^27.1.3",
         "tslib": "^2.3.1",
         "typescript": "*"
@@ -41080,7 +41030,6 @@
         "@babel/preset-react": "^7.12.5",
         "@babel/preset-typescript": "^7.12.1",
         "@clerk/common": "^0.0.1",
-        "@clerk/shared": "^0.3.27",
         "@clerk/types": "^3.10.1",
         "@emotion/cache": "^11.7.1",
         "@emotion/react": "^11.9.0",
@@ -41119,7 +41068,6 @@
         "fork-ts-checker-webpack-plugin": "^7.2.11",
         "identity-obj-proxy": "^3.0.0",
         "jest": "^27.4.7",
-        "js-cookie": "^2.2.1",
         "jsonwebtoken": "^8.5.1",
         "node-fetch": "^3.2.0",
         "postcss": "^8.4.13",
@@ -41261,8 +41209,11 @@
     "@clerk/common": {
       "version": "file:packages/common",
       "requires": {
+        "@clerk/types": "^3.10.1",
+        "@types/js-cookie": "^3.0.2",
+        "js-cookie": "^3.0.1",
         "tsup": "^6.2.3",
-        "typescript": "^4.6.4",
+        "typescript": "*",
         "vitest": "^0.23.4"
       }
     },
@@ -41634,7 +41585,6 @@
         "@types/babel__preset-env": "^7",
         "@types/classnames": "^2",
         "@types/jest": "^27.4.0",
-        "@types/js-cookie": "^2",
         "@types/node": "^16.11.55",
         "@types/react": "^17.0.39",
         "@types/react-color": "^3.0.4",
@@ -41647,7 +41597,6 @@
         "core-js": "^3.18.3",
         "identity-obj-proxy": "^3.0.0",
         "jest": "^27.4.7",
-        "js-cookie": "^2.2.1",
         "react": "17.0.2",
         "react-color": "2.19.3",
         "react-dom": "17.0.2",
@@ -46746,7 +46695,6 @@
       "version": "7.31.2",
       "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.31.2.tgz",
       "integrity": "sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==",
-      "dev": true,
       "requires": {
         "@babel/code-frame": "^7.10.4",
         "@babel/runtime": "^7.12.5",
@@ -46762,7 +46710,6 @@
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
           "requires": {
             "color-convert": "^2.0.1"
           }
@@ -46771,7 +46718,6 @@
           "version": "4.1.2",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
           "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
           "requires": {
             "ansi-styles": "^4.1.0",
             "supports-color": "^7.1.0"
@@ -46781,7 +46727,6 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
           "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
           "requires": {
             "color-name": "~1.1.4"
           }
@@ -46789,20 +46734,17 @@
         "color-name": {
           "version": "1.1.4",
           "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
         },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
         },
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
           "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
           "requires": {
             "has-flag": "^4.0.0"
           }
@@ -46813,7 +46755,6 @@
       "version": "5.16.2",
       "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.2.tgz",
       "integrity": "sha512-6ewxs1MXWwsBFZXIk4nKKskWANelkdUehchEOokHsN8X7c2eKXGw+77aRV63UU8f/DTSVUPLaGxdrj4lN7D/ug==",
-      "dev": true,
       "requires": {
         "@babel/runtime": "^7.9.2",
         "@types/testing-library__jest-dom": "^5.9.1",
@@ -46830,7 +46771,6 @@
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
           "requires": {
             "color-convert": "^2.0.1"
           }
@@ -46838,14 +46778,12 @@
         "aria-query": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz",
-          "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==",
-          "dev": true
+          "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg=="
         },
         "chalk": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
           "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
-          "dev": true,
           "requires": {
             "ansi-styles": "^4.1.0",
             "supports-color": "^7.1.0"
@@ -46855,7 +46793,6 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
           "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
           "requires": {
             "color-name": "~1.1.4"
           }
@@ -46863,20 +46800,17 @@
         "color-name": {
           "version": "1.1.4",
           "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
         },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
         },
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
           "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
           "requires": {
             "has-flag": "^4.0.0"
           }
@@ -46887,7 +46821,6 @@
       "version": "11.2.7",
       "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-11.2.7.tgz",
       "integrity": "sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA==",
-      "dev": true,
       "requires": {
         "@babel/runtime": "^7.12.5",
         "@testing-library/dom": "^7.28.1"
@@ -46897,7 +46830,6 @@
       "version": "3.7.0",
       "resolved": "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-3.7.0.tgz",
       "integrity": "sha512-TwfbY6BWtWIHitjT05sbllyLIProcysC0dF0q1bbDa7OHLC6A6rJOYJwZ13hzfz3O4RtOuInmprBozJRyyo7/g==",
-      "dev": true,
       "requires": {
         "@babel/runtime": "^7.12.5",
         "@types/testing-library__react-hooks": "^3.4.0"
@@ -46907,7 +46839,6 @@
       "version": "12.8.3",
       "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz",
       "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==",
-      "dev": true,
       "requires": {
         "@babel/runtime": "^7.12.5"
       }
@@ -46971,8 +46902,7 @@
     "@types/aria-query": {
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz",
-      "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==",
-      "dev": true
+      "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig=="
     },
     "@types/babel__core": {
       "version": "7.1.18",
@@ -47243,14 +47173,12 @@
     "@types/istanbul-lib-coverage": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
-      "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
-      "dev": true
+      "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g=="
     },
     "@types/istanbul-lib-report": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
       "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
-      "dev": true,
       "requires": {
         "@types/istanbul-lib-coverage": "*"
       }
@@ -47259,7 +47187,6 @@
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
       "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-      "dev": true,
       "requires": {
         "@types/istanbul-lib-report": "*"
       }
@@ -47268,7 +47195,6 @@
       "version": "27.4.0",
       "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.0.tgz",
       "integrity": "sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ==",
-      "dev": true,
       "requires": {
         "jest-diff": "^27.0.0",
         "pretty-format": "^27.0.0"
@@ -47277,14 +47203,12 @@
         "ansi-styles": {
           "version": "5.2.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
-          "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
-          "dev": true
+          "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="
         },
         "pretty-format": {
           "version": "27.4.6",
           "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.6.tgz",
           "integrity": "sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g==",
-          "dev": true,
           "requires": {
             "ansi-regex": "^5.0.1",
             "ansi-styles": "^5.0.0",
@@ -47294,9 +47218,9 @@
       }
     },
     "@types/js-cookie": {
-      "version": "2.2.7",
-      "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz",
-      "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.2.tgz",
+      "integrity": "sha512-6+0ekgfusHftJNYpihfkMu8BWdeHs9EOJuGcSofErjstGPfPGEu9yTu4t460lTzzAMl2cM5zngQJqPMHbbnvYA==",
       "dev": true
     },
     "@types/json-buffer": {
@@ -47457,7 +47381,6 @@
       "version": "17.0.1",
       "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz",
       "integrity": "sha512-3Fi2O6Zzq/f3QR9dRnlnHso9bMl7weKCviFmfF6B4LS1Uat6Hkm15k0ZAQuDz+UBq6B3+g+NM6IT2nr5QgPzCw==",
-      "dev": true,
       "requires": {
         "@types/react": "*"
       }
@@ -47556,7 +47479,6 @@
       "version": "5.14.2",
       "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.2.tgz",
       "integrity": "sha512-vehbtyHUShPxIa9SioxDwCvgxukDMH//icJG90sXQBUm5lJOHLT5kNeU9tnivhnA/TkOFMzGIXN2cTc4hY8/kg==",
-      "dev": true,
       "requires": {
         "@types/jest": "*"
       }
@@ -47565,7 +47487,6 @@
       "version": "3.4.1",
       "resolved": "https://registry.npmjs.org/@types/testing-library__react-hooks/-/testing-library__react-hooks-3.4.1.tgz",
       "integrity": "sha512-G4JdzEcq61fUyV6wVW9ebHWEiLK2iQvaBuCHHn9eMSbZzVh4Z4wHnUGIvQOYCCYeu5DnUtFyNYuAAgbSaO/43Q==",
-      "dev": true,
       "requires": {
         "@types/react-test-renderer": "*"
       }
@@ -47621,8 +47542,7 @@
     "@types/yargs-parser": {
       "version": "20.2.1",
       "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz",
-      "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==",
-      "dev": true
+      "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw=="
     },
     "@types/yoga-layout": {
       "version": "1.9.2",
@@ -48564,8 +48484,7 @@
     "atob": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
-      "devOptional": true
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
     },
     "auto-bind": {
       "version": "4.0.0",
@@ -50740,7 +50659,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz",
       "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==",
-      "dev": true,
       "requires": {
         "inherits": "^2.0.4",
         "source-map": "^0.6.1",
@@ -50750,8 +50668,7 @@
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
         }
       }
     },
@@ -51559,8 +51476,7 @@
     "diff-sequences": {
       "version": "27.4.0",
       "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz",
-      "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==",
-      "dev": true
+      "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww=="
     },
     "dir-glob": {
       "version": "3.0.1",
@@ -51608,8 +51524,7 @@
     "dom-accessibility-api": {
       "version": "0.5.11",
       "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.11.tgz",
-      "integrity": "sha512-7X6GvzjYf4yTdRKuCVScV+aA9Fvh5r8WzWrXBH9w82ZWB/eYDMGCnazoC/YAqAzUJWHzLOnZqr46K3iEyUhUvw==",
-      "dev": true
+      "integrity": "sha512-7X6GvzjYf4yTdRKuCVScV+aA9Fvh5r8WzWrXBH9w82ZWB/eYDMGCnazoC/YAqAzUJWHzLOnZqr46K3iEyUhUvw=="
     },
     "dom-converter": {
       "version": "0.2.0",
@@ -57063,8 +56978,7 @@
     "indent-string": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
-      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
-      "dev": true
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
     },
     "infer-owner": {
       "version": "1.0.4",
@@ -58279,7 +58193,6 @@
       "version": "27.4.6",
       "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.6.tgz",
       "integrity": "sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w==",
-      "dev": true,
       "requires": {
         "chalk": "^4.0.0",
         "diff-sequences": "^27.4.0",
@@ -58291,7 +58204,6 @@
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
           "requires": {
             "color-convert": "^2.0.1"
           }
@@ -58300,7 +58212,6 @@
           "version": "4.1.2",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
           "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
           "requires": {
             "ansi-styles": "^4.1.0",
             "supports-color": "^7.1.0"
@@ -58310,7 +58221,6 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
           "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
           "requires": {
             "color-name": "~1.1.4"
           }
@@ -58318,20 +58228,17 @@
         "color-name": {
           "version": "1.1.4",
           "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
         },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
         },
         "pretty-format": {
           "version": "27.4.6",
           "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.6.tgz",
           "integrity": "sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g==",
-          "dev": true,
           "requires": {
             "ansi-regex": "^5.0.1",
             "ansi-styles": "^5.0.0",
@@ -58341,8 +58248,7 @@
             "ansi-styles": {
               "version": "5.2.0",
               "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
-              "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
-              "dev": true
+              "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="
             }
           }
         },
@@ -58350,7 +58256,6 @@
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
           "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
           "requires": {
             "has-flag": "^4.0.0"
           }
@@ -58481,8 +58386,7 @@
     "jest-get-type": {
       "version": "27.4.0",
       "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz",
-      "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==",
-      "dev": true
+      "integrity": "sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ=="
     },
     "jest-haste-map": {
       "version": "27.4.6",
@@ -59475,9 +59379,10 @@
       "dev": true
     },
     "js-cookie": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
-      "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ=="
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz",
+      "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==",
+      "dev": true
     },
     "js-sdsl": {
       "version": "4.1.5",
@@ -60327,8 +60232,7 @@
     "lz-string": {
       "version": "1.4.4",
       "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz",
-      "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=",
-      "dev": true
+      "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY="
     },
     "make-dir": {
       "version": "3.1.0",
@@ -60640,8 +60544,7 @@
     "min-indent": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
-      "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
-      "dev": true
+      "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="
     },
     "mini-css-extract-plugin": {
       "version": "1.6.2",
@@ -63290,7 +63193,6 @@
       "version": "26.6.2",
       "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
       "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
-      "dev": true,
       "requires": {
         "@jest/types": "^26.6.2",
         "ansi-regex": "^5.0.0",
@@ -63302,7 +63204,6 @@
           "version": "26.6.2",
           "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
           "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
-          "dev": true,
           "requires": {
             "@types/istanbul-lib-coverage": "^2.0.0",
             "@types/istanbul-reports": "^3.0.0",
@@ -63315,7 +63216,6 @@
           "version": "15.0.14",
           "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz",
           "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==",
-          "dev": true,
           "requires": {
             "@types/yargs-parser": "*"
           }
@@ -63324,7 +63224,6 @@
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
           "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
           "requires": {
             "color-convert": "^2.0.1"
           }
@@ -63333,7 +63232,6 @@
           "version": "4.1.2",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
           "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
           "requires": {
             "ansi-styles": "^4.1.0",
             "supports-color": "^7.1.0"
@@ -63343,7 +63241,6 @@
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
           "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
           "requires": {
             "color-name": "~1.1.4"
           }
@@ -63351,20 +63248,17 @@
         "color-name": {
           "version": "1.1.4",
           "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
         },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
         },
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
           "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
           "requires": {
             "has-flag": "^4.0.0"
           }
@@ -64035,8 +63929,7 @@
     "react-is": {
       "version": "17.0.2",
       "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-      "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-      "dev": true
+      "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
     },
     "react-lifecycles-compat": {
       "version": "3.0.4",
@@ -64097,7 +63990,6 @@
       "version": "16.14.1",
       "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz",
       "integrity": "sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg==",
-      "dev": true,
       "requires": {
         "object-assign": "^4.1.1",
         "react-is": "^16.12.0 || ^17.0.0"
@@ -64107,7 +63999,6 @@
       "version": "17.0.2",
       "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-17.0.2.tgz",
       "integrity": "sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ==",
-      "dev": true,
       "requires": {
         "object-assign": "^4.1.1",
         "react-is": "^17.0.2",
@@ -64467,7 +64358,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
       "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
-      "dev": true,
       "requires": {
         "indent-string": "^4.0.0",
         "strip-indent": "^3.0.0"
@@ -65403,9 +65293,9 @@
       }
     },
     "snakecase-keys": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-5.1.2.tgz",
-      "integrity": "sha512-fvtDQZqPBqYb0dEY97TGuOMbN2NJ05Tj4MaoKwjTKkmjcG6mrd58JYGr23UWZRi6Aqv49Fk4HtjTIStOQenaug==",
+      "version": "5.4.4",
+      "resolved": "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-5.4.4.tgz",
+      "integrity": "sha512-YTywJG93yxwHLgrYLZjlC75moVEX04LZM4FHfihjHe1FCXm+QaLOFfSf535aXOAd0ArVQMWUAe8ZPm4VtWyXaA==",
       "requires": {
         "map-obj": "^4.1.0",
         "snake-case": "^3.0.4",
@@ -65757,7 +65647,6 @@
       "version": "0.6.0",
       "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz",
       "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==",
-      "dev": true,
       "requires": {
         "atob": "^2.1.2",
         "decode-uri-component": "^0.2.0"
@@ -66213,7 +66102,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
       "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
-      "dev": true,
       "requires": {
         "min-indent": "^1.0.0"
       }
diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json
index d7882493cca..178e0bb4c06 100644
--- a/packages/backend-core/package.json
+++ b/packages/backend-core/package.json
@@ -20,7 +20,7 @@
     "@types/node-fetch": "^2",
     "node-fetch": "^2.6.0",
     "query-string": "^7.0.1",
-    "snakecase-keys": "^5.1.2",
+    "snakecase-keys": "^5.4.4",
     "tslib": "^2.3.1"
   },
   "devDependencies": {
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index 2cf85f50fbf..6e2b1476c4b 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -50,7 +50,6 @@
     "core-js": "^3.18.3",
     "deepmerge": "^4.2.2",
     "dequal": "^2.0.2",
-    "js-cookie": "^2.2.1",
     "qrcode.react": "^3.1.0",
     "qs": "^6.9.4",
     "react": "17.0.2",
@@ -65,7 +64,6 @@
     "@babel/preset-env": "^7.12.1",
     "@babel/preset-react": "^7.12.5",
     "@babel/preset-typescript": "^7.12.1",
-    "@clerk/shared": "^0.3.27",
     "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7",
     "@svgr/webpack": "^6.2.1",
     "@testing-library/dom": "^7.28.1",
diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts
index c3a80485ba3..46d229250e5 100644
--- a/packages/clerk-js/src/core/clerk.ts
+++ b/packages/clerk-js/src/core/clerk.ts
@@ -1,6 +1,4 @@
-import { LocalStorageBroadcastChannel } from '@clerk/shared/utils/localStorageBroadcastChannel';
-import { noop } from '@clerk/shared/utils/noop';
-import { inClientSide } from '@clerk/shared/utils/ssr';
+import { inClientSide, LocalStorageBroadcastChannel, noop } from '@clerk/common';
 import type {
   ActiveSessionResource,
   AuthenticateWithMetamaskParams,
diff --git a/packages/clerk-js/src/core/fapiClient.ts b/packages/clerk-js/src/core/fapiClient.ts
index 45866eaa8d3..1afc2645c94 100644
--- a/packages/clerk-js/src/core/fapiClient.ts
+++ b/packages/clerk-js/src/core/fapiClient.ts
@@ -1,4 +1,4 @@
-import { camelToSnake } from '@clerk/shared/utils';
+import { camelToSnake } from '@clerk/common';
 import type { Clerk, ClerkAPIErrorJSON, ClientJSON } from '@clerk/types';
 import qs from 'qs';
 
diff --git a/packages/clerk-js/src/core/resources/EmailAddress.ts b/packages/clerk-js/src/core/resources/EmailAddress.ts
index 49c6984f3c5..cd80793e3c3 100644
--- a/packages/clerk-js/src/core/resources/EmailAddress.ts
+++ b/packages/clerk-js/src/core/resources/EmailAddress.ts
@@ -1,4 +1,4 @@
-import { Poller } from '@clerk/shared/utils/poller';
+import { Poller } from '@clerk/common';
 import type {
   AttemptEmailAddressVerificationParams,
   CreateMagicLinkFlowReturn,
diff --git a/packages/clerk-js/src/core/resources/ExternalAccount.ts b/packages/clerk-js/src/core/resources/ExternalAccount.ts
index c131d5b8a1d..37828b49dc0 100644
--- a/packages/clerk-js/src/core/resources/ExternalAccount.ts
+++ b/packages/clerk-js/src/core/resources/ExternalAccount.ts
@@ -1,4 +1,4 @@
-import { titleize } from '@clerk/shared/utils/string';
+import { titleize } from '@clerk/common';
 import type { ExternalAccountJSON, ExternalAccountResource, OAuthProvider, VerificationResource } from '@clerk/types';
 
 import { BaseResource } from './Base';
diff --git a/packages/clerk-js/src/core/resources/Session.ts b/packages/clerk-js/src/core/resources/Session.ts
index a28bf8eae00..54383138708 100644
--- a/packages/clerk-js/src/core/resources/Session.ts
+++ b/packages/clerk-js/src/core/resources/Session.ts
@@ -1,4 +1,4 @@
-import { deepSnakeToCamel } from '@clerk/shared/utils';
+import { deepSnakeToCamel } from '@clerk/common';
 import type { ActJWTClaim, PublicUserData, SessionJSON, SessionResource, SessionStatus } from '@clerk/types';
 import { GetToken, GetTokenOptions, UserResource } from '@clerk/types/src';
 
diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts
index 257c6222cf0..76a41cd7767 100644
--- a/packages/clerk-js/src/core/resources/SignIn.ts
+++ b/packages/clerk-js/src/core/resources/SignIn.ts
@@ -1,5 +1,5 @@
-import { deepSnakeToCamel } from '@clerk/shared/utils/object';
-import { Poller } from '@clerk/shared/utils/poller';
+import { deepSnakeToCamel } from '@clerk/common';
+import { Poller } from '@clerk/common';
 import type {
   AttemptFirstFactorParams,
   AttemptSecondFactorParams,
diff --git a/packages/clerk-js/src/core/resources/SignUp.ts b/packages/clerk-js/src/core/resources/SignUp.ts
index 3e14f6e8aac..5348791e21d 100644
--- a/packages/clerk-js/src/core/resources/SignUp.ts
+++ b/packages/clerk-js/src/core/resources/SignUp.ts
@@ -1,4 +1,4 @@
-import { Poller } from '@clerk/shared/utils/poller';
+import { Poller } from '@clerk/common';
 import type {
   AttemptEmailAddressVerificationParams,
   AttemptPhoneNumberVerificationParams,
diff --git a/packages/clerk-js/src/ui/Components.tsx b/packages/clerk-js/src/ui/Components.tsx
index 6f28dbadd1c..66ad14bcbb1 100644
--- a/packages/clerk-js/src/ui/Components.tsx
+++ b/packages/clerk-js/src/ui/Components.tsx
@@ -1,4 +1,3 @@
-// import { Modal } from '@clerk/shared/components/modal';
 import type { Appearance, Clerk, ClerkOptions, EnvironmentResource, SignInProps, SignUpProps } from '@clerk/types';
 import { UserProfileProps } from '@clerk/types/src';
 import React from 'react';
diff --git a/packages/clerk-js/src/ui/SignUp/signUpFormHelpers.ts b/packages/clerk-js/src/ui/SignUp/signUpFormHelpers.ts
index 46b0d06ac83..fe152641d54 100644
--- a/packages/clerk-js/src/ui/SignUp/signUpFormHelpers.ts
+++ b/packages/clerk-js/src/ui/SignUp/signUpFormHelpers.ts
@@ -1,4 +1,4 @@
-import { camelToSnake } from '@clerk/shared/utils';
+import { camelToSnake } from '@clerk/common';
 import type { Attributes, SignUpResource } from '@clerk/types';
 import { UserSettingsResource } from '@clerk/types';
 
diff --git a/packages/clerk-js/src/ui/UserProfile/ActiveDevicesSection.tsx b/packages/clerk-js/src/ui/UserProfile/ActiveDevicesSection.tsx
index 3ea07a57afe..65ddad501d0 100644
--- a/packages/clerk-js/src/ui/UserProfile/ActiveDevicesSection.tsx
+++ b/packages/clerk-js/src/ui/UserProfile/ActiveDevicesSection.tsx
@@ -1,4 +1,4 @@
-import { formatRelative } from '@clerk/shared/utils/date';
+import { formatRelative } from '@clerk/common';
 import { SessionWithActivitiesResource } from '@clerk/types';
 import React from 'react';
 
diff --git a/packages/clerk-js/src/ui/common/authPropHelpers.ts b/packages/clerk-js/src/ui/common/authPropHelpers.ts
index 40cdac89402..784bdcaba6a 100644
--- a/packages/clerk-js/src/ui/common/authPropHelpers.ts
+++ b/packages/clerk-js/src/ui/common/authPropHelpers.ts
@@ -1,4 +1,4 @@
-import { camelToSnake } from '@clerk/shared/utils';
+import { camelToSnake } from '@clerk/common';
 import type { DisplayConfigResource } from '@clerk/types';
 import type { ParsedQs } from 'qs';
 import qs from 'qs';
diff --git a/packages/clerk-js/src/ui/common/withRedirectToHome.test.tsx b/packages/clerk-js/src/ui/common/withRedirectToHome.test.tsx
index 82a136dbfb5..abfa49bf303 100644
--- a/packages/clerk-js/src/ui/common/withRedirectToHome.test.tsx
+++ b/packages/clerk-js/src/ui/common/withRedirectToHome.test.tsx
@@ -1,4 +1,4 @@
-import { render, screen } from '@clerk/shared/testUtils';
+import { render, screen } from '@clerk/common/testUtils';
 import { EnvironmentResource } from '@clerk/types';
 import React from 'react';
 
diff --git a/packages/clerk-js/src/ui/contexts/CoreUserContext.tsx b/packages/clerk-js/src/ui/contexts/CoreUserContext.tsx
index 8ddb62ff677..69749568f23 100644
--- a/packages/clerk-js/src/ui/contexts/CoreUserContext.tsx
+++ b/packages/clerk-js/src/ui/contexts/CoreUserContext.tsx
@@ -1,5 +1,5 @@
 import { UserResource } from '@clerk/types';
-import * as React from 'react';
+import React from 'react';
 
 import { clerkCoreErrorUserIsNotDefined } from '../../core/errors';
 import { assertContextExists } from './utils';
diff --git a/packages/clerk-js/src/ui/elements/Avatar.tsx b/packages/clerk-js/src/ui/elements/Avatar.tsx
index 66d410936a7..8aed67b9e29 100644
--- a/packages/clerk-js/src/ui/elements/Avatar.tsx
+++ b/packages/clerk-js/src/ui/elements/Avatar.tsx
@@ -1,4 +1,4 @@
-import { isRetinaDisplay } from '@clerk/shared/utils/isRetinaDisplay';
+import { isRetinaDisplay } from '@clerk/common';
 import React from 'react';
 
 import { BoringAvatar } from '../common/BoringAvatar';
diff --git a/packages/clerk-js/src/ui/hooks/useSupportEmail.test.tsx b/packages/clerk-js/src/ui/hooks/useSupportEmail.test.tsx
index 11454ee7684..ec3d2d3a280 100644
--- a/packages/clerk-js/src/ui/hooks/useSupportEmail.test.tsx
+++ b/packages/clerk-js/src/ui/hooks/useSupportEmail.test.tsx
@@ -1,4 +1,4 @@
-import { renderHook } from '@clerk/shared/testUtils';
+import { renderHook } from '@clerk/common/testUtils';
 
 import { useSupportEmail } from './useSupportEmail';
 
diff --git a/packages/clerk-js/src/ui/router/HashRouter.test.tsx b/packages/clerk-js/src/ui/router/HashRouter.test.tsx
index 2c940c77f58..714cb21275f 100644
--- a/packages/clerk-js/src/ui/router/HashRouter.test.tsx
+++ b/packages/clerk-js/src/ui/router/HashRouter.test.tsx
@@ -1,4 +1,4 @@
-import { act, render, screen, userEvent } from '@clerk/shared/testUtils';
+import { act, render, screen, userEvent } from '@clerk/common/testUtils';
 import React from 'react';
 
 import Clerk from '../../core/clerk';
diff --git a/packages/clerk-js/src/ui/router/PathRouter.test.tsx b/packages/clerk-js/src/ui/router/PathRouter.test.tsx
index 79df8e4d519..b224f61520d 100644
--- a/packages/clerk-js/src/ui/router/PathRouter.test.tsx
+++ b/packages/clerk-js/src/ui/router/PathRouter.test.tsx
@@ -1,4 +1,4 @@
-import { act, render, screen, userEvent } from '@clerk/shared/testUtils';
+import { act, render, screen, userEvent } from '@clerk/common/testUtils';
 import React from 'react';
 
 import Clerk from '../../core/clerk';
diff --git a/packages/clerk-js/src/ui/router/Switch.test.tsx b/packages/clerk-js/src/ui/router/Switch.test.tsx
index 039fd9cefdb..f130e8d921e 100644
--- a/packages/clerk-js/src/ui/router/Switch.test.tsx
+++ b/packages/clerk-js/src/ui/router/Switch.test.tsx
@@ -1,4 +1,4 @@
-import { render, screen } from '@clerk/shared/testUtils';
+import { render, screen } from '@clerk/common/testUtils';
 import React from 'react';
 import { HashRouter, Route, Switch } from 'ui/router';
 
diff --git a/packages/clerk-js/src/ui/router/VirtualRouter.test.tsx b/packages/clerk-js/src/ui/router/VirtualRouter.test.tsx
index 0b9be4c11c9..6d1f09f8e39 100644
--- a/packages/clerk-js/src/ui/router/VirtualRouter.test.tsx
+++ b/packages/clerk-js/src/ui/router/VirtualRouter.test.tsx
@@ -1,4 +1,4 @@
-import { act, render, screen, userEvent } from '@clerk/shared/testUtils';
+import { act, render, screen, userEvent } from '@clerk/common/testUtils';
 import React from 'react';
 
 import { Route, useRouter, VirtualRouter } from './';
diff --git a/packages/clerk-js/src/ui/router/__mocks__/RouteContext.tsx b/packages/clerk-js/src/ui/router/__mocks__/RouteContext.tsx
index 7693d51fe48..e41505f0b03 100644
--- a/packages/clerk-js/src/ui/router/__mocks__/RouteContext.tsx
+++ b/packages/clerk-js/src/ui/router/__mocks__/RouteContext.tsx
@@ -1,4 +1,4 @@
-import { noop } from '@clerk/shared/utils';
+import { noop } from '@clerk/common';
 
 export const useRouter = () => ({
   resolve: jest.fn(() => ({
diff --git a/packages/clerk-js/src/utils/cookies/client.ts b/packages/clerk-js/src/utils/cookies/client.ts
index 068388d3874..fcf45fae2d9 100644
--- a/packages/clerk-js/src/utils/cookies/client.ts
+++ b/packages/clerk-js/src/utils/cookies/client.ts
@@ -1,4 +1,4 @@
-import { createCookieHandler } from '@clerk/shared/utils';
+import { createCookieHandler } from '@clerk/common';
 
 const CLIENT_COOKIE_NAME = '__client';
 
diff --git a/packages/clerk-js/src/utils/cookies/client_uat.ts b/packages/clerk-js/src/utils/cookies/client_uat.ts
index 7bd8476087c..e68ba258780 100644
--- a/packages/clerk-js/src/utils/cookies/client_uat.ts
+++ b/packages/clerk-js/src/utils/cookies/client_uat.ts
@@ -1,4 +1,4 @@
-import { createCookieHandler } from '@clerk/shared/utils';
+import { createCookieHandler } from '@clerk/common';
 
 const CLIENT_UAT_COOKIE_NAME = '__client_uat';
 
diff --git a/packages/clerk-js/src/utils/cookies/handler.ts b/packages/clerk-js/src/utils/cookies/handler.ts
index 31cfb2d3fef..ada8c345759 100644
--- a/packages/clerk-js/src/utils/cookies/handler.ts
+++ b/packages/clerk-js/src/utils/cookies/handler.ts
@@ -1,4 +1,4 @@
-import { addYears } from '@clerk/shared/utils/date';
+import { addYears } from '@clerk/common';
 import type { ClientResource } from '@clerk/types';
 
 import { buildURL, getAllETLDs } from '../url';
diff --git a/packages/clerk-js/src/utils/cookies/initted.ts b/packages/clerk-js/src/utils/cookies/initted.ts
index cba25f67add..87c877fee14 100644
--- a/packages/clerk-js/src/utils/cookies/initted.ts
+++ b/packages/clerk-js/src/utils/cookies/initted.ts
@@ -1,4 +1,4 @@
-import { createCookieHandler } from '@clerk/shared/utils';
+import { createCookieHandler } from '@clerk/common';
 
 const INITTED_COOKIE_NAME = '__initted';
 
diff --git a/packages/clerk-js/src/utils/cookies/session.ts b/packages/clerk-js/src/utils/cookies/session.ts
index d1a3b18fd7b..62f912969e3 100644
--- a/packages/clerk-js/src/utils/cookies/session.ts
+++ b/packages/clerk-js/src/utils/cookies/session.ts
@@ -1,4 +1,4 @@
-import { createCookieHandler } from '@clerk/shared/utils';
+import { createCookieHandler } from '@clerk/common';
 
 const SESSION_COOKIE_NAME = '__session';
 
diff --git a/packages/clerk-js/src/utils/ignoreEventValue.test.ts b/packages/clerk-js/src/utils/ignoreEventValue.test.ts
index c426d370aaa..9105559c02c 100644
--- a/packages/clerk-js/src/utils/ignoreEventValue.test.ts
+++ b/packages/clerk-js/src/utils/ignoreEventValue.test.ts
@@ -1,4 +1,4 @@
-import { noop } from '@clerk/shared/testUtils';
+import { noop } from '@clerk/common/testUtils';
 
 import { ignoreEventValue } from './ignoreEventValue';
 
diff --git a/packages/clerk-js/src/utils/pageLifecycle.ts b/packages/clerk-js/src/utils/pageLifecycle.ts
index ffbb4524859..e076ebde932 100644
--- a/packages/clerk-js/src/utils/pageLifecycle.ts
+++ b/packages/clerk-js/src/utils/pageLifecycle.ts
@@ -1,4 +1,4 @@
-import { inClientSide } from '@clerk/shared/utils/ssr';
+import { inClientSide } from '@clerk/common';
 
 const noop = () => {
   //
diff --git a/packages/clerk-js/src/utils/url.ts b/packages/clerk-js/src/utils/url.ts
index dbefb00e26c..b7813226154 100644
--- a/packages/clerk-js/src/utils/url.ts
+++ b/packages/clerk-js/src/utils/url.ts
@@ -1,4 +1,4 @@
-import { camelToSnake, isIPV4Address } from '@clerk/shared/utils/string';
+import { camelToSnake, isIPV4Address } from '@clerk/common';
 import { SignUpResource } from '@clerk/types';
 
 import { loadScript } from '../utils';
diff --git a/packages/common/global.d.ts b/packages/common/global.d.ts
new file mode 100644
index 00000000000..8c7a4b73b56
--- /dev/null
+++ b/packages/common/global.d.ts
@@ -0,0 +1,6 @@
+export {};
+
+declare global {
+  const PACKAGE_VERSION: string;
+  const __DEV__: boolean;
+}
diff --git a/packages/common/package.json b/packages/common/package.json
new file mode 100644
index 00000000000..43b815a5a31
--- /dev/null
+++ b/packages/common/package.json
@@ -0,0 +1,39 @@
+{
+  "name": "@clerk/common",
+  "version": "0.0.1",
+  "description": "Internal package utils used by the Clerk SDKs",
+  "types": "./dist/types/index.d.ts",
+  "main": "./dist/index.js",
+  "module": "./dist/index.mjs",
+  "files": [
+    "dist",
+    "testUtils"
+  ],
+  "scripts": {
+    "dev": "tsup --watch",
+    "build": "tsup --env.NODE_ENV production",
+    "clean": "rimraf ./dist",
+    "lint": "eslint .",
+    "test": "vitest run",
+    "test:watch": "vitest"
+  },
+  "devDependencies": {
+    "js-cookie": "^3.0.1",
+    "@clerk/types": "^3.10.1",
+    "@types/js-cookie": "^3.0.2",
+    "tsup": "^6.2.3",
+    "typescript": "*",
+    "vitest": "^0.23.4"
+  },
+  "peerDependencies": {
+    "@testing-library/dom": "^7.28.1",
+    "@testing-library/jest-dom": "^5.11.6",
+    "@testing-library/react": "^11.2.1",
+    "@testing-library/react-hooks": "^3.4.2",
+    "@testing-library/user-event": "^12.2.2",
+    "react": "17.0.2",
+    "react-dom": "17.0.2"
+  },
+  "author": "",
+  "license": "ISC"
+}
diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts
new file mode 100644
index 00000000000..04bca77e0de
--- /dev/null
+++ b/packages/common/src/index.ts
@@ -0,0 +1 @@
+export * from './utils';
diff --git a/packages/common/src/testUtils/index.ts b/packages/common/src/testUtils/index.ts
new file mode 100644
index 00000000000..f6f5b15ff09
--- /dev/null
+++ b/packages/common/src/testUtils/index.ts
@@ -0,0 +1 @@
+export * from './testUtils';
diff --git a/packages/common/src/testUtils/testUtils.ts b/packages/common/src/testUtils/testUtils.ts
new file mode 100644
index 00000000000..7917101fc9c
--- /dev/null
+++ b/packages/common/src/testUtils/testUtils.ts
@@ -0,0 +1,36 @@
+import '@testing-library/jest-dom/extend-expect';
+
+import { render, RenderOptions } from '@testing-library/react';
+import React from 'react';
+import renderer from 'react-test-renderer';
+
+import { noop } from '../utils';
+
+// Wrap components with test providers
+const customRender = (ui: React.ReactElement, options?: RenderOptions) => {
+  return render(ui, options);
+};
+
+// To be used for structural snapshot testing
+const renderJSON = (c: React.ReactElement) => renderer.create(c).toJSON();
+
+// To be used for structural snapshot testing after the first rerender on mount
+const renderJSONAfterFirstAct = (c: React.ReactElement) => {
+  let root;
+
+  renderer.act(() => {
+    root = renderer.create(c);
+  });
+
+  // @ts-ignore
+  return root.toJSON();
+};
+
+// Re-export everything
+export * from '@testing-library/react';
+export { act as actHook, renderHook } from '@testing-library/react-hooks';
+export { default as userEvent } from '@testing-library/user-event';
+export { mocked } from 'jest-mock';
+
+// Override render method
+export { customRender as render, renderJSON, renderJSONAfterFirstAct, noop };
diff --git a/packages/common/src/utils/array.test.ts b/packages/common/src/utils/array.test.ts
new file mode 100644
index 00000000000..07854bdc440
--- /dev/null
+++ b/packages/common/src/utils/array.test.ts
@@ -0,0 +1,17 @@
+import { toSentence } from './array';
+
+describe.concurrent('toSentence', () => {
+  it('returns a single item as-is', () => {
+    expect(toSentence(['xyz'])).toBe('xyz');
+    expect(toSentence(['abc'])).toBe('abc');
+  });
+
+  it('joins multiple items but the last with a comma and the last with ", or"', () => {
+    expect(toSentence(['abc', 'def'])).toBe('abc, or def');
+    expect(toSentence(['qwe', 'zxc', 'asd'])).toBe('qwe, zxc, or asd');
+  });
+
+  it('returns empty string if passed an empty array', () => {
+    expect(toSentence([])).toBe('');
+  });
+});
diff --git a/packages/common/src/utils/array.ts b/packages/common/src/utils/array.ts
new file mode 100644
index 00000000000..6e72606e37e
--- /dev/null
+++ b/packages/common/src/utils/array.ts
@@ -0,0 +1,12 @@
+export const toSentence = (items: string[]): string => {
+  // TODO: Once Safari supports it, use Intl.ListFormat
+  if (items.length == 0) {
+    return '';
+  }
+  if (items.length == 1) {
+    return items[0];
+  }
+  let sentence = items.slice(0, -1).join(', ');
+  sentence += `, or ${items.slice(-1)}`;
+  return sentence;
+};
diff --git a/packages/common/src/utils/browser.test.ts b/packages/common/src/utils/browser.test.ts
new file mode 100644
index 00000000000..8c06171c58f
--- /dev/null
+++ b/packages/common/src/utils/browser.test.ts
@@ -0,0 +1,7 @@
+import { inBrowser } from './browser';
+
+describe.concurrent('inBrowser()', () => {
+  it('returns true if window is defined', () => {
+    expect(inBrowser()).toBe(true);
+  });
+});
diff --git a/packages/common/src/utils/browser.ts b/packages/common/src/utils/browser.ts
new file mode 100644
index 00000000000..442f85e93e4
--- /dev/null
+++ b/packages/common/src/utils/browser.ts
@@ -0,0 +1,3 @@
+export function inBrowser(): boolean {
+  return typeof window !== 'undefined';
+}
diff --git a/packages/common/src/utils/color/cssColorUtils.test.ts b/packages/common/src/utils/color/cssColorUtils.test.ts
new file mode 100644
index 00000000000..bc5d4a4c1dd
--- /dev/null
+++ b/packages/common/src/utils/color/cssColorUtils.test.ts
@@ -0,0 +1,71 @@
+import { Color } from '@clerk/types';
+
+import { colorToSameTypeString, hexStringToRgbaColor, stringToHslaColor, stringToSameTypeColor } from './cssColorUtils';
+
+describe.concurrent('stringToHslaColor(color)', function () {
+  const hsla = { h: 195, s: 1, l: 0.5 };
+  const cases: Array<[string, Color | null]> = [
+    ['', null],
+    ['transparent', { h: 0, s: 0, l: 0, a: 0 }],
+    ['#00bfff', hsla],
+    ['00bfff', hsla],
+    ['rgb(0, 191, 255)', hsla],
+    ['rgba(0, 191, 255, 0.3)', { ...hsla, a: 0.3 }],
+  ];
+
+  it.each(cases)('.stringToHslaColor(%s) => %s', (a, expected) => {
+    expect(stringToHslaColor(a)).toEqual(expected);
+  });
+});
+
+describe.concurrent('hexStringToRgbaColor(color)', function () {
+  const cases: Array<[string, Color | null]> = [
+    ['#00bfff', { r: 0, g: 191, b: 255 }],
+    ['00bfff', { r: 0, g: 191, b: 255 }],
+  ];
+
+  it.each(cases)('.hexStringToRgbaColor(%s) => %s', (a, expected) => {
+    expect(hexStringToRgbaColor(a)).toEqual(expected);
+  });
+});
+
+describe.concurrent('stringToSameTypeColor(color)', function () {
+  const cases: Array<[string, Color | null]> = [
+    ['', ''],
+    ['invalid', ''],
+    ['12ff12', '#12ff12'],
+    ['#12ff12', '#12ff12'],
+    ['1ff', '#1ff'],
+    ['transparent', 'transparent'],
+    ['rgb(100,100,100)', { r: 100, g: 100, b: 100, a: undefined }],
+    ['rgba(100,100,100,0.5)', { r: 100, g: 100, b: 100, a: 0.5 }],
+    ['rgb(100,100,100)', { r: 100, g: 100, b: 100, a: undefined }],
+    ['rgba(100,100,100,0.5)', { r: 100, g: 100, b: 100, a: 0.5 }],
+    ['hsl(244,66%,33%)', { h: 244, s: 0.66, l: 0.33, a: undefined }],
+    ['hsla(244,66%,33%,0.5)', { h: 244, s: 0.66, l: 0.33, a: 0.5 }],
+    ['hsl(244,66%,33)', ''],
+    ['hsla(244,66%,33,0.5)', ''],
+  ];
+
+  it.each(cases)('.stringToSameTypeColor(%s) => %s', (a, expected) => {
+    expect(stringToSameTypeColor(a)).toEqual(expected);
+  });
+});
+
+describe.concurrent('colorToSameTypeString(color)', function () {
+  const cases: Array<[Color, string]> = [
+    ['', ''],
+    ['invalid', ''],
+    ['#12ff12', '#12ff12'],
+    ['#12ff12', '#12ff12'],
+    ['#1ff', '#1ff'],
+    [{ r: 100, g: 100, b: 100, a: undefined }, 'rgb(100,100,100)'],
+    [{ r: 100, g: 100, b: 100, a: 0.5 }, 'rgba(100,100,100,0.5)'],
+    [{ h: 100, s: 0.55, l: 0.33, a: undefined }, 'hsl(100,55%,33%)'],
+    [{ h: 100, s: 1, l: 1, a: 0.5 }, 'hsla(100,100%,100%,0.5)'],
+  ];
+
+  it.each(cases)('.colorToSameTypeString(%s) => %s', (a, expected) => {
+    expect(colorToSameTypeString(a)).toEqual(expected);
+  });
+});
diff --git a/packages/common/src/utils/color/cssColorUtils.ts b/packages/common/src/utils/color/cssColorUtils.ts
new file mode 100644
index 00000000000..51b8b59c7c6
--- /dev/null
+++ b/packages/common/src/utils/color/cssColorUtils.ts
@@ -0,0 +1,151 @@
+import { Color, HslaColor, RgbaColor, TransparentColor } from '@clerk/types';
+
+import {
+  isHSLColor,
+  isRGBColor,
+  isTransparent,
+  isValidHexString,
+  isValidHslaString,
+  isValidRgbaString,
+} from './predicates';
+
+const CLEAN_HSLA_REGEX = /[hsla()]/g;
+const CLEAN_RGBA_REGEX = /[rgba()]/g;
+
+export const stringToHslaColor = (value: string): HslaColor | null => {
+  if (value === 'transparent') {
+    return { h: 0, s: 0, l: 0, a: 0 };
+  }
+
+  if (isValidHexString(value)) {
+    return hexStringToHslaColor(value);
+  }
+
+  if (isValidHslaString(value)) {
+    return parseHslaString(value);
+  }
+
+  if (isValidRgbaString(value)) {
+    return rgbaStringToHslaColor(value);
+  }
+
+  return null;
+};
+
+export const stringToSameTypeColor = (value: string): Color => {
+  value = value.trim();
+  if (isValidHexString(value)) {
+    return value.startsWith('#') ? value : `#${value}`;
+  }
+
+  if (isValidRgbaString(value)) {
+    return parseRgbaString(value);
+  }
+
+  if (isValidHslaString(value)) {
+    return parseHslaString(value);
+  }
+
+  if (isTransparent(value)) {
+    return value;
+  }
+  return '';
+};
+
+export const colorToSameTypeString = (color: Color): string | TransparentColor => {
+  if (typeof color === 'string' && (isValidHexString(color) || isTransparent(color))) {
+    return color;
+  }
+
+  if (isRGBColor(color)) {
+    return rgbaColorToRgbaString(color);
+  }
+
+  if (isHSLColor(color)) {
+    return hslaColorToHslaString(color);
+  }
+
+  return '';
+};
+
+export const hexStringToRgbaColor = (hex: string): RgbaColor => {
+  hex = hex.replace('#', '');
+  const r = parseInt(hex.substring(0, 2), 16);
+  const g = parseInt(hex.substring(2, 4), 16);
+  const b = parseInt(hex.substring(4, 6), 16);
+  return { r, g, b };
+};
+
+const rgbaColorToRgbaString = (color: RgbaColor): string => {
+  const { a, b, g, r } = color;
+  return color.a === 0 ? 'transparent' : color.a != undefined ? `rgba(${r},${g},${b},${a})` : `rgb(${r},${g},${b})`;
+};
+
+const hslaColorToHslaString = (color: HslaColor): string => {
+  const { h, s, l, a } = color;
+  const sPerc = Math.round(s * 100);
+  const lPerc = Math.round(l * 100);
+  return color.a === 0
+    ? 'transparent'
+    : color.a != undefined
+    ? `hsla(${h},${sPerc}%,${lPerc}%,${a})`
+    : `hsl(${h},${sPerc}%,${lPerc}%)`;
+};
+
+const hexStringToHslaColor = (hex: string): HslaColor => {
+  const rgbaString = colorToSameTypeString(hexStringToRgbaColor(hex));
+  return rgbaStringToHslaColor(rgbaString);
+};
+
+const rgbaStringToHslaColor = (rgba: string): HslaColor => {
+  const rgbaColor = parseRgbaString(rgba);
+  const r = rgbaColor.r / 255;
+  const g = rgbaColor.g / 255;
+  const b = rgbaColor.b / 255;
+
+  const max = Math.max(r, g, b),
+    min = Math.min(r, g, b);
+  let h, s;
+  const l = (max + min) / 2;
+
+  if (max == min) {
+    h = s = 0;
+  } else {
+    const d = max - min;
+    s = l >= 0.5 ? d / (2 - (max + min)) : d / (max + min);
+    switch (max) {
+      case r:
+        h = ((g - b) / d) * 60;
+        break;
+      case g:
+        h = ((b - r) / d + 2) * 60;
+        break;
+      default:
+        h = ((r - g) / d + 4) * 60;
+        break;
+    }
+  }
+
+  const res: HslaColor = { h: Math.round(h), s, l };
+  const a = rgbaColor.a;
+  if (a != undefined) {
+    res.a = a;
+  }
+  return res;
+};
+
+const parseRgbaString = (str: string): RgbaColor => {
+  const [r, g, b, a] = str
+    .replace(CLEAN_RGBA_REGEX, '')
+    .split(',')
+    .map(c => Number.parseFloat(c));
+  return { r, g, b, a };
+};
+
+const parseHslaString = (str: string): HslaColor => {
+  const [h, s, l, a] = str
+    .replace(CLEAN_HSLA_REGEX, '')
+    .split(',')
+    .map(c => Number.parseFloat(c));
+  return { h, s: s / 100, l: l / 100, a };
+};
diff --git a/packages/common/src/utils/color/index.ts b/packages/common/src/utils/color/index.ts
new file mode 100644
index 00000000000..738532889d3
--- /dev/null
+++ b/packages/common/src/utils/color/index.ts
@@ -0,0 +1,2 @@
+export * from './cssColorUtils';
+export * from './predicates';
diff --git a/packages/common/src/utils/color/predicates.ts b/packages/common/src/utils/color/predicates.ts
new file mode 100644
index 00000000000..c17424f1710
--- /dev/null
+++ b/packages/common/src/utils/color/predicates.ts
@@ -0,0 +1,37 @@
+import { Color, HslaColor, RgbaColor, TransparentColor } from '@clerk/types';
+
+const IS_HEX_COLOR_REGEX = /^#?([A-F0-9]{6}|[A-F0-9]{3})$/i;
+
+const IS_RGB_COLOR_REGEX = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/i;
+const IS_RGBA_COLOR_REGEX = /^rgba\((\d+),\s*(\d+),\s*(\d+)(,\s*\d+(\.\d+)?)\)$/i;
+
+const IS_HSL_COLOR_REGEX = /^hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)$/i;
+const IS_HSLA_COLOR_REGEX = /^hsla\((\d+),\s*([\d.]+)%,\s*([\d.]+)%(,\s*\d+(\.\d+)?)*\)$/i;
+
+export const isValidHexString = (s: string) => {
+  return !!s.match(IS_HEX_COLOR_REGEX);
+};
+
+export const isValidRgbaString = (s: string) => {
+  return !!(s.match(IS_RGB_COLOR_REGEX) || s.match(IS_RGBA_COLOR_REGEX));
+};
+
+export const isValidHslaString = (s: string) => {
+  return !!s.match(IS_HSL_COLOR_REGEX) || !!s.match(IS_HSLA_COLOR_REGEX);
+};
+
+export const isRGBColor = (c: Color): c is RgbaColor => {
+  return typeof c !== 'string' && 'r' in c;
+};
+
+export const isHSLColor = (c: Color): c is HslaColor => {
+  return typeof c !== 'string' && 'h' in c;
+};
+
+export const isTransparent = (c: Color): c is TransparentColor => {
+  return c === 'transparent';
+};
+
+export const hasAlpha = (color: Color): boolean => {
+  return typeof color !== 'string' && color.a != undefined && color.a < 1;
+};
diff --git a/packages/common/src/utils/cookies.ts b/packages/common/src/utils/cookies.ts
new file mode 100644
index 00000000000..ee87cf233d9
--- /dev/null
+++ b/packages/common/src/utils/cookies.ts
@@ -0,0 +1,27 @@
+import Cookies from 'js-cookie';
+
+type LocationAttributes = {
+  path?: string;
+  domain?: string;
+};
+
+export function createCookieHandler(cookieName: string) {
+  return {
+    get() {
+      return Cookies.get(cookieName);
+    },
+    /**
+     * Setting a cookie will use some defaults such as path being set to "/".
+     */
+    set(newValue: string, options: Cookies.CookieAttributes = {}) {
+      return Cookies.set(cookieName, newValue, options);
+    },
+    /**
+     * On removing a cookie, you have to pass the exact same path/domain attributes used to set it initially
+     * @see https://github.com/js-cookie/js-cookie#basic-usage
+     */
+    remove(locationAttributes?: LocationAttributes) {
+      Cookies.remove(cookieName, locationAttributes);
+    },
+  };
+}
diff --git a/packages/common/src/utils/date.test.ts b/packages/common/src/utils/date.test.ts
new file mode 100644
index 00000000000..d93b4eb1418
--- /dev/null
+++ b/packages/common/src/utils/date.test.ts
@@ -0,0 +1,67 @@
+import { addYears, dateTo12HourTime, differenceInCalendarDays, formatRelative } from './date';
+
+describe.concurrent('date utils', () => {
+  describe.concurrent('dateTo12HourTime(date)', () => {
+    const cases: Array<[Date | undefined, string]> = [
+      [undefined, ''],
+      [new Date('1/1/2020 23:15'), '11:15 PM'],
+      [new Date('1/1/2020 11:15'), '11:15 AM'],
+      [new Date('1/1/2020 01:59'), '01:59 AM'],
+      [new Date('1/1/2020 13:59'), '01:59 PM'],
+      [new Date('1/1/2020 00:59'), '12:59 AM'],
+    ];
+
+    it.each(cases)('.dateTo12HourTime(%s) => %s', (a, expected) => {
+      expect(dateTo12HourTime(a as any)).toBe(expected);
+    });
+  });
+
+  describe.concurrent('differenceInCalendarDays(date1, date2)', () => {
+    const cases: Array<[Date | undefined, Date, { absolute: boolean }, number]> = [
+      [undefined, new Date(), { absolute: true }, 0],
+      [new Date('1/1/2020'), new Date('1/2/2020'), { absolute: true }, 1],
+      [new Date('1/1/2020'), new Date('1/3/2020'), { absolute: true }, 2],
+      [new Date('1/30/2020'), new Date('1/31/2020'), { absolute: true }, 1],
+      [new Date('1/30/2020'), new Date('2/1/2020'), { absolute: true }, 2],
+      [new Date('1/1/2020'), new Date('2/1/2020'), { absolute: true }, 31],
+      [new Date('1/1/2020'), new Date('1/2/2020'), { absolute: false }, 1],
+      [new Date('1/1/2020'), new Date('1/5/2020'), { absolute: false }, 4],
+      [new Date('1/5/2020'), new Date('1/1/2020'), { absolute: true }, 4],
+      [new Date('1/5/2020'), new Date('1/1/2020'), { absolute: false }, -4],
+    ];
+
+    it.each(cases)('.differenceInCalendarDays(%s,%s) => %s', (a, b, c, expected) => {
+      expect(differenceInCalendarDays(a as Date, b, c)).toBe(expected);
+    });
+  });
+
+  describe.concurrent('formatRelative(date)', () => {
+    const cases: Array<[Date | undefined, Date | undefined, string]> = [
+      [undefined, undefined, ''],
+      [new Date('1/1/2020 23:15'), new Date('1/1/2020'), 'today at 11:15 PM'],
+      [new Date('1/5/2020 23:15'), new Date('1/6/2020'), 'yesterday at 11:15 PM'],
+      [new Date('1/3/2020 23:15'), new Date('1/6/2020'), 'last Friday at 11:15 PM'],
+      [new Date('1/7/2020 23:15'), new Date('1/6/2020'), 'tomorrow at 11:15 PM'],
+      [new Date('1/10/2020 23:15'), new Date('1/6/2020'), 'Friday at 11:15 PM'],
+      [new Date('12/10/2020 23:15'), new Date('1/6/2020'), '12/10/2020'],
+      [new Date('12/10/2020 23:15'), new Date('1/6/2021'), '12/10/2020'],
+    ];
+
+    it.each(cases)('.formatRelative(%s, %s) => %s', (a, b, expected) => {
+      expect(formatRelative(a as Date, b as Date)).toBe(expected);
+    });
+  });
+
+  describe.concurrent('addYears(date, number)', () => {
+    const cases: Array<[Date, number, Date]> = [
+      [new Date('1/1/2020 23:15'), 1, new Date('1/1/2021 23:15')],
+      [new Date('1/1/2019 23:15'), 1, new Date('1/1/2020 23:15')],
+      [new Date('1/1/2021 23:15'), 100, new Date('1/1/2121 23:15')],
+      [new Date('1/1/2021 23:15'), 0, new Date('1/1/2021 23:15')],
+    ];
+
+    it.each(cases)('.addYears(%s, %s) => %s', (a, b, expected) => {
+      expect(addYears(a, b)).toStrictEqual(expected);
+    });
+  });
+});
diff --git a/packages/common/src/utils/date.ts b/packages/common/src/utils/date.ts
new file mode 100644
index 00000000000..31402e411e8
--- /dev/null
+++ b/packages/common/src/utils/date.ts
@@ -0,0 +1,81 @@
+const MILLISECONDS_IN_DAY = 86400000;
+const DAYS_EN = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
+
+export function dateTo12HourTime(date: Date): string {
+  if (!date) {
+    return '';
+  }
+  return date.toLocaleString('en-US', {
+    hour: '2-digit',
+    minute: 'numeric',
+    hour12: true,
+  });
+}
+
+export function differenceInCalendarDays(a: Date, b: Date, { absolute = true } = {}): number {
+  if (!a || !b) {
+    return 0;
+  }
+  const utcA = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
+  const utcB = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());
+  const diff = Math.floor((utcB - utcA) / MILLISECONDS_IN_DAY);
+  return absolute ? Math.abs(diff) : diff;
+}
+
+function normalizeDate(d: Date | string | number): Date {
+  try {
+    return new Date(d || new Date());
+  } catch (e) {
+    return new Date();
+  }
+}
+
+/*
+ * Follows date-fns format, see here:
+ * https://date-fns.org/v2.21.1/docs/formatRelative
+ * TODO: support localisation
+ * | Distance to the base date | Result                    |
+ * |---------------------------|---------------------------|
+ * | Previous 6 days           | last Sunday at 04:30 AM   |
+ * | Last day                  | yesterday at 04:30 AM     |
+ * | Same day                  | today at 04:30 AM         |
+ * | Next day                  | tomorrow at 04:30 AM      |
+ * | Next 6 days               | Sunday at 04:30 AM        |
+ * | Other                     | 12/31/2017                |
+ */
+export function formatRelative(date: Date, relativeTo: Date): string {
+  if (!date || !relativeTo) {
+    return '';
+  }
+  const a = normalizeDate(date);
+  const b = normalizeDate(relativeTo);
+  const differenceInDays = differenceInCalendarDays(b, a, { absolute: false });
+  const time12Hour = dateTo12HourTime(a);
+  const dayName = DAYS_EN[a.getDay()];
+
+  if (differenceInDays < -6) {
+    return a.toLocaleDateString();
+  }
+  if (differenceInDays < -1) {
+    return `last ${dayName} at ${time12Hour}`;
+  }
+  if (differenceInDays === -1) {
+    return `yesterday at ${time12Hour}`;
+  }
+  if (differenceInDays === 0) {
+    return `today at ${time12Hour}`;
+  }
+  if (differenceInDays === 1) {
+    return `tomorrow at ${time12Hour}`;
+  }
+  if (differenceInDays < 7) {
+    return `${dayName} at ${time12Hour}`;
+  }
+  return a.toLocaleDateString();
+}
+
+export function addYears(initialDate: Date | number | string, yearsToAdd: number): Date {
+  const date = normalizeDate(initialDate);
+  date.setFullYear(date.getFullYear() + yearsToAdd);
+  return date;
+}
diff --git a/packages/common/src/utils/file.ts b/packages/common/src/utils/file.ts
new file mode 100644
index 00000000000..82dc23a7132
--- /dev/null
+++ b/packages/common/src/utils/file.ts
@@ -0,0 +1,18 @@
+/**
+ * Read an expected JSON type File.
+ *
+ * Probably paired with:
+ *  <input type='file' accept='application/JSON' ... />
+ */
+export function readJSONFile(file: File): Promise<unknown> {
+  return new Promise((resolve, reject) => {
+    const reader = new FileReader();
+    reader.addEventListener('load', function () {
+      const result = JSON.parse(reader.result as string);
+      resolve(result);
+    });
+
+    reader.addEventListener('error', reject);
+    reader.readAsText(file);
+  });
+}
diff --git a/packages/common/src/utils/index.ts b/packages/common/src/utils/index.ts
new file mode 100644
index 00000000000..133276ea77c
--- /dev/null
+++ b/packages/common/src/utils/index.ts
@@ -0,0 +1,16 @@
+export * from './array';
+export * from './browser';
+export * from './color';
+export * from './cookies';
+export * from './date';
+export * from './file';
+export * from './index';
+export * from './isRetinaDisplay';
+export * from './localStorageBroadcastChannel';
+export * from './mimeTypeExtensions';
+export * from './noop';
+export * from './object';
+export * from './poller';
+export * from './ssr';
+export * from './string';
+export * from './url';
diff --git a/packages/common/src/utils/isRetinaDisplay.ts b/packages/common/src/utils/isRetinaDisplay.ts
new file mode 100644
index 00000000000..3e35b03f1ae
--- /dev/null
+++ b/packages/common/src/utils/isRetinaDisplay.ts
@@ -0,0 +1,9 @@
+export function isRetinaDisplay(): boolean {
+  if (!window.matchMedia) {
+    return false;
+  }
+  const mq = window.matchMedia(
+    'only screen and (min--moz-device-pixel-ratio: 1.3), only screen and (-o-min-device-pixel-ratio: 2.6/2), only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen  and (min-device-pixel-ratio: 1.3), only screen and (min-resolution: 1.3dppx)',
+  );
+  return (mq && mq.matches) || window.devicePixelRatio > 1;
+}
diff --git a/packages/common/src/utils/localStorageBroadcastChannel.test.ts b/packages/common/src/utils/localStorageBroadcastChannel.test.ts
new file mode 100644
index 00000000000..10c823b4dad
--- /dev/null
+++ b/packages/common/src/utils/localStorageBroadcastChannel.test.ts
@@ -0,0 +1,44 @@
+import { vi } from 'vitest';
+
+import { LocalStorageBroadcastChannel } from './localStorageBroadcastChannel';
+
+const bcName = 'clerk';
+
+describe.concurrent('LocalStorageBroadcastChannel', () => {
+  let localStorageMock;
+  beforeEach(() => {
+    localStorageMock = (() => {
+      const store: Record<string, any> = {};
+      return {
+        setItem: vi.fn((key, value) => {
+          store[key] = value;
+          window.dispatchEvent(new StorageEvent('storage', { key, newValue: value }));
+        }),
+        removeItem: vi.fn(key => {
+          store[key] = undefined;
+          window.dispatchEvent(new Event('storage'));
+        }),
+      };
+    })();
+    Object.defineProperty(window, 'localStorage', { value: localStorageMock });
+  });
+
+  it('notifies other LocalStorageBroadcastChannel with same name', () => {
+    const tab1ClerkBCListener = vi.fn();
+    const tab1DifferentBCListener = vi.fn();
+    const tab2ClerkBCListener = vi.fn();
+
+    const tab1ClerkBC = new LocalStorageBroadcastChannel(bcName);
+    const tab1DifferentBC = new LocalStorageBroadcastChannel('somethingElse');
+    const tab2ClerkBC = new LocalStorageBroadcastChannel(bcName);
+
+    tab1ClerkBC.addEventListener('message', tab1ClerkBCListener);
+    tab1DifferentBC.addEventListener('message', tab1DifferentBCListener);
+    tab2ClerkBC.addEventListener('message', tab2ClerkBCListener);
+
+    const message = 'a message from tab1';
+    tab1ClerkBC.postMessage(message);
+    expect(tab1DifferentBCListener).not.toHaveBeenCalled();
+    expect(tab2ClerkBCListener).toHaveBeenCalled();
+  });
+});
diff --git a/packages/common/src/utils/localStorageBroadcastChannel.ts b/packages/common/src/utils/localStorageBroadcastChannel.ts
new file mode 100644
index 00000000000..3c88c272417
--- /dev/null
+++ b/packages/common/src/utils/localStorageBroadcastChannel.ts
@@ -0,0 +1,52 @@
+type Listener<T> = (e: MessageEvent<T>) => void;
+
+const KEY_PREFIX = '__lsbc__';
+
+export class LocalStorageBroadcastChannel<E> {
+  private readonly eventTarget = window;
+  private readonly channelKey: string;
+
+  constructor(name: string) {
+    this.channelKey = KEY_PREFIX + name;
+    this.setupLocalStorageListener();
+  }
+
+  public postMessage = (data: E): void => {
+    try {
+      localStorage.setItem(this.channelKey, JSON.stringify(data));
+      localStorage.removeItem(this.channelKey);
+    } catch (e) {
+      //
+    }
+  };
+
+  public addEventListener = (eventName: 'message', listener: Listener<E>): void => {
+    this.eventTarget.addEventListener(this.prefixEventName(eventName), e => {
+      listener(e as MessageEvent);
+    });
+  };
+
+  private setupLocalStorageListener = () => {
+    const notifyListeners = (e: StorageEvent) => {
+      if (e.key !== this.channelKey || !e.newValue) {
+        return;
+      }
+
+      try {
+        const data = JSON.parse(e.newValue || '');
+        const event = new MessageEvent(this.prefixEventName('message'), {
+          data,
+        });
+        this.eventTarget.dispatchEvent(event);
+      } catch (e) {
+        //
+      }
+    };
+
+    window.addEventListener('storage', notifyListeners);
+  };
+
+  private prefixEventName(eventName: string): string {
+    return this.channelKey + eventName;
+  }
+}
diff --git a/packages/common/src/utils/mimeTypeExtensions.ts b/packages/common/src/utils/mimeTypeExtensions.ts
new file mode 100644
index 00000000000..3d206056ad6
--- /dev/null
+++ b/packages/common/src/utils/mimeTypeExtensions.ts
@@ -0,0 +1,14 @@
+const MimeTypeToExtensionMap = Object.freeze({
+  'image/png': 'png',
+  'image/jpeg': 'jpg',
+  'image/gif': 'gif',
+  'image/webp': 'webp',
+  'image/x-icon': 'ico',
+  'image/vnd.microsoft.icon': 'ico',
+} as const);
+
+export type SupportedMimeType = keyof typeof MimeTypeToExtensionMap;
+
+export const extension = (mimeType: SupportedMimeType): string => {
+  return MimeTypeToExtensionMap[mimeType];
+};
diff --git a/packages/common/src/utils/noop.ts b/packages/common/src/utils/noop.ts
new file mode 100644
index 00000000000..e65a0290b94
--- /dev/null
+++ b/packages/common/src/utils/noop.ts
@@ -0,0 +1,3 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
+/* eslint-disable @typescript-eslint/no-empty-function */
+export const noop = (..._args: any[]): void => {};
diff --git a/packages/common/src/utils/object.test.ts b/packages/common/src/utils/object.test.ts
new file mode 100644
index 00000000000..5229170c2ad
--- /dev/null
+++ b/packages/common/src/utils/object.test.ts
@@ -0,0 +1,145 @@
+import { deepCamelToSnake, deepSnakeToCamel } from './object';
+
+describe.concurrent('camelToSnakeKeys', () => {
+  it('creates a copy and does not modify the original', () => {
+    const original = {
+      an_arr: [{ hello_there: 'hey' }],
+      a_nested_object: { a_message: 'hey' },
+    };
+    const originalCopy = { ...original };
+    const res = deepSnakeToCamel(original);
+    expect(res).toStrictEqual({
+      anArr: [{ helloThere: 'hey' }],
+      aNestedObject: { aMessage: 'hey' },
+    });
+    expect(original).toStrictEqual(originalCopy);
+    expect(original === res).toBeFalsy();
+  });
+
+  it('transforms camelCased keys to snake_cased', () => {
+    expect(deepCamelToSnake({ key: 1, anotherKey: 2 })).toStrictEqual({
+      key: 1,
+      another_key: 2,
+    });
+
+    expect(
+      deepCamelToSnake({
+        key: 1,
+        anotherKey: 2,
+        nestAttribute: { nestedKey: 3 },
+      }),
+    ).toStrictEqual({
+      key: 1,
+      another_key: 2,
+      nest_attribute: {
+        nested_key: 3,
+      },
+    });
+  });
+
+  it('handles null and undefined values', () => {
+    expect(deepCamelToSnake({ key: 1, anotherKey: null })).toStrictEqual({
+      key: 1,
+      another_key: null,
+    });
+
+    expect(
+      deepCamelToSnake({
+        key: 1,
+        anotherKey: 2,
+        nestAttribute: { nestedKey: null },
+      }),
+    ).toStrictEqual({
+      key: 1,
+      another_key: 2,
+      nest_attribute: {
+        nested_key: null,
+      },
+    });
+  });
+
+  it('transforms and removes camelCased keys', () => {
+    const sampleObject = deepCamelToSnake({ key: 1, anotherKey: 2 });
+    expect(sampleObject).not.toHaveProperty('anotherKey');
+    expect(sampleObject).toHaveProperty('another_key');
+  });
+
+  it('deeply transforms objects and arrays to camelCase', () => {
+    const sample = {
+      sessions: [
+        {
+          last_active_at: 1647133602586,
+          user: {
+            primary_web3_wallet_id: null,
+            email_addresses: [
+              {
+                email_address: 'n@ck.dev',
+                verification: {
+                  status: 'verified',
+                  strategy: 'email_link',
+                  expire_at: 1645216476574,
+                },
+                linked_to: [{ type: 'oauth_google', id: 'idn_25QqWb' }],
+              },
+            ],
+            web3_wallets: [],
+            external_accounts: [
+              {
+                identification_id: 'idn_25QqWbzargsao',
+                provider_user_id: '106087',
+              },
+            ],
+          },
+        },
+      ],
+      sign_in_attempt: null,
+    };
+
+    const expected = {
+      sessions: [
+        {
+          user: {
+            primaryWeb3WalletId: null,
+            emailAddresses: [
+              {
+                verification: {
+                  status: 'verified',
+                  strategy: 'email_link',
+                  expireAt: 1645216476574,
+                },
+                emailAddress: 'n@ck.dev',
+                linkedTo: [
+                  {
+                    type: 'oauth_google',
+                    id: 'idn_25QqWb',
+                  },
+                ],
+              },
+            ],
+            web3Wallets: [],
+            externalAccounts: [
+              {
+                identificationId: 'idn_25QqWbzargsao',
+                providerUserId: '106087',
+              },
+            ],
+          },
+          lastActiveAt: 1647133602586,
+        },
+      ],
+      signInAttempt: null,
+    };
+    const res = deepSnakeToCamel(sample);
+    expect(res).toStrictEqual(expected);
+  });
+
+  it('prioritizes the camelCased property', () => {
+    const sampleObject = deepCamelToSnake({ oneKey: 1, one_key: 2 });
+    const anotherSampleObject = deepCamelToSnake({ one_key: 2, oneKey: 1 });
+
+    expect(sampleObject.one_key).toEqual(1);
+    expect(sampleObject).not.toHaveProperty('oneKey');
+    expect(anotherSampleObject.one_key).toEqual(1);
+    expect(anotherSampleObject).not.toHaveProperty('oneKey');
+  });
+});
diff --git a/packages/common/src/utils/object.ts b/packages/common/src/utils/object.ts
new file mode 100644
index 00000000000..d59b9b0c279
--- /dev/null
+++ b/packages/common/src/utils/object.ts
@@ -0,0 +1,48 @@
+import { camelToSnake, snakeToCamel } from './string';
+
+const createDeepObjectTransformer = (transform: any) => {
+  const deepTransform = (obj: any): any => {
+    if (!obj) {
+      return obj;
+    }
+
+    if (Array.isArray(obj)) {
+      return obj.map(el => {
+        if (typeof el === 'object' || Array.isArray(el)) {
+          return deepTransform(el);
+        }
+        return el;
+      });
+    }
+
+    const copy = { ...obj };
+    const keys = Object.keys(copy) as string[];
+    for (const oldName of keys) {
+      const newName = transform(oldName.toString());
+      if (newName !== oldName) {
+        copy[newName] = copy[oldName];
+        delete copy[oldName];
+      }
+      if (typeof copy[newName] === 'object') {
+        copy[newName] = deepTransform(copy[newName]);
+      }
+    }
+    return copy;
+  };
+
+  return deepTransform;
+};
+
+/**
+ * Transforms camelCased objects/ arrays to snake_cased.
+ * This function recursively traverses all objects and arrays of the passed value
+ * camelCased keys are removed.
+ */
+export const deepCamelToSnake = createDeepObjectTransformer(camelToSnake);
+
+/**
+ * Transforms snake_cased objects/ arrays to camelCased.
+ * This function recursively traverses all objects and arrays of the passed value
+ * camelCased keys are removed.
+ */
+export const deepSnakeToCamel = createDeepObjectTransformer(snakeToCamel);
diff --git a/packages/common/src/utils/poller.ts b/packages/common/src/utils/poller.ts
new file mode 100644
index 00000000000..8b24dcf1733
--- /dev/null
+++ b/packages/common/src/utils/poller.ts
@@ -0,0 +1,33 @@
+export type PollerStop = () => void;
+export type PollerCallback = (stop: PollerStop) => Promise<unknown>;
+export type PollerRun = (cb: PollerCallback) => Promise<void>;
+
+type PollerOptions = {
+  delayInMs: number;
+};
+
+export type Poller = {
+  run: PollerRun;
+  stop: PollerStop;
+};
+
+export function Poller({ delayInMs }: PollerOptions = { delayInMs: 1000 }): Poller {
+  let timerId: number | undefined;
+  let stopped = false;
+
+  const stop: PollerStop = () => {
+    clearTimeout(timerId);
+    stopped = true;
+  };
+
+  const run: PollerRun = async cb => {
+    stopped = false;
+    await cb(stop);
+    if (stopped) {
+      return;
+    }
+    timerId = setTimeout(() => run(cb), delayInMs) as any as number;
+  };
+
+  return { run, stop };
+}
diff --git a/packages/common/src/utils/ssr.ts b/packages/common/src/utils/ssr.ts
new file mode 100644
index 00000000000..e0ede1979d2
--- /dev/null
+++ b/packages/common/src/utils/ssr.ts
@@ -0,0 +1,3 @@
+export const inClientSide = (): boolean => {
+  return typeof window !== 'undefined';
+};
diff --git a/packages/common/src/utils/string.test.ts b/packages/common/src/utils/string.test.ts
new file mode 100644
index 00000000000..0d7aaa3f62f
--- /dev/null
+++ b/packages/common/src/utils/string.test.ts
@@ -0,0 +1,20 @@
+import { isIPV4Address, titleize } from './string';
+
+describe.concurrent('isIPV4Address(str)', () => {
+  it('checks if as string is an IP V4', () => {
+    expect(isIPV4Address(null)).toBe(false);
+    expect(isIPV4Address(undefined)).toBe(false);
+    expect(isIPV4Address('')).toBe(false);
+    expect(isIPV4Address('127.0.0.1')).toBe(true);
+  });
+});
+
+describe.concurrent('titleize(str)', () => {
+  it('titleizes the string', () => {
+    expect(titleize(null)).toBe('');
+    expect(titleize(undefined)).toBe('');
+    expect(titleize('')).toBe('');
+    expect(titleize('foo')).toBe('Foo');
+    expect(titleize('foo bar')).toBe('Foo bar');
+  });
+});
diff --git a/packages/common/src/utils/string.ts b/packages/common/src/utils/string.ts
new file mode 100644
index 00000000000..08b8b0d9d86
--- /dev/null
+++ b/packages/common/src/utils/string.ts
@@ -0,0 +1,19 @@
+const IP_V4_ADDRESS_REGEX =
+  /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
+
+export function isIPV4Address(str: string | undefined | null): boolean {
+  return IP_V4_ADDRESS_REGEX.test(str || '');
+}
+
+export function titleize(str: string | undefined | null): string {
+  const s = str || '';
+  return s.charAt(0).toUpperCase() + s.slice(1);
+}
+
+export function snakeToCamel(str: string): string {
+  return str.replace(/([-_][a-z])/g, match => match.toUpperCase().replace(/-|_/, ''));
+}
+
+export function camelToSnake(str: string): string {
+  return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);
+}
diff --git a/packages/common/src/utils/url.test.ts b/packages/common/src/utils/url.test.ts
new file mode 100644
index 00000000000..4a8dd9e0e99
--- /dev/null
+++ b/packages/common/src/utils/url.test.ts
@@ -0,0 +1,16 @@
+import { parseSearchParams } from './url';
+
+describe.concurrent('parseSearchParams(queryString)', () => {
+  it('parses query string and returns a URLSearchParams object', () => {
+    let searchParams = parseSearchParams('');
+    expect(searchParams.get('foo')).toBeNull();
+
+    searchParams = parseSearchParams('foo=42&bar=43');
+    expect(searchParams.get('foo')).toBe('42');
+    expect(searchParams.get('bar')).toBe('43');
+
+    searchParams = parseSearchParams('?foo=42&bar=43');
+    expect(searchParams.get('foo')).toBe('42');
+    expect(searchParams.get('bar')).toBe('43');
+  });
+});
diff --git a/packages/common/src/utils/url.ts b/packages/common/src/utils/url.ts
new file mode 100644
index 00000000000..bc33767cae0
--- /dev/null
+++ b/packages/common/src/utils/url.ts
@@ -0,0 +1,6 @@
+export function parseSearchParams(queryString = ''): URLSearchParams {
+  if (queryString.startsWith('?')) {
+    queryString = queryString.slice(1);
+  }
+  return new URLSearchParams(queryString);
+}
diff --git a/packages/common/testUtils/package.json b/packages/common/testUtils/package.json
new file mode 100644
index 00000000000..61203e7748e
--- /dev/null
+++ b/packages/common/testUtils/package.json
@@ -0,0 +1,6 @@
+{
+  "name": "testUtils",
+  "main": "../dist/testUtils/index.js",
+  "module": "../dist/testUtils/index.mjs",
+  "types": "../dist/types/testUtils/index.d.ts"
+}
diff --git a/packages/common/tsconfig.json b/packages/common/tsconfig.json
new file mode 100644
index 00000000000..de640a6217a
--- /dev/null
+++ b/packages/common/tsconfig.json
@@ -0,0 +1,19 @@
+{
+  "compilerOptions": {
+    "esModuleInterop": true,
+    "forceConsistentCasingInFileNames": true,
+    "isolatedModules": true,
+    "moduleResolution": "node",
+    "preserveWatchOutput": true,
+    "skipLibCheck": true,
+    "strict": true,
+    "emitDeclarationOnly": true,
+    "declaration": true,
+    "declarationMap": true,
+    "outDir": "dist",
+    "resolveJsonModule": true,
+    "declarationDir": "dist/types"
+  },
+  "exclude": ["node_modules"],
+  "include": ["src/index.ts", "src/testUtils/index.ts", "global.d.ts"]
+}
diff --git a/packages/common/tsup.config.ts b/packages/common/tsup.config.ts
new file mode 100644
index 00000000000..c660434d51c
--- /dev/null
+++ b/packages/common/tsup.config.ts
@@ -0,0 +1,19 @@
+import { defineConfig } from 'tsup';
+
+// @ts-expect-error
+import { version } from './package.json';
+
+export default defineConfig(overrideOptions => {
+  const isProd = overrideOptions.env?.NODE_ENV === 'production';
+
+  return {
+    entry: ['src/index.ts', 'src/testUtils/index.ts'],
+    onSuccess: 'tsc',
+    minify: isProd,
+    clean: true,
+    sourcemap: true,
+    format: ['cjs', 'esm'],
+    define: { PACKAGE_VERSION: `"${version}"`, __DEV__: `${!isProd}` },
+    external: ['@testing-library', 'react', 'react-test-renderer'],
+  };
+});
diff --git a/packages/common/vite.config.ts b/packages/common/vite.config.ts
new file mode 100644
index 00000000000..527089358ab
--- /dev/null
+++ b/packages/common/vite.config.ts
@@ -0,0 +1,8 @@
+import { defineConfig } from 'vitest/config';
+
+export default defineConfig({
+  test: {
+    globals: true,
+    environment: 'jsdom',
+  },
+});
diff --git a/packages/react/src/components/SignInButton.test.tsx b/packages/react/src/components/SignInButton.test.tsx
index eb1c695c7cc..de742583d13 100644
--- a/packages/react/src/components/SignInButton.test.tsx
+++ b/packages/react/src/components/SignInButton.test.tsx
@@ -1,4 +1,4 @@
-import { render, screen, userEvent, waitFor } from '@clerk/shared/utils/testUtils';
+import { render, screen, userEvent, waitFor } from '@clerk/common/testUtils';
 import React from 'react';
 
 import { SignInButton } from './SignInButton';
diff --git a/packages/react/src/components/SignInWithMetamaskButton.test.tsx b/packages/react/src/components/SignInWithMetamaskButton.test.tsx
index 35dc28aeed8..39a38c0275e 100644
--- a/packages/react/src/components/SignInWithMetamaskButton.test.tsx
+++ b/packages/react/src/components/SignInWithMetamaskButton.test.tsx
@@ -1,6 +1,6 @@
 /* eslint-disable react/display-name */
 
-import { render, screen, userEvent, waitFor } from '@clerk/shared/utils/testUtils';
+import { render, screen, userEvent, waitFor } from '@clerk/common/testUtils';
 import React from 'react';
 
 import { SignInWithMetamaskButton } from './SignInWithMetamaskButton';
diff --git a/packages/react/src/components/SignOutButton.test.tsx b/packages/react/src/components/SignOutButton.test.tsx
index d8d116087c1..3da21cb4801 100644
--- a/packages/react/src/components/SignOutButton.test.tsx
+++ b/packages/react/src/components/SignOutButton.test.tsx
@@ -1,4 +1,4 @@
-import { render, screen, userEvent, waitFor } from '@clerk/shared/utils/testUtils';
+import { render, screen, userEvent, waitFor } from '@clerk/common/testUtils';
 import React from 'react';
 
 import { SignOutButton } from './SignOutButton';
diff --git a/packages/react/src/components/SignUpButton.test.tsx b/packages/react/src/components/SignUpButton.test.tsx
index 4920978cc54..bacf684f729 100644
--- a/packages/react/src/components/SignUpButton.test.tsx
+++ b/packages/react/src/components/SignUpButton.test.tsx
@@ -1,4 +1,4 @@
-import { render, screen, userEvent, waitFor } from '@clerk/shared/utils/testUtils';
+import { render, screen, userEvent, waitFor } from '@clerk/common/testUtils';
 import React from 'react';
 
 import { SignUpButton } from './SignUpButton';
diff --git a/packages/react/src/utils/useMaxAllowedInstancesGuard.test.tsx b/packages/react/src/utils/useMaxAllowedInstancesGuard.test.tsx
index eec5baf2796..81920fb65f7 100644
--- a/packages/react/src/utils/useMaxAllowedInstancesGuard.test.tsx
+++ b/packages/react/src/utils/useMaxAllowedInstancesGuard.test.tsx
@@ -1,4 +1,4 @@
-import { render } from '@clerk/shared/testUtils';
+import { render } from '@clerk/common/testUtils';
 import React from 'react';
 
 import { useMaxAllowedInstancesGuard, withMaxAllowedInstancesGuard } from './useMaxAllowedInstancesGuard';
diff --git a/packages/shared/package.json b/packages/shared/package.json
index 148694f5e33..cfd07327910 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -15,9 +15,8 @@
     "@popperjs/core": "^2.5.4",
     "@svgr/webpack": "^6.2.1",
     "core-js": "^3.18.3",
-    "js-cookie": "^2.2.1",
-    "react": "17.0.2",
     "react-color": "2.19.3",
+    "react": "17.0.2",
     "react-dom": "17.0.2",
     "react-popper": "^2.2.4",
     "regenerator-runtime": "^0.13.7"
@@ -39,7 +38,6 @@
     "@types/babel__preset-env": "^7",
     "@types/classnames": "^2",
     "@types/jest": "^27.4.0",
-    "@types/js-cookie": "^2",
     "@types/node": "^16.11.55",
     "@types/react": "^17.0.39",
     "@types/react-color": "^3.0.4",
@@ -52,7 +50,6 @@
     "core-js": "^3.18.3",
     "identity-obj-proxy": "^3.0.0",
     "jest": "^27.4.7",
-    "js-cookie": "^2.2.1",
     "react": "17.0.2",
     "react-color": "2.19.3",
     "react-dom": "17.0.2",

From d04f37f71acf78864b8529b6cee592b9f9c30b04 Mon Sep 17 00:00:00 2001
From: Nikos Douvlis <nikosdouvlis@gmail.com>
Date: Sun, 9 Oct 2022 22:44:21 +0300
Subject: [PATCH 16/41] chore(repo): Remove old shared package and replace it
 with common

---
 package-lock.json                             | 509 +-----------------
 packages/clerk-js/jest.config.js              |   1 -
 packages/clerk-js/package.json                |   2 +-
 packages/clerk-js/src/core/clerk.ts           |   2 +-
 packages/clerk-js/src/core/fapiClient.ts      |   2 +-
 .../src/core/resources/EmailAddress.ts        |   2 +-
 .../src/core/resources/ExternalAccount.ts     |   2 +-
 .../clerk-js/src/core/resources/Session.ts    |   2 +-
 .../clerk-js/src/core/resources/SignIn.ts     |   4 +-
 .../clerk-js/src/core/resources/SignUp.ts     |   2 +-
 .../src/ui/SignUp/signUpFormHelpers.ts        |   2 +-
 .../ui/UserProfile/ActiveDevicesSection.tsx   |   2 +-
 .../clerk-js/src/ui/common/authPropHelpers.ts |   2 +-
 .../src/ui/common/withRedirectToHome.test.tsx |   2 +-
 packages/clerk-js/src/ui/elements/Avatar.tsx  |   2 +-
 .../src/ui/hooks/useSupportEmail.test.tsx     |   2 +-
 .../src/ui/router/HashRouter.test.tsx         |   2 +-
 .../src/ui/router/PathRouter.test.tsx         |   2 +-
 .../clerk-js/src/ui/router/Switch.test.tsx    |   2 +-
 .../src/ui/router/VirtualRouter.test.tsx      |   2 +-
 .../src/ui/router/__mocks__/RouteContext.tsx  |   2 +-
 .../src/ui/utils/colorTransformations.test.ts |  50 --
 packages/clerk-js/src/ui/utils/index.ts       |   1 -
 packages/clerk-js/src/utils/cookies/client.ts |   2 +-
 .../clerk-js/src/utils/cookies/client_uat.ts  |   2 +-
 .../clerk-js/src/utils/cookies/handler.ts     |   2 +-
 .../clerk-js/src/utils/cookies/initted.ts     |   2 +-
 .../clerk-js/src/utils/cookies/session.ts     |   2 +-
 .../src/utils/ignoreEventValue.test.ts        |   2 +-
 packages/clerk-js/src/utils/pageLifecycle.ts  |   2 +-
 packages/clerk-js/src/utils/url.ts            |   2 +-
 packages/common/global.d.ts                   |   6 -
 packages/common/package.json                  |  39 --
 packages/common/tsconfig.json                 |  19 -
 .../src/components/SignInButton.test.tsx      |   2 +-
 .../SignInWithMetamaskButton.test.tsx         |   2 +-
 .../src/components/SignOutButton.test.tsx     |   2 +-
 .../src/components/SignUpButton.test.tsx      |   2 +-
 .../useMaxAllowedInstancesGuard.test.tsx      |   2 +-
 packages/shared/CHANGELOG.md                  | 321 -----------
 packages/shared/global.d.ts                   |   9 +-
 packages/shared/index.d.ts                    |   2 -
 packages/shared/index.js                      |   1 -
 packages/shared/jest.config.js                |  49 --
 packages/shared/package.json                  |  73 +--
 packages/{common => shared}/src/index.ts      |   0
 .../{common => shared}/src/testUtils/index.ts |   0
 .../src/testUtils/testUtils.ts                |   0
 .../src/utils/array.test.ts                   |   0
 .../{common => shared}/src/utils/array.ts     |   0
 .../src/utils/browser.test.ts                 |   0
 .../{common => shared}/src/utils/browser.ts   |   0
 .../src/utils/color/cssColorUtils.test.ts     |   0
 .../src/utils/color/cssColorUtils.ts          |   0
 .../src/utils/color/index.ts                  |   0
 .../src/utils/color/predicates.ts             |   0
 .../{common => shared}/src/utils/cookies.ts   |   0
 .../{common => shared}/src/utils/date.test.ts |   0
 packages/{common => shared}/src/utils/date.ts |   0
 packages/{common => shared}/src/utils/file.ts |   0
 .../{common => shared}/src/utils/index.ts     |   0
 .../src/utils/isRetinaDisplay.ts              |   0
 .../localStorageBroadcastChannel.test.ts      |   0
 .../src/utils/localStorageBroadcastChannel.ts |   0
 .../src/utils/mimeTypeExtensions.ts           |   0
 packages/{common => shared}/src/utils/noop.ts |   0
 .../src/utils/object.test.ts                  |   0
 .../{common => shared}/src/utils/object.ts    |   0
 .../{common => shared}/src/utils/poller.ts    |   0
 packages/{common => shared}/src/utils/ssr.ts  |   0
 .../src/utils/string.test.ts                  |   0
 .../{common => shared}/src/utils/string.ts    |   0
 .../{common => shared}/src/utils/url.test.ts  |   0
 packages/{common => shared}/src/utils/url.ts  |   0
 packages/shared/testUtils.d.ts                |   1 -
 packages/shared/testUtils.js                  |   1 -
 .../{common => shared}/testUtils/package.json |   0
 packages/shared/tsconfig.json                 |  19 +-
 packages/shared/tsconfig.test.json            |   7 -
 packages/{common => shared}/tsup.config.ts    |   0
 packages/shared/utils/array.test.ts           |  17 -
 packages/shared/utils/array.ts                |  12 -
 packages/shared/utils/browser.test.ts         |   7 -
 packages/shared/utils/browser.ts              |   3 -
 .../shared/utils/color/cssColorUtils.test.ts  |  71 ---
 packages/shared/utils/color/cssColorUtils.ts  | 151 ------
 packages/shared/utils/color/index.ts          |   2 -
 packages/shared/utils/color/predicates.ts     |  37 --
 packages/shared/utils/cookies.ts              |  27 -
 packages/shared/utils/date.test.ts            |  67 ---
 packages/shared/utils/date.ts                 |  81 ---
 packages/shared/utils/file.ts                 |  18 -
 packages/shared/utils/index.ts                |   8 -
 packages/shared/utils/isRetinaDisplay.ts      |   9 -
 .../localStorageBroadcastChannel.test.ts      |  41 --
 .../utils/localStorageBroadcastChannel.ts     |  52 --
 packages/shared/utils/mimeTypeExtensions.ts   |  14 -
 packages/shared/utils/noop.ts                 |   3 -
 packages/shared/utils/object.test.ts          | 145 -----
 packages/shared/utils/object.ts               |  48 --
 packages/shared/utils/poller.ts               |  33 --
 packages/shared/utils/ssr.ts                  |   3 -
 packages/shared/utils/string.test.ts          |  20 -
 packages/shared/utils/string.ts               |  19 -
 packages/shared/utils/svgTransform.js         |  22 -
 packages/shared/utils/testUtils.ts            |  36 --
 packages/shared/utils/url.test.ts             |  16 -
 packages/shared/utils/url.ts                  |   6 -
 packages/{common => shared}/vite.config.ts    |   0
 109 files changed, 101 insertions(+), 2041 deletions(-)
 delete mode 100644 packages/clerk-js/src/ui/utils/colorTransformations.test.ts
 delete mode 100644 packages/common/global.d.ts
 delete mode 100644 packages/common/package.json
 delete mode 100644 packages/common/tsconfig.json
 delete mode 100644 packages/shared/CHANGELOG.md
 delete mode 100644 packages/shared/index.d.ts
 delete mode 100644 packages/shared/index.js
 delete mode 100644 packages/shared/jest.config.js
 rename packages/{common => shared}/src/index.ts (100%)
 rename packages/{common => shared}/src/testUtils/index.ts (100%)
 rename packages/{common => shared}/src/testUtils/testUtils.ts (100%)
 rename packages/{common => shared}/src/utils/array.test.ts (100%)
 rename packages/{common => shared}/src/utils/array.ts (100%)
 rename packages/{common => shared}/src/utils/browser.test.ts (100%)
 rename packages/{common => shared}/src/utils/browser.ts (100%)
 rename packages/{common => shared}/src/utils/color/cssColorUtils.test.ts (100%)
 rename packages/{common => shared}/src/utils/color/cssColorUtils.ts (100%)
 rename packages/{common => shared}/src/utils/color/index.ts (100%)
 rename packages/{common => shared}/src/utils/color/predicates.ts (100%)
 rename packages/{common => shared}/src/utils/cookies.ts (100%)
 rename packages/{common => shared}/src/utils/date.test.ts (100%)
 rename packages/{common => shared}/src/utils/date.ts (100%)
 rename packages/{common => shared}/src/utils/file.ts (100%)
 rename packages/{common => shared}/src/utils/index.ts (100%)
 rename packages/{common => shared}/src/utils/isRetinaDisplay.ts (100%)
 rename packages/{common => shared}/src/utils/localStorageBroadcastChannel.test.ts (100%)
 rename packages/{common => shared}/src/utils/localStorageBroadcastChannel.ts (100%)
 rename packages/{common => shared}/src/utils/mimeTypeExtensions.ts (100%)
 rename packages/{common => shared}/src/utils/noop.ts (100%)
 rename packages/{common => shared}/src/utils/object.test.ts (100%)
 rename packages/{common => shared}/src/utils/object.ts (100%)
 rename packages/{common => shared}/src/utils/poller.ts (100%)
 rename packages/{common => shared}/src/utils/ssr.ts (100%)
 rename packages/{common => shared}/src/utils/string.test.ts (100%)
 rename packages/{common => shared}/src/utils/string.ts (100%)
 rename packages/{common => shared}/src/utils/url.test.ts (100%)
 rename packages/{common => shared}/src/utils/url.ts (100%)
 delete mode 100644 packages/shared/testUtils.d.ts
 delete mode 100644 packages/shared/testUtils.js
 rename packages/{common => shared}/testUtils/package.json (100%)
 delete mode 100644 packages/shared/tsconfig.test.json
 rename packages/{common => shared}/tsup.config.ts (100%)
 delete mode 100644 packages/shared/utils/array.test.ts
 delete mode 100644 packages/shared/utils/array.ts
 delete mode 100644 packages/shared/utils/browser.test.ts
 delete mode 100644 packages/shared/utils/browser.ts
 delete mode 100644 packages/shared/utils/color/cssColorUtils.test.ts
 delete mode 100644 packages/shared/utils/color/cssColorUtils.ts
 delete mode 100644 packages/shared/utils/color/index.ts
 delete mode 100644 packages/shared/utils/color/predicates.ts
 delete mode 100644 packages/shared/utils/cookies.ts
 delete mode 100644 packages/shared/utils/date.test.ts
 delete mode 100644 packages/shared/utils/date.ts
 delete mode 100644 packages/shared/utils/file.ts
 delete mode 100644 packages/shared/utils/index.ts
 delete mode 100644 packages/shared/utils/isRetinaDisplay.ts
 delete mode 100644 packages/shared/utils/localStorageBroadcastChannel.test.ts
 delete mode 100644 packages/shared/utils/localStorageBroadcastChannel.ts
 delete mode 100644 packages/shared/utils/mimeTypeExtensions.ts
 delete mode 100644 packages/shared/utils/noop.ts
 delete mode 100644 packages/shared/utils/object.test.ts
 delete mode 100644 packages/shared/utils/object.ts
 delete mode 100644 packages/shared/utils/poller.ts
 delete mode 100644 packages/shared/utils/ssr.ts
 delete mode 100644 packages/shared/utils/string.test.ts
 delete mode 100644 packages/shared/utils/string.ts
 delete mode 100644 packages/shared/utils/svgTransform.js
 delete mode 100644 packages/shared/utils/testUtils.ts
 delete mode 100644 packages/shared/utils/url.test.ts
 delete mode 100644 packages/shared/utils/url.ts
 rename packages/{common => shared}/vite.config.ts (100%)

diff --git a/package-lock.json b/package-lock.json
index 94dcedb6357..f26f042be78 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2088,10 +2088,6 @@
       "resolved": "packages/sdk-node",
       "link": true
     },
-    "node_modules/@clerk/common": {
-      "resolved": "packages/common",
-      "link": true
-    },
     "node_modules/@clerk/edge": {
       "resolved": "packages/edge",
       "link": true
@@ -3671,15 +3667,6 @@
       "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==",
       "peer": true
     },
-    "node_modules/@icons/material": {
-      "version": "0.2.4",
-      "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz",
-      "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==",
-      "dev": true,
-      "peerDependencies": {
-        "react": "*"
-      }
-    },
     "node_modules/@istanbuljs/load-nyc-config": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
@@ -8383,117 +8370,6 @@
         "node": ">= 8"
       }
     },
-    "node_modules/@sentry/browser": {
-      "version": "6.17.4",
-      "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.17.4.tgz",
-      "integrity": "sha512-ezLZ/FP2ZJPPemzGKMiu8RCHvuRYfDYXbkQb9KhUbpylJokL4GSRZHy8EYkcHugnvAiov7p8cdj7QgOZQPDAgw==",
-      "dev": true,
-      "dependencies": {
-        "@sentry/core": "6.17.4",
-        "@sentry/types": "6.17.4",
-        "@sentry/utils": "6.17.4",
-        "tslib": "^1.9.3"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/@sentry/browser/node_modules/tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-      "dev": true
-    },
-    "node_modules/@sentry/core": {
-      "version": "6.17.4",
-      "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.17.4.tgz",
-      "integrity": "sha512-7QFgw+I9YK/X1Gie0c7phwT5pHMow66UCXHzDzHR2aK/0X3Lhn8OWlcGjIt5zmiBK/LHwNfQBNMskbktbYHgdA==",
-      "dev": true,
-      "dependencies": {
-        "@sentry/hub": "6.17.4",
-        "@sentry/minimal": "6.17.4",
-        "@sentry/types": "6.17.4",
-        "@sentry/utils": "6.17.4",
-        "tslib": "^1.9.3"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/@sentry/core/node_modules/tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-      "dev": true
-    },
-    "node_modules/@sentry/hub": {
-      "version": "6.17.4",
-      "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.17.4.tgz",
-      "integrity": "sha512-6+EvPcrPCwUmayeieIpm1ZrRNWriqMHWZFyw+MzunFLgG8IH8G45cJU1zNnTY9Jwwg4sFIS9xrHy3AOkctnIGw==",
-      "dev": true,
-      "dependencies": {
-        "@sentry/types": "6.17.4",
-        "@sentry/utils": "6.17.4",
-        "tslib": "^1.9.3"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/@sentry/hub/node_modules/tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-      "dev": true
-    },
-    "node_modules/@sentry/minimal": {
-      "version": "6.17.4",
-      "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.17.4.tgz",
-      "integrity": "sha512-p1A8UTtRt7bhV4ygu7yDNCannFr9E9dmqgeZWC7HrrTfygcnhNRFvTXTj92wEb0bFKuZr67wPSKnoXlkqkGxsw==",
-      "dev": true,
-      "dependencies": {
-        "@sentry/hub": "6.17.4",
-        "@sentry/types": "6.17.4",
-        "tslib": "^1.9.3"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/@sentry/minimal/node_modules/tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-      "dev": true
-    },
-    "node_modules/@sentry/types": {
-      "version": "6.17.4",
-      "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.17.4.tgz",
-      "integrity": "sha512-RUyiXCKf61k2GIMP7FQX0naoSew4zLxe+UrtbjwVcWU4AFPZfH7tLNtTpVE85zAKbxsaiq3OD2FPtTZarHcwxQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/@sentry/utils": {
-      "version": "6.17.4",
-      "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.17.4.tgz",
-      "integrity": "sha512-+ENzZbrlVL1JJ+FoK2EOS27nbA/yToeaJPFlyVOnbthUxVyN3TTi9Uzn9F05fIE/2BTkOEk89wPtgcHafgrD6A==",
-      "dev": true,
-      "dependencies": {
-        "@sentry/types": "6.17.4",
-        "tslib": "^1.9.3"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/@sentry/utils/node_modules/tslib": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-      "dev": true
-    },
     "node_modules/@sideway/address": {
       "version": "4.1.4",
       "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
@@ -9181,12 +9057,6 @@
         "@babel/types": "^7.0.0"
       }
     },
-    "node_modules/@types/babel__preset-env": {
-      "version": "7.9.2",
-      "resolved": "https://registry.npmjs.org/@types/babel__preset-env/-/babel__preset-env-7.9.2.tgz",
-      "integrity": "sha512-epEgKQiqTDZdPgYwtriYK1GVAGcyVZVvvw2UatX3+95mogKGimebApcMEWLF12uhUbNIvX284CSQEavnV/OIgw==",
-      "dev": true
-    },
     "node_modules/@types/babel__template": {
       "version": "7.4.1",
       "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
@@ -9621,16 +9491,6 @@
         "csstype": "^3.0.2"
       }
     },
-    "node_modules/@types/react-color": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/@types/react-color/-/react-color-3.0.6.tgz",
-      "integrity": "sha512-OzPIO5AyRmLA7PlOyISlgabpYUa3En74LP8mTMa0veCA719SvYQov4WLMsHvCgXP+L+KI9yGhYnqZafVGG0P4w==",
-      "dev": true,
-      "dependencies": {
-        "@types/react": "*",
-        "@types/reactcss": "*"
-      }
-    },
     "node_modules/@types/react-dom": {
       "version": "17.0.11",
       "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz",
@@ -9648,15 +9508,6 @@
         "@types/react": "*"
       }
     },
-    "node_modules/@types/reactcss": {
-      "version": "1.2.6",
-      "resolved": "https://registry.npmjs.org/@types/reactcss/-/reactcss-1.2.6.tgz",
-      "integrity": "sha512-qaIzpCuXNWomGR1Xq8SCFTtF4v8V27Y6f+b9+bzHiv087MylI/nTCqqdChNeWS7tslgROmYB7yeiruWX7WnqNg==",
-      "dev": true,
-      "dependencies": {
-        "@types/react": "*"
-      }
-    },
     "node_modules/@types/responselike": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
@@ -12853,26 +12704,6 @@
         "node": ">= 10"
       }
     },
-    "node_modules/clipboard-copy": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/clipboard-copy/-/clipboard-copy-4.0.1.tgz",
-      "integrity": "sha512-wOlqdqziE/NNTUJsfSgXmBMIrYmfd5V0HCGsR8uAKHcg+h9NENWINcfRjtWGU77wDHC8B8ijV4hMTGYbrKovng==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
     "node_modules/clipboardy": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz",
@@ -26011,12 +25842,6 @@
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
     },
-    "node_modules/lodash-es": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
-      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
-      "dev": true
-    },
     "node_modules/lodash._reinterpolate": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
@@ -26400,12 +26225,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/material-colors": {
-      "version": "1.2.6",
-      "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz",
-      "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==",
-      "dev": true
-    },
     "node_modules/md5-file": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz",
@@ -30972,24 +30791,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/react-color": {
-      "version": "2.19.3",
-      "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz",
-      "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==",
-      "dev": true,
-      "dependencies": {
-        "@icons/material": "^0.2.4",
-        "lodash": "^4.17.15",
-        "lodash-es": "^4.17.15",
-        "material-colors": "^1.2.1",
-        "prop-types": "^15.5.10",
-        "reactcss": "^1.2.0",
-        "tinycolor2": "^1.4.1"
-      },
-      "peerDependencies": {
-        "react": "*"
-      }
-    },
     "node_modules/react-dev-utils": {
       "version": "12.0.1",
       "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz",
@@ -31333,6 +31134,7 @@
       "version": "16.14.1",
       "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz",
       "integrity": "sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg==",
+      "peer": true,
       "dependencies": {
         "object-assign": "^4.1.1",
         "react-is": "^16.12.0 || ^17.0.0"
@@ -31345,6 +31147,7 @@
       "version": "17.0.2",
       "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-17.0.2.tgz",
       "integrity": "sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ==",
+      "peer": true,
       "dependencies": {
         "object-assign": "^4.1.1",
         "react-is": "^17.0.2",
@@ -31355,15 +31158,6 @@
         "react": "17.0.2"
       }
     },
-    "node_modules/reactcss": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz",
-      "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==",
-      "dev": true,
-      "dependencies": {
-        "lodash": "^4.0.1"
-      }
-    },
     "node_modules/read": {
       "version": "1.0.7",
       "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
@@ -34656,6 +34450,7 @@
       "version": "1.4.2",
       "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz",
       "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==",
+      "peer": true,
       "engines": {
         "node": "*"
       }
@@ -38301,7 +38096,7 @@
       "version": "4.9.0",
       "license": "MIT",
       "dependencies": {
-        "@clerk/common": "^0.0.1",
+        "@clerk/shared": "^0.0.1",
         "@clerk/types": "^3.10.1",
         "@emotion/cache": "^11.7.1",
         "@emotion/react": "^11.9.0",
@@ -38439,6 +38234,7 @@
     "packages/common": {
       "name": "@clerk/common",
       "version": "0.0.1",
+      "extraneous": true,
       "license": "ISC",
       "devDependencies": {
         "@clerk/types": "^3.10.1",
@@ -39427,60 +39223,26 @@
     },
     "packages/shared": {
       "name": "@clerk/shared",
-      "version": "0.3.27",
+      "version": "0.0.1",
+      "license": "ISC",
       "devDependencies": {
-        "@babel/core": "^7.13.14",
-        "@babel/preset-env": "^7.13.12",
-        "@babel/preset-react": "^7.13.13",
         "@clerk/types": "^3.10.1",
-        "@popperjs/core": "^2.5.4",
-        "@sentry/browser": "^6.3.0",
-        "@svgr/webpack": "^6.2.1",
+        "@types/js-cookie": "^3.0.2",
+        "js-cookie": "^3.0.1",
+        "tsup": "^6.2.3",
+        "typescript": "*",
+        "vitest": "^0.23.4"
+      },
+      "peerDependencies": {
         "@testing-library/dom": "^7.28.1",
         "@testing-library/jest-dom": "^5.11.6",
         "@testing-library/react": "^11.2.1",
         "@testing-library/react-hooks": "^3.4.2",
         "@testing-library/user-event": "^12.2.2",
-        "@types/babel__core": "^7",
-        "@types/babel__preset-env": "^7",
-        "@types/classnames": "^2",
-        "@types/jest": "^27.4.0",
-        "@types/node": "^16.11.55",
-        "@types/react": "^17.0.39",
-        "@types/react-color": "^3.0.4",
-        "@types/react-dom": "^17.0.11",
-        "@types/react-test-renderer": "^17",
-        "@types/testing-library__jest-dom": "^5",
-        "@types/testing-library__react-hooks": "^3",
-        "classnames": "^2.3.1",
-        "clipboard-copy": "^4.0.1",
-        "core-js": "^3.18.3",
-        "identity-obj-proxy": "^3.0.0",
-        "jest": "^27.4.7",
-        "react": "17.0.2",
-        "react-color": "2.19.3",
-        "react-dom": "17.0.2",
-        "react-popper": "^2.2.4",
-        "react-test-renderer": "17.0.2",
-        "ts-jest": "^27.1.3"
-      },
-      "peerDependencies": {
-        "@popperjs/core": "^2.5.4",
-        "@svgr/webpack": "^6.2.1",
-        "core-js": "^3.18.3",
         "react": "17.0.2",
-        "react-color": "2.19.3",
-        "react-dom": "17.0.2",
-        "react-popper": "^2.2.4",
-        "regenerator-runtime": "^0.13.7"
+        "react-dom": "17.0.2"
       }
     },
-    "packages/shared/node_modules/@types/node": {
-      "version": "16.11.56",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.56.tgz",
-      "integrity": "sha512-aFcUkv7EddxxOa/9f74DINReQ/celqH8DiB3fRYgVDM2Xm5QJL8sl80QKuAnGvwAsMn+H3IFA6WCrQh1CY7m1A==",
-      "dev": true
-    },
     "packages/themes": {
       "name": "@clerk/themes",
       "version": "1.2.17",
@@ -41029,7 +40791,7 @@
         "@babel/preset-env": "^7.12.1",
         "@babel/preset-react": "^7.12.5",
         "@babel/preset-typescript": "^7.12.1",
-        "@clerk/common": "^0.0.1",
+        "@clerk/shared": "^0.0.1",
         "@clerk/types": "^3.10.1",
         "@emotion/cache": "^11.7.1",
         "@emotion/react": "^11.9.0",
@@ -41206,17 +40968,6 @@
         }
       }
     },
-    "@clerk/common": {
-      "version": "file:packages/common",
-      "requires": {
-        "@clerk/types": "^3.10.1",
-        "@types/js-cookie": "^3.0.2",
-        "js-cookie": "^3.0.1",
-        "tsup": "^6.2.3",
-        "typescript": "*",
-        "vitest": "^0.23.4"
-      }
-    },
     "@clerk/edge": {
       "version": "file:packages/edge",
       "requires": {
@@ -41569,48 +41320,12 @@
     "@clerk/shared": {
       "version": "file:packages/shared",
       "requires": {
-        "@babel/core": "^7.13.14",
-        "@babel/preset-env": "^7.13.12",
-        "@babel/preset-react": "^7.13.13",
         "@clerk/types": "^3.10.1",
-        "@popperjs/core": "^2.5.4",
-        "@sentry/browser": "^6.3.0",
-        "@svgr/webpack": "^6.2.1",
-        "@testing-library/dom": "^7.28.1",
-        "@testing-library/jest-dom": "^5.11.6",
-        "@testing-library/react": "^11.2.1",
-        "@testing-library/react-hooks": "^3.4.2",
-        "@testing-library/user-event": "^12.2.2",
-        "@types/babel__core": "^7",
-        "@types/babel__preset-env": "^7",
-        "@types/classnames": "^2",
-        "@types/jest": "^27.4.0",
-        "@types/node": "^16.11.55",
-        "@types/react": "^17.0.39",
-        "@types/react-color": "^3.0.4",
-        "@types/react-dom": "^17.0.11",
-        "@types/react-test-renderer": "^17",
-        "@types/testing-library__jest-dom": "^5",
-        "@types/testing-library__react-hooks": "^3",
-        "classnames": "^2.3.1",
-        "clipboard-copy": "^4.0.1",
-        "core-js": "^3.18.3",
-        "identity-obj-proxy": "^3.0.0",
-        "jest": "^27.4.7",
-        "react": "17.0.2",
-        "react-color": "2.19.3",
-        "react-dom": "17.0.2",
-        "react-popper": "^2.2.4",
-        "react-test-renderer": "17.0.2",
-        "ts-jest": "^27.1.3"
-      },
-      "dependencies": {
-        "@types/node": {
-          "version": "16.11.56",
-          "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.56.tgz",
-          "integrity": "sha512-aFcUkv7EddxxOa/9f74DINReQ/celqH8DiB3fRYgVDM2Xm5QJL8sl80QKuAnGvwAsMn+H3IFA6WCrQh1CY7m1A==",
-          "dev": true
-        }
+        "@types/js-cookie": "^3.0.2",
+        "js-cookie": "^3.0.1",
+        "tsup": "^6.2.3",
+        "typescript": "*",
+        "vitest": "^0.23.4"
       }
     },
     "@clerk/themes": {
@@ -42847,13 +42562,6 @@
       "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==",
       "peer": true
     },
-    "@icons/material": {
-      "version": "0.2.4",
-      "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz",
-      "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==",
-      "dev": true,
-      "requires": {}
-    },
     "@istanbuljs/load-nyc-config": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
@@ -46358,109 +46066,6 @@
         }
       }
     },
-    "@sentry/browser": {
-      "version": "6.17.4",
-      "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.17.4.tgz",
-      "integrity": "sha512-ezLZ/FP2ZJPPemzGKMiu8RCHvuRYfDYXbkQb9KhUbpylJokL4GSRZHy8EYkcHugnvAiov7p8cdj7QgOZQPDAgw==",
-      "dev": true,
-      "requires": {
-        "@sentry/core": "6.17.4",
-        "@sentry/types": "6.17.4",
-        "@sentry/utils": "6.17.4",
-        "tslib": "^1.9.3"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-          "dev": true
-        }
-      }
-    },
-    "@sentry/core": {
-      "version": "6.17.4",
-      "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.17.4.tgz",
-      "integrity": "sha512-7QFgw+I9YK/X1Gie0c7phwT5pHMow66UCXHzDzHR2aK/0X3Lhn8OWlcGjIt5zmiBK/LHwNfQBNMskbktbYHgdA==",
-      "dev": true,
-      "requires": {
-        "@sentry/hub": "6.17.4",
-        "@sentry/minimal": "6.17.4",
-        "@sentry/types": "6.17.4",
-        "@sentry/utils": "6.17.4",
-        "tslib": "^1.9.3"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-          "dev": true
-        }
-      }
-    },
-    "@sentry/hub": {
-      "version": "6.17.4",
-      "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.17.4.tgz",
-      "integrity": "sha512-6+EvPcrPCwUmayeieIpm1ZrRNWriqMHWZFyw+MzunFLgG8IH8G45cJU1zNnTY9Jwwg4sFIS9xrHy3AOkctnIGw==",
-      "dev": true,
-      "requires": {
-        "@sentry/types": "6.17.4",
-        "@sentry/utils": "6.17.4",
-        "tslib": "^1.9.3"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-          "dev": true
-        }
-      }
-    },
-    "@sentry/minimal": {
-      "version": "6.17.4",
-      "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.17.4.tgz",
-      "integrity": "sha512-p1A8UTtRt7bhV4ygu7yDNCannFr9E9dmqgeZWC7HrrTfygcnhNRFvTXTj92wEb0bFKuZr67wPSKnoXlkqkGxsw==",
-      "dev": true,
-      "requires": {
-        "@sentry/hub": "6.17.4",
-        "@sentry/types": "6.17.4",
-        "tslib": "^1.9.3"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-          "dev": true
-        }
-      }
-    },
-    "@sentry/types": {
-      "version": "6.17.4",
-      "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.17.4.tgz",
-      "integrity": "sha512-RUyiXCKf61k2GIMP7FQX0naoSew4zLxe+UrtbjwVcWU4AFPZfH7tLNtTpVE85zAKbxsaiq3OD2FPtTZarHcwxQ==",
-      "dev": true
-    },
-    "@sentry/utils": {
-      "version": "6.17.4",
-      "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.17.4.tgz",
-      "integrity": "sha512-+ENzZbrlVL1JJ+FoK2EOS27nbA/yToeaJPFlyVOnbthUxVyN3TTi9Uzn9F05fIE/2BTkOEk89wPtgcHafgrD6A==",
-      "dev": true,
-      "requires": {
-        "@sentry/types": "6.17.4",
-        "tslib": "^1.9.3"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "1.14.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-          "dev": true
-        }
-      }
-    },
     "@sideway/address": {
       "version": "4.1.4",
       "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
@@ -46926,12 +46531,6 @@
         "@babel/types": "^7.0.0"
       }
     },
-    "@types/babel__preset-env": {
-      "version": "7.9.2",
-      "resolved": "https://registry.npmjs.org/@types/babel__preset-env/-/babel__preset-env-7.9.2.tgz",
-      "integrity": "sha512-epEgKQiqTDZdPgYwtriYK1GVAGcyVZVvvw2UatX3+95mogKGimebApcMEWLF12uhUbNIvX284CSQEavnV/OIgw==",
-      "dev": true
-    },
     "@types/babel__template": {
       "version": "7.4.1",
       "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
@@ -47358,16 +46957,6 @@
         "csstype": "^3.0.2"
       }
     },
-    "@types/react-color": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/@types/react-color/-/react-color-3.0.6.tgz",
-      "integrity": "sha512-OzPIO5AyRmLA7PlOyISlgabpYUa3En74LP8mTMa0veCA719SvYQov4WLMsHvCgXP+L+KI9yGhYnqZafVGG0P4w==",
-      "dev": true,
-      "requires": {
-        "@types/react": "*",
-        "@types/reactcss": "*"
-      }
-    },
     "@types/react-dom": {
       "version": "17.0.11",
       "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz",
@@ -47385,15 +46974,6 @@
         "@types/react": "*"
       }
     },
-    "@types/reactcss": {
-      "version": "1.2.6",
-      "resolved": "https://registry.npmjs.org/@types/reactcss/-/reactcss-1.2.6.tgz",
-      "integrity": "sha512-qaIzpCuXNWomGR1Xq8SCFTtF4v8V27Y6f+b9+bzHiv087MylI/nTCqqdChNeWS7tslgROmYB7yeiruWX7WnqNg==",
-      "dev": true,
-      "requires": {
-        "@types/react": "*"
-      }
-    },
     "@types/responselike": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
@@ -49876,12 +49456,6 @@
       "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
       "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="
     },
-    "clipboard-copy": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/clipboard-copy/-/clipboard-copy-4.0.1.tgz",
-      "integrity": "sha512-wOlqdqziE/NNTUJsfSgXmBMIrYmfd5V0HCGsR8uAKHcg+h9NENWINcfRjtWGU77wDHC8B8ijV4hMTGYbrKovng==",
-      "dev": true
-    },
     "clipboardy": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz",
@@ -59970,12 +59544,6 @@
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
     },
-    "lodash-es": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
-      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
-      "dev": true
-    },
     "lodash._reinterpolate": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
@@ -60317,12 +59885,6 @@
         "object-visit": "^1.0.0"
       }
     },
-    "material-colors": {
-      "version": "1.2.6",
-      "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz",
-      "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==",
-      "dev": true
-    },
     "md5-file": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz",
@@ -63723,21 +63285,6 @@
         "object-assign": "^4.1.1"
       }
     },
-    "react-color": {
-      "version": "2.19.3",
-      "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz",
-      "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==",
-      "dev": true,
-      "requires": {
-        "@icons/material": "^0.2.4",
-        "lodash": "^4.17.15",
-        "lodash-es": "^4.17.15",
-        "material-colors": "^1.2.1",
-        "prop-types": "^15.5.10",
-        "reactcss": "^1.2.0",
-        "tinycolor2": "^1.4.1"
-      }
-    },
     "react-dev-utils": {
       "version": "12.0.1",
       "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz",
@@ -63990,6 +63537,7 @@
       "version": "16.14.1",
       "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz",
       "integrity": "sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg==",
+      "peer": true,
       "requires": {
         "object-assign": "^4.1.1",
         "react-is": "^16.12.0 || ^17.0.0"
@@ -63999,6 +63547,7 @@
       "version": "17.0.2",
       "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-17.0.2.tgz",
       "integrity": "sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ==",
+      "peer": true,
       "requires": {
         "object-assign": "^4.1.1",
         "react-is": "^17.0.2",
@@ -64006,15 +63555,6 @@
         "scheduler": "^0.20.2"
       }
     },
-    "reactcss": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz",
-      "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==",
-      "dev": true,
-      "requires": {
-        "lodash": "^4.0.1"
-      }
-    },
     "read": {
       "version": "1.0.7",
       "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
@@ -66585,7 +66125,8 @@
     "tinycolor2": {
       "version": "1.4.2",
       "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz",
-      "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA=="
+      "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==",
+      "peer": true
     },
     "tinypool": {
       "version": "0.3.0",
diff --git a/packages/clerk-js/jest.config.js b/packages/clerk-js/jest.config.js
index 59d6c47f457..4d00fe4e58e 100644
--- a/packages/clerk-js/jest.config.js
+++ b/packages/clerk-js/jest.config.js
@@ -28,7 +28,6 @@ module.exports = {
   // using ts-jest
   transform: {
     '^.+\\.tsx?$': 'ts-jest',
-    '^.+\\.svg$': '<rootDir>../shared/utils/svgTransform.js',
   },
 
   // For mocking fetch
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index 6e2b1476c4b..1e762786d5e 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -39,7 +39,7 @@
   },
   "dependencies": {
     "@clerk/types": "^3.10.1",
-    "@clerk/common": "^0.0.1",
+    "@clerk/shared": "^0.0.1",
     "@emotion/cache": "^11.7.1",
     "@emotion/react": "^11.9.0",
     "@floating-ui/react-dom-interactions": "^0.6.3",
diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts
index 46d229250e5..2f419f0cab7 100644
--- a/packages/clerk-js/src/core/clerk.ts
+++ b/packages/clerk-js/src/core/clerk.ts
@@ -1,4 +1,4 @@
-import { inClientSide, LocalStorageBroadcastChannel, noop } from '@clerk/common';
+import { inClientSide, LocalStorageBroadcastChannel, noop } from '@clerk/shared';
 import type {
   ActiveSessionResource,
   AuthenticateWithMetamaskParams,
diff --git a/packages/clerk-js/src/core/fapiClient.ts b/packages/clerk-js/src/core/fapiClient.ts
index 1afc2645c94..4fb1ee4e73c 100644
--- a/packages/clerk-js/src/core/fapiClient.ts
+++ b/packages/clerk-js/src/core/fapiClient.ts
@@ -1,4 +1,4 @@
-import { camelToSnake } from '@clerk/common';
+import { camelToSnake } from '@clerk/shared';
 import type { Clerk, ClerkAPIErrorJSON, ClientJSON } from '@clerk/types';
 import qs from 'qs';
 
diff --git a/packages/clerk-js/src/core/resources/EmailAddress.ts b/packages/clerk-js/src/core/resources/EmailAddress.ts
index cd80793e3c3..2d7394112ef 100644
--- a/packages/clerk-js/src/core/resources/EmailAddress.ts
+++ b/packages/clerk-js/src/core/resources/EmailAddress.ts
@@ -1,4 +1,4 @@
-import { Poller } from '@clerk/common';
+import { Poller } from '@clerk/shared';
 import type {
   AttemptEmailAddressVerificationParams,
   CreateMagicLinkFlowReturn,
diff --git a/packages/clerk-js/src/core/resources/ExternalAccount.ts b/packages/clerk-js/src/core/resources/ExternalAccount.ts
index 37828b49dc0..ceb312ef5da 100644
--- a/packages/clerk-js/src/core/resources/ExternalAccount.ts
+++ b/packages/clerk-js/src/core/resources/ExternalAccount.ts
@@ -1,4 +1,4 @@
-import { titleize } from '@clerk/common';
+import { titleize } from '@clerk/shared';
 import type { ExternalAccountJSON, ExternalAccountResource, OAuthProvider, VerificationResource } from '@clerk/types';
 
 import { BaseResource } from './Base';
diff --git a/packages/clerk-js/src/core/resources/Session.ts b/packages/clerk-js/src/core/resources/Session.ts
index 54383138708..2a5e0850fc9 100644
--- a/packages/clerk-js/src/core/resources/Session.ts
+++ b/packages/clerk-js/src/core/resources/Session.ts
@@ -1,4 +1,4 @@
-import { deepSnakeToCamel } from '@clerk/common';
+import { deepSnakeToCamel } from '@clerk/shared';
 import type { ActJWTClaim, PublicUserData, SessionJSON, SessionResource, SessionStatus } from '@clerk/types';
 import { GetToken, GetTokenOptions, UserResource } from '@clerk/types/src';
 
diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts
index 76a41cd7767..7758f173f8a 100644
--- a/packages/clerk-js/src/core/resources/SignIn.ts
+++ b/packages/clerk-js/src/core/resources/SignIn.ts
@@ -1,5 +1,5 @@
-import { deepSnakeToCamel } from '@clerk/common';
-import { Poller } from '@clerk/common';
+import { deepSnakeToCamel } from '@clerk/shared';
+import { Poller } from '@clerk/shared';
 import type {
   AttemptFirstFactorParams,
   AttemptSecondFactorParams,
diff --git a/packages/clerk-js/src/core/resources/SignUp.ts b/packages/clerk-js/src/core/resources/SignUp.ts
index 5348791e21d..9dd29d86ce4 100644
--- a/packages/clerk-js/src/core/resources/SignUp.ts
+++ b/packages/clerk-js/src/core/resources/SignUp.ts
@@ -1,4 +1,4 @@
-import { Poller } from '@clerk/common';
+import { Poller } from '@clerk/shared';
 import type {
   AttemptEmailAddressVerificationParams,
   AttemptPhoneNumberVerificationParams,
diff --git a/packages/clerk-js/src/ui/SignUp/signUpFormHelpers.ts b/packages/clerk-js/src/ui/SignUp/signUpFormHelpers.ts
index fe152641d54..a1523fc0aa2 100644
--- a/packages/clerk-js/src/ui/SignUp/signUpFormHelpers.ts
+++ b/packages/clerk-js/src/ui/SignUp/signUpFormHelpers.ts
@@ -1,4 +1,4 @@
-import { camelToSnake } from '@clerk/common';
+import { camelToSnake } from '@clerk/shared';
 import type { Attributes, SignUpResource } from '@clerk/types';
 import { UserSettingsResource } from '@clerk/types';
 
diff --git a/packages/clerk-js/src/ui/UserProfile/ActiveDevicesSection.tsx b/packages/clerk-js/src/ui/UserProfile/ActiveDevicesSection.tsx
index 65ddad501d0..be23f61c040 100644
--- a/packages/clerk-js/src/ui/UserProfile/ActiveDevicesSection.tsx
+++ b/packages/clerk-js/src/ui/UserProfile/ActiveDevicesSection.tsx
@@ -1,4 +1,4 @@
-import { formatRelative } from '@clerk/common';
+import { formatRelative } from '@clerk/shared';
 import { SessionWithActivitiesResource } from '@clerk/types';
 import React from 'react';
 
diff --git a/packages/clerk-js/src/ui/common/authPropHelpers.ts b/packages/clerk-js/src/ui/common/authPropHelpers.ts
index 784bdcaba6a..e0a818ef1c1 100644
--- a/packages/clerk-js/src/ui/common/authPropHelpers.ts
+++ b/packages/clerk-js/src/ui/common/authPropHelpers.ts
@@ -1,4 +1,4 @@
-import { camelToSnake } from '@clerk/common';
+import { camelToSnake } from '@clerk/shared';
 import type { DisplayConfigResource } from '@clerk/types';
 import type { ParsedQs } from 'qs';
 import qs from 'qs';
diff --git a/packages/clerk-js/src/ui/common/withRedirectToHome.test.tsx b/packages/clerk-js/src/ui/common/withRedirectToHome.test.tsx
index abfa49bf303..82a136dbfb5 100644
--- a/packages/clerk-js/src/ui/common/withRedirectToHome.test.tsx
+++ b/packages/clerk-js/src/ui/common/withRedirectToHome.test.tsx
@@ -1,4 +1,4 @@
-import { render, screen } from '@clerk/common/testUtils';
+import { render, screen } from '@clerk/shared/testUtils';
 import { EnvironmentResource } from '@clerk/types';
 import React from 'react';
 
diff --git a/packages/clerk-js/src/ui/elements/Avatar.tsx b/packages/clerk-js/src/ui/elements/Avatar.tsx
index 8aed67b9e29..323828c42c0 100644
--- a/packages/clerk-js/src/ui/elements/Avatar.tsx
+++ b/packages/clerk-js/src/ui/elements/Avatar.tsx
@@ -1,4 +1,4 @@
-import { isRetinaDisplay } from '@clerk/common';
+import { isRetinaDisplay } from '@clerk/shared';
 import React from 'react';
 
 import { BoringAvatar } from '../common/BoringAvatar';
diff --git a/packages/clerk-js/src/ui/hooks/useSupportEmail.test.tsx b/packages/clerk-js/src/ui/hooks/useSupportEmail.test.tsx
index ec3d2d3a280..11454ee7684 100644
--- a/packages/clerk-js/src/ui/hooks/useSupportEmail.test.tsx
+++ b/packages/clerk-js/src/ui/hooks/useSupportEmail.test.tsx
@@ -1,4 +1,4 @@
-import { renderHook } from '@clerk/common/testUtils';
+import { renderHook } from '@clerk/shared/testUtils';
 
 import { useSupportEmail } from './useSupportEmail';
 
diff --git a/packages/clerk-js/src/ui/router/HashRouter.test.tsx b/packages/clerk-js/src/ui/router/HashRouter.test.tsx
index 714cb21275f..2c940c77f58 100644
--- a/packages/clerk-js/src/ui/router/HashRouter.test.tsx
+++ b/packages/clerk-js/src/ui/router/HashRouter.test.tsx
@@ -1,4 +1,4 @@
-import { act, render, screen, userEvent } from '@clerk/common/testUtils';
+import { act, render, screen, userEvent } from '@clerk/shared/testUtils';
 import React from 'react';
 
 import Clerk from '../../core/clerk';
diff --git a/packages/clerk-js/src/ui/router/PathRouter.test.tsx b/packages/clerk-js/src/ui/router/PathRouter.test.tsx
index b224f61520d..79df8e4d519 100644
--- a/packages/clerk-js/src/ui/router/PathRouter.test.tsx
+++ b/packages/clerk-js/src/ui/router/PathRouter.test.tsx
@@ -1,4 +1,4 @@
-import { act, render, screen, userEvent } from '@clerk/common/testUtils';
+import { act, render, screen, userEvent } from '@clerk/shared/testUtils';
 import React from 'react';
 
 import Clerk from '../../core/clerk';
diff --git a/packages/clerk-js/src/ui/router/Switch.test.tsx b/packages/clerk-js/src/ui/router/Switch.test.tsx
index f130e8d921e..039fd9cefdb 100644
--- a/packages/clerk-js/src/ui/router/Switch.test.tsx
+++ b/packages/clerk-js/src/ui/router/Switch.test.tsx
@@ -1,4 +1,4 @@
-import { render, screen } from '@clerk/common/testUtils';
+import { render, screen } from '@clerk/shared/testUtils';
 import React from 'react';
 import { HashRouter, Route, Switch } from 'ui/router';
 
diff --git a/packages/clerk-js/src/ui/router/VirtualRouter.test.tsx b/packages/clerk-js/src/ui/router/VirtualRouter.test.tsx
index 6d1f09f8e39..0b9be4c11c9 100644
--- a/packages/clerk-js/src/ui/router/VirtualRouter.test.tsx
+++ b/packages/clerk-js/src/ui/router/VirtualRouter.test.tsx
@@ -1,4 +1,4 @@
-import { act, render, screen, userEvent } from '@clerk/common/testUtils';
+import { act, render, screen, userEvent } from '@clerk/shared/testUtils';
 import React from 'react';
 
 import { Route, useRouter, VirtualRouter } from './';
diff --git a/packages/clerk-js/src/ui/router/__mocks__/RouteContext.tsx b/packages/clerk-js/src/ui/router/__mocks__/RouteContext.tsx
index e41505f0b03..cabc7dfec95 100644
--- a/packages/clerk-js/src/ui/router/__mocks__/RouteContext.tsx
+++ b/packages/clerk-js/src/ui/router/__mocks__/RouteContext.tsx
@@ -1,4 +1,4 @@
-import { noop } from '@clerk/common';
+import { noop } from '@clerk/shared';
 
 export const useRouter = () => ({
   resolve: jest.fn(() => ({
diff --git a/packages/clerk-js/src/ui/utils/colorTransformations.test.ts b/packages/clerk-js/src/ui/utils/colorTransformations.test.ts
deleted file mode 100644
index 40a274acb50..00000000000
--- a/packages/clerk-js/src/ui/utils/colorTransformations.test.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { Color } from 'react-color';
-
-import { colorToSameTypeString, hexStringToRgbaColor, stringToHslaColor } from './colorTransformations';
-
-describe('stringToHslaColor(color)', function () {
-  const hsla = { h: 195, s: 1, l: 0.5, a: 1 };
-  const cases: Array<[string, Color | undefined]> = [
-    ['', undefined],
-    ['transparent', { h: 0, s: 0, l: 0, a: 0 }],
-    ['#00bfff', hsla],
-    ['00bfff', hsla],
-    ['rgb(0, 191, 255)', hsla],
-    ['rgba(0, 191, 255, 0.3)', { ...hsla, a: 0.3 }],
-    ['hsla(195, 100%, 50%, 1)', hsla],
-    ['hsla(195, 100%, 50%, 1)', hsla],
-  ];
-
-  it.each(cases)('.stringToHslaColor(%s) => %s', (a, expected) => {
-    expect(stringToHslaColor(a)).toEqual(expected);
-  });
-});
-
-describe('hexStringToRgbaColor(color)', function () {
-  const cases: Array<[string, Color | null]> = [
-    ['#00bfff', { r: 0, g: 191, b: 255 }],
-    ['00bfff', { r: 0, g: 191, b: 255 }],
-  ];
-
-  it.each(cases)('.hexStringToRgbaColor(%s) => %s', (a, expected) => {
-    expect(hexStringToRgbaColor(a)).toEqual(expected);
-  });
-});
-
-describe('colorToSameTypeString(color)', function () {
-  const cases: Array<[Color, string]> = [
-    ['', ''],
-    ['invalid', ''],
-    ['#12ff12', '#12ff12'],
-    ['#12ff12', '#12ff12'],
-    ['#1ff', '#1ff'],
-    [{ r: 100, g: 100, b: 100, a: undefined }, 'rgb(100,100,100)'],
-    [{ r: 100, g: 100, b: 100, a: 0.5 }, 'rgba(100,100,100,0.5)'],
-    [{ h: 100, s: 0.55, l: 0.33, a: undefined }, 'hsl(100,55%,33%)'],
-    [{ h: 100, s: 1, l: 1, a: 0.5 }, 'hsla(100,100%,100%,0.5)'],
-  ];
-
-  it.each(cases)('.colorToSameTypeString(%s) => %s', (a, expected) => {
-    expect(colorToSameTypeString(a)).toEqual(expected);
-  });
-});
diff --git a/packages/clerk-js/src/ui/utils/index.ts b/packages/clerk-js/src/ui/utils/index.ts
index 929a455c97a..b1484a8b672 100644
--- a/packages/clerk-js/src/ui/utils/index.ts
+++ b/packages/clerk-js/src/ui/utils/index.ts
@@ -3,7 +3,6 @@ export * from './containsAllOf';
 export * from './createContextAndHook';
 export * from './createInfiniteAccessProxy';
 export * from './fastDeepMerge';
-export * from './colorTransformations';
 export * from './colors';
 export * from './factorSorting';
 export * from './sleep';
diff --git a/packages/clerk-js/src/utils/cookies/client.ts b/packages/clerk-js/src/utils/cookies/client.ts
index fcf45fae2d9..60ce9cd82c3 100644
--- a/packages/clerk-js/src/utils/cookies/client.ts
+++ b/packages/clerk-js/src/utils/cookies/client.ts
@@ -1,4 +1,4 @@
-import { createCookieHandler } from '@clerk/common';
+import { createCookieHandler } from '@clerk/shared';
 
 const CLIENT_COOKIE_NAME = '__client';
 
diff --git a/packages/clerk-js/src/utils/cookies/client_uat.ts b/packages/clerk-js/src/utils/cookies/client_uat.ts
index e68ba258780..6b9e2258bda 100644
--- a/packages/clerk-js/src/utils/cookies/client_uat.ts
+++ b/packages/clerk-js/src/utils/cookies/client_uat.ts
@@ -1,4 +1,4 @@
-import { createCookieHandler } from '@clerk/common';
+import { createCookieHandler } from '@clerk/shared';
 
 const CLIENT_UAT_COOKIE_NAME = '__client_uat';
 
diff --git a/packages/clerk-js/src/utils/cookies/handler.ts b/packages/clerk-js/src/utils/cookies/handler.ts
index ada8c345759..c9e8598d077 100644
--- a/packages/clerk-js/src/utils/cookies/handler.ts
+++ b/packages/clerk-js/src/utils/cookies/handler.ts
@@ -1,4 +1,4 @@
-import { addYears } from '@clerk/common';
+import { addYears } from '@clerk/shared';
 import type { ClientResource } from '@clerk/types';
 
 import { buildURL, getAllETLDs } from '../url';
diff --git a/packages/clerk-js/src/utils/cookies/initted.ts b/packages/clerk-js/src/utils/cookies/initted.ts
index 87c877fee14..42dcad0268f 100644
--- a/packages/clerk-js/src/utils/cookies/initted.ts
+++ b/packages/clerk-js/src/utils/cookies/initted.ts
@@ -1,4 +1,4 @@
-import { createCookieHandler } from '@clerk/common';
+import { createCookieHandler } from '@clerk/shared';
 
 const INITTED_COOKIE_NAME = '__initted';
 
diff --git a/packages/clerk-js/src/utils/cookies/session.ts b/packages/clerk-js/src/utils/cookies/session.ts
index 62f912969e3..222d0af611e 100644
--- a/packages/clerk-js/src/utils/cookies/session.ts
+++ b/packages/clerk-js/src/utils/cookies/session.ts
@@ -1,4 +1,4 @@
-import { createCookieHandler } from '@clerk/common';
+import { createCookieHandler } from '@clerk/shared';
 
 const SESSION_COOKIE_NAME = '__session';
 
diff --git a/packages/clerk-js/src/utils/ignoreEventValue.test.ts b/packages/clerk-js/src/utils/ignoreEventValue.test.ts
index 9105559c02c..c426d370aaa 100644
--- a/packages/clerk-js/src/utils/ignoreEventValue.test.ts
+++ b/packages/clerk-js/src/utils/ignoreEventValue.test.ts
@@ -1,4 +1,4 @@
-import { noop } from '@clerk/common/testUtils';
+import { noop } from '@clerk/shared/testUtils';
 
 import { ignoreEventValue } from './ignoreEventValue';
 
diff --git a/packages/clerk-js/src/utils/pageLifecycle.ts b/packages/clerk-js/src/utils/pageLifecycle.ts
index e076ebde932..b127fdc9d86 100644
--- a/packages/clerk-js/src/utils/pageLifecycle.ts
+++ b/packages/clerk-js/src/utils/pageLifecycle.ts
@@ -1,4 +1,4 @@
-import { inClientSide } from '@clerk/common';
+import { inClientSide } from '@clerk/shared';
 
 const noop = () => {
   //
diff --git a/packages/clerk-js/src/utils/url.ts b/packages/clerk-js/src/utils/url.ts
index b7813226154..0c6a2e8d2b4 100644
--- a/packages/clerk-js/src/utils/url.ts
+++ b/packages/clerk-js/src/utils/url.ts
@@ -1,4 +1,4 @@
-import { camelToSnake, isIPV4Address } from '@clerk/common';
+import { camelToSnake, isIPV4Address } from '@clerk/shared';
 import { SignUpResource } from '@clerk/types';
 
 import { loadScript } from '../utils';
diff --git a/packages/common/global.d.ts b/packages/common/global.d.ts
deleted file mode 100644
index 8c7a4b73b56..00000000000
--- a/packages/common/global.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export {};
-
-declare global {
-  const PACKAGE_VERSION: string;
-  const __DEV__: boolean;
-}
diff --git a/packages/common/package.json b/packages/common/package.json
deleted file mode 100644
index 43b815a5a31..00000000000
--- a/packages/common/package.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
-  "name": "@clerk/common",
-  "version": "0.0.1",
-  "description": "Internal package utils used by the Clerk SDKs",
-  "types": "./dist/types/index.d.ts",
-  "main": "./dist/index.js",
-  "module": "./dist/index.mjs",
-  "files": [
-    "dist",
-    "testUtils"
-  ],
-  "scripts": {
-    "dev": "tsup --watch",
-    "build": "tsup --env.NODE_ENV production",
-    "clean": "rimraf ./dist",
-    "lint": "eslint .",
-    "test": "vitest run",
-    "test:watch": "vitest"
-  },
-  "devDependencies": {
-    "js-cookie": "^3.0.1",
-    "@clerk/types": "^3.10.1",
-    "@types/js-cookie": "^3.0.2",
-    "tsup": "^6.2.3",
-    "typescript": "*",
-    "vitest": "^0.23.4"
-  },
-  "peerDependencies": {
-    "@testing-library/dom": "^7.28.1",
-    "@testing-library/jest-dom": "^5.11.6",
-    "@testing-library/react": "^11.2.1",
-    "@testing-library/react-hooks": "^3.4.2",
-    "@testing-library/user-event": "^12.2.2",
-    "react": "17.0.2",
-    "react-dom": "17.0.2"
-  },
-  "author": "",
-  "license": "ISC"
-}
diff --git a/packages/common/tsconfig.json b/packages/common/tsconfig.json
deleted file mode 100644
index de640a6217a..00000000000
--- a/packages/common/tsconfig.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "compilerOptions": {
-    "esModuleInterop": true,
-    "forceConsistentCasingInFileNames": true,
-    "isolatedModules": true,
-    "moduleResolution": "node",
-    "preserveWatchOutput": true,
-    "skipLibCheck": true,
-    "strict": true,
-    "emitDeclarationOnly": true,
-    "declaration": true,
-    "declarationMap": true,
-    "outDir": "dist",
-    "resolveJsonModule": true,
-    "declarationDir": "dist/types"
-  },
-  "exclude": ["node_modules"],
-  "include": ["src/index.ts", "src/testUtils/index.ts", "global.d.ts"]
-}
diff --git a/packages/react/src/components/SignInButton.test.tsx b/packages/react/src/components/SignInButton.test.tsx
index de742583d13..e3a23836b7f 100644
--- a/packages/react/src/components/SignInButton.test.tsx
+++ b/packages/react/src/components/SignInButton.test.tsx
@@ -1,4 +1,4 @@
-import { render, screen, userEvent, waitFor } from '@clerk/common/testUtils';
+import { render, screen, userEvent, waitFor } from '@clerk/shared/testUtils';
 import React from 'react';
 
 import { SignInButton } from './SignInButton';
diff --git a/packages/react/src/components/SignInWithMetamaskButton.test.tsx b/packages/react/src/components/SignInWithMetamaskButton.test.tsx
index 39a38c0275e..77df3cb6138 100644
--- a/packages/react/src/components/SignInWithMetamaskButton.test.tsx
+++ b/packages/react/src/components/SignInWithMetamaskButton.test.tsx
@@ -1,6 +1,6 @@
 /* eslint-disable react/display-name */
 
-import { render, screen, userEvent, waitFor } from '@clerk/common/testUtils';
+import { render, screen, userEvent, waitFor } from '@clerk/shared/testUtils';
 import React from 'react';
 
 import { SignInWithMetamaskButton } from './SignInWithMetamaskButton';
diff --git a/packages/react/src/components/SignOutButton.test.tsx b/packages/react/src/components/SignOutButton.test.tsx
index 3da21cb4801..4cd982dd301 100644
--- a/packages/react/src/components/SignOutButton.test.tsx
+++ b/packages/react/src/components/SignOutButton.test.tsx
@@ -1,4 +1,4 @@
-import { render, screen, userEvent, waitFor } from '@clerk/common/testUtils';
+import { render, screen, userEvent, waitFor } from '@clerk/shared/testUtils';
 import React from 'react';
 
 import { SignOutButton } from './SignOutButton';
diff --git a/packages/react/src/components/SignUpButton.test.tsx b/packages/react/src/components/SignUpButton.test.tsx
index bacf684f729..d5256aed25f 100644
--- a/packages/react/src/components/SignUpButton.test.tsx
+++ b/packages/react/src/components/SignUpButton.test.tsx
@@ -1,4 +1,4 @@
-import { render, screen, userEvent, waitFor } from '@clerk/common/testUtils';
+import { render, screen, userEvent, waitFor } from '@clerk/shared/testUtils';
 import React from 'react';
 
 import { SignUpButton } from './SignUpButton';
diff --git a/packages/react/src/utils/useMaxAllowedInstancesGuard.test.tsx b/packages/react/src/utils/useMaxAllowedInstancesGuard.test.tsx
index 81920fb65f7..eec5baf2796 100644
--- a/packages/react/src/utils/useMaxAllowedInstancesGuard.test.tsx
+++ b/packages/react/src/utils/useMaxAllowedInstancesGuard.test.tsx
@@ -1,4 +1,4 @@
-import { render } from '@clerk/common/testUtils';
+import { render } from '@clerk/shared/testUtils';
 import React from 'react';
 
 import { useMaxAllowedInstancesGuard, withMaxAllowedInstancesGuard } from './useMaxAllowedInstancesGuard';
diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md
deleted file mode 100644
index be787c070aa..00000000000
--- a/packages/shared/CHANGELOG.md
+++ /dev/null
@@ -1,321 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-### [0.3.27](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.27-staging.0...@clerk/shared@0.3.27) (2022-10-07)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.26](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.26-staging.0...@clerk/shared@0.3.26) (2022-10-05)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.25](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.25-staging.3...@clerk/shared@0.3.25) (2022-10-03)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.24](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.24-staging.4...@clerk/shared@0.3.24) (2022-09-29)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.23](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.22...@clerk/shared@0.3.23) (2022-09-25)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.22](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.22-staging.1...@clerk/shared@0.3.22) (2022-09-24)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.21](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.21-staging.0...@clerk/shared@0.3.21) (2022-09-22)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.20](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.19-staging.4...@clerk/shared@0.3.20) (2022-09-19)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.19](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.19-staging.4...@clerk/shared@0.3.19) (2022-09-16)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.18](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.18-staging.0...@clerk/shared@0.3.18) (2022-09-07)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.17](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.17-staging.0...@clerk/shared@0.3.17) (2022-09-02)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.16](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.16-staging.0...@clerk/shared@0.3.16) (2022-08-29)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.15](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.15-staging.2...@clerk/shared@0.3.15) (2022-08-29)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.14](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.14-staging.0...@clerk/shared@0.3.14) (2022-08-24)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.13](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.12...@clerk/shared@0.3.13) (2022-08-18)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.12](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.12-staging.0...@clerk/shared@0.3.12) (2022-08-18)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.11](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.10...@clerk/shared@0.3.11) (2022-08-16)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.10](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.10-staging.0...@clerk/shared@0.3.10) (2022-08-09)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.9](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.8...@clerk/shared@0.3.9) (2022-08-07)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.8](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.8-staging.1...@clerk/shared@0.3.8) (2022-08-05)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.7](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.6...@clerk/shared@0.3.7) (2022-08-04)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.6](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.5...@clerk/shared@0.3.6) (2022-07-13)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.5](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.5-staging.0...@clerk/shared@0.3.5) (2022-07-12)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.4](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.3...@clerk/shared@0.3.4) (2022-07-07)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.3](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.2...@clerk/shared@0.3.3) (2022-07-06)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.2](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.1...@clerk/shared@0.3.2) (2022-07-01)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.3.1](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.0...@clerk/shared@0.3.1) (2022-06-24)
-
-**Note:** Version bump only for package @clerk/shared
-
-## [0.3.0](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.0-staging.1...@clerk/shared@0.3.0) (2022-06-16)
-
-**Note:** Version bump only for package @clerk/shared
-
-## [0.3.0-staging.1](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.0-staging.0...@clerk/shared@0.3.0-staging.1) (2022-06-16)
-
-### Bug Fixes
-
-- **clerk-js:** Default verification status to unverified if verification is missing ([cac67a0](https://github.com/clerkinc/clerk_docker/commit/cac67a0199c0058ba23a7b74834dfa55915a42ae))
-
-### [0.2.8](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.2.8-staging.3...@clerk/shared@0.2.8) (2022-06-06)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.2.8-staging.3](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.2.8-staging.2...@clerk/shared@0.2.8-staging.3) (2022-06-03)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.2.8-staging.2](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.2.8-staging.1...@clerk/shared@0.2.8-staging.2) (2022-06-02)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.2.8-staging.1](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.2.8-staging.0...@clerk/shared@0.2.8-staging.1) (2022-06-01)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.2.7](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.2.7-staging.1...@clerk/shared@0.2.7) (2022-05-20)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.2.7-staging.1](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.2.6...@clerk/shared@0.2.7-staging.1) (2022-05-18)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.2.7-staging.0](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.2.6...@clerk/shared@0.2.7-staging.0) (2022-05-17)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.2.6](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.2.3...@clerk/shared@0.2.6) (2022-05-13)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.2.5](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.2.3...@clerk/shared@0.2.5) (2022-05-12)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.2.4](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.2.3...@clerk/shared@0.2.4) (2022-05-12)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.2.3](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.2.3-staging.0...@clerk/shared@0.2.3) (2022-05-11)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.2.2](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.2.1...@clerk/shared@0.2.2) (2022-05-06)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.2.1](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.2.1-staging.0...@clerk/shared@0.2.1) (2022-05-05)
-
-**Note:** Version bump only for package @clerk/shared
-
-## [0.2.0](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.2.0-staging.0...@clerk/shared@0.2.0) (2022-04-28)
-
-### Reverts
-
-- Revert "feat(clerk-js,shared): Add support for android WebOTP" ([af090cd](https://github.com/clerkinc/clerk_docker/commit/af090cd43d26d2fb53f00a4eb25e2be4d5c8429f))
-
-### [0.1.4](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.1.4-staging.1...@clerk/shared@0.1.4) (2022-04-19)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.1.4-staging.1](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.1.4-staging.0...@clerk/shared@0.1.4-staging.1) (2022-04-19)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.1.3](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.1.3-alpha.0...@clerk/shared@0.1.3) (2022-04-18)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.1.3-alpha.0](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.1.2...@clerk/shared@0.1.3-alpha.0) (2022-04-15)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.1.2](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.1.2-staging.0...@clerk/shared@0.1.2) (2022-04-15)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.1.1](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.1.1-staging.0...@clerk/shared@0.1.1) (2022-04-13)
-
-**Note:** Version bump only for package @clerk/shared
-
-## [0.1.0](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.21...@clerk/shared@0.1.0) (2022-04-07)
-
-### Features
-
-- **clerk-js,shared:** Autofill OTP using WebOTP on Android ([eb41c34](https://github.com/clerkinc/clerk_docker/commit/eb41c34392ebee5f8b725c4172b2be77b68a0baf))
-- **clerk-js,shared:** Rely on onChange event to fill OTP inputs ([b6811b4](https://github.com/clerkinc/clerk_docker/commit/b6811b4259894bec472953a4b3f0ec50ad7996ab))
-
-### [0.0.21](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.21-staging.0...@clerk/shared@0.0.21) (2022-04-04)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.20](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.20-staging.0...@clerk/shared@0.0.20) (2022-03-29)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.19](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.19-staging.0...@clerk/shared@0.0.19) (2022-03-28)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.18](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.18-alpha.0...@clerk/shared@0.0.18) (2022-03-24)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.18-staging.1](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.18-staging.0...@clerk/shared@0.0.18-staging.1) (2022-03-24)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.17-alpha.0](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.17-staging.0...@clerk/shared@0.0.17-alpha.0) (2022-03-23)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.16-alpha.5](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.16-alpha.4...@clerk/shared@0.0.16-alpha.5) (2022-03-23)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.16-alpha.4](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.16-alpha.3...@clerk/shared@0.0.16-alpha.4) (2022-03-23)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.16-alpha.3](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.16-alpha.2...@clerk/shared@0.0.16-alpha.3) (2022-03-22)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.16-alpha.2](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.16-staging.0...@clerk/shared@0.0.16-alpha.2) (2022-03-22)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.16-alpha.1](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.16-staging.0...@clerk/shared@0.0.16-alpha.1) (2022-03-20)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.16-alpha.0](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.16-staging.0...@clerk/shared@0.0.16-alpha.0) (2022-03-19)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.15](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.15-staging.1...@clerk/shared@0.0.15) (2022-03-17)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.15-staging.1](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.15-staging.0...@clerk/shared@0.0.15-staging.1) (2022-03-17)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.13](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.12...@clerk/shared@0.0.13) (2022-03-11)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.12](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.12-staging.0...@clerk/shared@0.0.12) (2022-03-09)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.10](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.9...@clerk/shared@0.0.10) (2022-03-04)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.9](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.8...@clerk/shared@0.0.9) (2022-03-04)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.8](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.7...@clerk/shared@0.0.8) (2022-03-03)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.7](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.6...@clerk/shared@0.0.7) (2022-03-02)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.6](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.5...@clerk/shared@0.0.6) (2022-03-01)
-
-### Bug Fixes
-
-- **shared:** Phone input should start blank ([43f0b06](https://github.com/clerkinc/clerk_docker/commit/43f0b0603608866f6b9e0a37a284c0ea72c0004b))
-
-### [0.0.5](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.5-staging.0...@clerk/shared@0.0.5) (2022-02-24)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.5-staging.0](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.4-staging.0...@clerk/shared@0.0.5-staging.0) (2022-02-24)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.4-staging.0](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.3-staging.0...@clerk/shared@0.0.4-staging.0) (2022-02-17)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.3-staging.0](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.2...@clerk/shared@0.0.3-staging.0) (2022-02-15)
-
-**Note:** Version bump only for package @clerk/shared
-
-### [0.0.2](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.0.2-staging.0...@clerk/shared@0.0.2) (2022-02-14)
-
-**Note:** Version bump only for package @clerk/shared
-
-### 0.0.2-staging.0 (2022-02-11)
-
-**Note:** Version bump only for package @clerk/shared
diff --git a/packages/shared/global.d.ts b/packages/shared/global.d.ts
index 53d688f03fb..8c7a4b73b56 100644
--- a/packages/shared/global.d.ts
+++ b/packages/shared/global.d.ts
@@ -1,5 +1,6 @@
-declare namespace NodeJS {
-  interface Process {
-    browser: boolean;
-  }
+export {};
+
+declare global {
+  const PACKAGE_VERSION: string;
+  const __DEV__: boolean;
 }
diff --git a/packages/shared/index.d.ts b/packages/shared/index.d.ts
deleted file mode 100644
index 590a7f4c9d1..00000000000
--- a/packages/shared/index.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './components';
-export * from './utils';
diff --git a/packages/shared/index.js b/packages/shared/index.js
deleted file mode 100644
index 04bca77e0de..00000000000
--- a/packages/shared/index.js
+++ /dev/null
@@ -1 +0,0 @@
-export * from './utils';
diff --git a/packages/shared/jest.config.js b/packages/shared/jest.config.js
deleted file mode 100644
index 7c953a5f850..00000000000
--- a/packages/shared/jest.config.js
+++ /dev/null
@@ -1,49 +0,0 @@
-module.exports = {
-  // The root of your source code, typically /src
-  // `<rootDir>` is a token Jest substitutes
-  roots: ['<rootDir>'],
-  testEnvironment: 'jsdom',
-
-  // Global settings
-  globals: {
-    'ts-jest': {
-      tsconfig: 'tsconfig.test.json',
-    },
-  },
-
-  // Coverage
-  collectCoverageFrom: [
-    '**/*.{js,jsx,ts,tsx}',
-    '!**/*.d.ts',
-    '!**/index.ts',
-    '!**/*.config.{js,ts}',
-    '!**/coverage/**',
-    '!**/node_modules/**',
-  ],
-
-  setupFilesAfterEnv: ['./../../setupJest.afterEnv.js'],
-
-  // Jest transformations -- this adds support for TypeScript
-  // using ts-jest
-  transform: {
-    '^.+\\.tsx?$': 'ts-jest',
-    '\\.svg?$': '<rootDir>/utils/svgTransform.js',
-  },
-
-  // Test spec file resolution pattern
-  // Matches parent folder `__tests__` and filename
-  // should contain `test` or `spec`.
-  testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$',
-
-  // Module file extensions for importings
-  transformIgnorePatterns: ['[/\\\\]node_modules[/\\\\].+\\.(js|jsx|ts|tsx)$', '^.+\\.module\\.(css|sass|scss)$'],
-
-  // Use an ES6 Proxy to mock CSS Modules and resource our testUtils
-  // https://jestjs.io/docs/en/webpack#mocking-css-modules
-  moduleNameMapper: {
-    testUtils: '<rootDir>/utils/testUtils',
-    '\\.(jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
-      '<rootDir>/__mocks__/fileMock.js',
-    '\\.(css|less|scss|sass)$': 'identity-obj-proxy',
-  },
-};
diff --git a/packages/shared/package.json b/packages/shared/package.json
index cfd07327910..1aacd2ecc98 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -1,60 +1,39 @@
 {
   "name": "@clerk/shared",
-  "version": "0.3.27",
-  "private": true,
-  "main": "index.js",
-  "module": "index.js",
-  "typings": "index.d.ts",
-  "sideEffects": false,
+  "version": "0.0.1",
+  "description": "Internal package utils used by the Clerk SDKs",
+  "types": "./dist/types/index.d.ts",
+  "main": "./dist/index.js",
+  "module": "./dist/index.mjs",
+  "files": [
+    "dist",
+    "testUtils"
+  ],
   "scripts": {
-    "test": "jest",
-    "test:watch": "jest --watch",
-    "test:coverage": "jest --collectCoverage"
-  },
-  "peerDependencies": {
-    "@popperjs/core": "^2.5.4",
-    "@svgr/webpack": "^6.2.1",
-    "core-js": "^3.18.3",
-    "react-color": "2.19.3",
-    "react": "17.0.2",
-    "react-dom": "17.0.2",
-    "react-popper": "^2.2.4",
-    "regenerator-runtime": "^0.13.7"
+    "dev": "tsup --watch",
+    "build": "tsup --env.NODE_ENV production",
+    "clean": "rimraf ./dist",
+    "lint": "eslint .",
+    "test": "vitest run",
+    "test:watch": "vitest"
   },
   "devDependencies": {
-    "@babel/core": "^7.13.14",
-    "@babel/preset-env": "^7.13.12",
-    "@babel/preset-react": "^7.13.13",
+    "js-cookie": "^3.0.1",
     "@clerk/types": "^3.10.1",
-    "@popperjs/core": "^2.5.4",
-    "@sentry/browser": "^6.3.0",
-    "@svgr/webpack": "^6.2.1",
+    "@types/js-cookie": "^3.0.2",
+    "tsup": "^6.2.3",
+    "typescript": "*",
+    "vitest": "^0.23.4"
+  },
+  "peerDependencies": {
     "@testing-library/dom": "^7.28.1",
     "@testing-library/jest-dom": "^5.11.6",
     "@testing-library/react": "^11.2.1",
     "@testing-library/react-hooks": "^3.4.2",
     "@testing-library/user-event": "^12.2.2",
-    "@types/babel__core": "^7",
-    "@types/babel__preset-env": "^7",
-    "@types/classnames": "^2",
-    "@types/jest": "^27.4.0",
-    "@types/node": "^16.11.55",
-    "@types/react": "^17.0.39",
-    "@types/react-color": "^3.0.4",
-    "@types/react-dom": "^17.0.11",
-    "@types/react-test-renderer": "^17",
-    "@types/testing-library__jest-dom": "^5",
-    "@types/testing-library__react-hooks": "^3",
-    "classnames": "^2.3.1",
-    "clipboard-copy": "^4.0.1",
-    "core-js": "^3.18.3",
-    "identity-obj-proxy": "^3.0.0",
-    "jest": "^27.4.7",
     "react": "17.0.2",
-    "react-color": "2.19.3",
-    "react-dom": "17.0.2",
-    "react-popper": "^2.2.4",
-    "react-test-renderer": "17.0.2",
-    "ts-jest": "^27.1.3"
-  }
+    "react-dom": "17.0.2"
+  },
+  "author": "",
+  "license": "ISC"
 }
diff --git a/packages/common/src/index.ts b/packages/shared/src/index.ts
similarity index 100%
rename from packages/common/src/index.ts
rename to packages/shared/src/index.ts
diff --git a/packages/common/src/testUtils/index.ts b/packages/shared/src/testUtils/index.ts
similarity index 100%
rename from packages/common/src/testUtils/index.ts
rename to packages/shared/src/testUtils/index.ts
diff --git a/packages/common/src/testUtils/testUtils.ts b/packages/shared/src/testUtils/testUtils.ts
similarity index 100%
rename from packages/common/src/testUtils/testUtils.ts
rename to packages/shared/src/testUtils/testUtils.ts
diff --git a/packages/common/src/utils/array.test.ts b/packages/shared/src/utils/array.test.ts
similarity index 100%
rename from packages/common/src/utils/array.test.ts
rename to packages/shared/src/utils/array.test.ts
diff --git a/packages/common/src/utils/array.ts b/packages/shared/src/utils/array.ts
similarity index 100%
rename from packages/common/src/utils/array.ts
rename to packages/shared/src/utils/array.ts
diff --git a/packages/common/src/utils/browser.test.ts b/packages/shared/src/utils/browser.test.ts
similarity index 100%
rename from packages/common/src/utils/browser.test.ts
rename to packages/shared/src/utils/browser.test.ts
diff --git a/packages/common/src/utils/browser.ts b/packages/shared/src/utils/browser.ts
similarity index 100%
rename from packages/common/src/utils/browser.ts
rename to packages/shared/src/utils/browser.ts
diff --git a/packages/common/src/utils/color/cssColorUtils.test.ts b/packages/shared/src/utils/color/cssColorUtils.test.ts
similarity index 100%
rename from packages/common/src/utils/color/cssColorUtils.test.ts
rename to packages/shared/src/utils/color/cssColorUtils.test.ts
diff --git a/packages/common/src/utils/color/cssColorUtils.ts b/packages/shared/src/utils/color/cssColorUtils.ts
similarity index 100%
rename from packages/common/src/utils/color/cssColorUtils.ts
rename to packages/shared/src/utils/color/cssColorUtils.ts
diff --git a/packages/common/src/utils/color/index.ts b/packages/shared/src/utils/color/index.ts
similarity index 100%
rename from packages/common/src/utils/color/index.ts
rename to packages/shared/src/utils/color/index.ts
diff --git a/packages/common/src/utils/color/predicates.ts b/packages/shared/src/utils/color/predicates.ts
similarity index 100%
rename from packages/common/src/utils/color/predicates.ts
rename to packages/shared/src/utils/color/predicates.ts
diff --git a/packages/common/src/utils/cookies.ts b/packages/shared/src/utils/cookies.ts
similarity index 100%
rename from packages/common/src/utils/cookies.ts
rename to packages/shared/src/utils/cookies.ts
diff --git a/packages/common/src/utils/date.test.ts b/packages/shared/src/utils/date.test.ts
similarity index 100%
rename from packages/common/src/utils/date.test.ts
rename to packages/shared/src/utils/date.test.ts
diff --git a/packages/common/src/utils/date.ts b/packages/shared/src/utils/date.ts
similarity index 100%
rename from packages/common/src/utils/date.ts
rename to packages/shared/src/utils/date.ts
diff --git a/packages/common/src/utils/file.ts b/packages/shared/src/utils/file.ts
similarity index 100%
rename from packages/common/src/utils/file.ts
rename to packages/shared/src/utils/file.ts
diff --git a/packages/common/src/utils/index.ts b/packages/shared/src/utils/index.ts
similarity index 100%
rename from packages/common/src/utils/index.ts
rename to packages/shared/src/utils/index.ts
diff --git a/packages/common/src/utils/isRetinaDisplay.ts b/packages/shared/src/utils/isRetinaDisplay.ts
similarity index 100%
rename from packages/common/src/utils/isRetinaDisplay.ts
rename to packages/shared/src/utils/isRetinaDisplay.ts
diff --git a/packages/common/src/utils/localStorageBroadcastChannel.test.ts b/packages/shared/src/utils/localStorageBroadcastChannel.test.ts
similarity index 100%
rename from packages/common/src/utils/localStorageBroadcastChannel.test.ts
rename to packages/shared/src/utils/localStorageBroadcastChannel.test.ts
diff --git a/packages/common/src/utils/localStorageBroadcastChannel.ts b/packages/shared/src/utils/localStorageBroadcastChannel.ts
similarity index 100%
rename from packages/common/src/utils/localStorageBroadcastChannel.ts
rename to packages/shared/src/utils/localStorageBroadcastChannel.ts
diff --git a/packages/common/src/utils/mimeTypeExtensions.ts b/packages/shared/src/utils/mimeTypeExtensions.ts
similarity index 100%
rename from packages/common/src/utils/mimeTypeExtensions.ts
rename to packages/shared/src/utils/mimeTypeExtensions.ts
diff --git a/packages/common/src/utils/noop.ts b/packages/shared/src/utils/noop.ts
similarity index 100%
rename from packages/common/src/utils/noop.ts
rename to packages/shared/src/utils/noop.ts
diff --git a/packages/common/src/utils/object.test.ts b/packages/shared/src/utils/object.test.ts
similarity index 100%
rename from packages/common/src/utils/object.test.ts
rename to packages/shared/src/utils/object.test.ts
diff --git a/packages/common/src/utils/object.ts b/packages/shared/src/utils/object.ts
similarity index 100%
rename from packages/common/src/utils/object.ts
rename to packages/shared/src/utils/object.ts
diff --git a/packages/common/src/utils/poller.ts b/packages/shared/src/utils/poller.ts
similarity index 100%
rename from packages/common/src/utils/poller.ts
rename to packages/shared/src/utils/poller.ts
diff --git a/packages/common/src/utils/ssr.ts b/packages/shared/src/utils/ssr.ts
similarity index 100%
rename from packages/common/src/utils/ssr.ts
rename to packages/shared/src/utils/ssr.ts
diff --git a/packages/common/src/utils/string.test.ts b/packages/shared/src/utils/string.test.ts
similarity index 100%
rename from packages/common/src/utils/string.test.ts
rename to packages/shared/src/utils/string.test.ts
diff --git a/packages/common/src/utils/string.ts b/packages/shared/src/utils/string.ts
similarity index 100%
rename from packages/common/src/utils/string.ts
rename to packages/shared/src/utils/string.ts
diff --git a/packages/common/src/utils/url.test.ts b/packages/shared/src/utils/url.test.ts
similarity index 100%
rename from packages/common/src/utils/url.test.ts
rename to packages/shared/src/utils/url.test.ts
diff --git a/packages/common/src/utils/url.ts b/packages/shared/src/utils/url.ts
similarity index 100%
rename from packages/common/src/utils/url.ts
rename to packages/shared/src/utils/url.ts
diff --git a/packages/shared/testUtils.d.ts b/packages/shared/testUtils.d.ts
deleted file mode 100644
index 73050a43b22..00000000000
--- a/packages/shared/testUtils.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './utils/testUtils';
diff --git a/packages/shared/testUtils.js b/packages/shared/testUtils.js
deleted file mode 100644
index 7d062decd48..00000000000
--- a/packages/shared/testUtils.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./utils/testUtils');
diff --git a/packages/common/testUtils/package.json b/packages/shared/testUtils/package.json
similarity index 100%
rename from packages/common/testUtils/package.json
rename to packages/shared/testUtils/package.json
diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json
index f862ea732df..de640a6217a 100644
--- a/packages/shared/tsconfig.json
+++ b/packages/shared/tsconfig.json
@@ -1,14 +1,19 @@
 {
   "compilerOptions": {
-    "baseUrl": "./",
     "esModuleInterop": true,
     "forceConsistentCasingInFileNames": true,
-    "importHelpers": true,
-    "jsx": "react",
-    "lib": ["dom", "dom.iterable", "esnext"],
-    "module": "es2020",
+    "isolatedModules": true,
     "moduleResolution": "node",
+    "preserveWatchOutput": true,
+    "skipLibCheck": true,
     "strict": true,
-    "target": "ES2017"
-  }
+    "emitDeclarationOnly": true,
+    "declaration": true,
+    "declarationMap": true,
+    "outDir": "dist",
+    "resolveJsonModule": true,
+    "declarationDir": "dist/types"
+  },
+  "exclude": ["node_modules"],
+  "include": ["src/index.ts", "src/testUtils/index.ts", "global.d.ts"]
 }
diff --git a/packages/shared/tsconfig.test.json b/packages/shared/tsconfig.test.json
deleted file mode 100644
index 2a4a5aeb50f..00000000000
--- a/packages/shared/tsconfig.test.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "extends": "./tsconfig.json",
-  "compilerOptions": {
-    "jsx": "react",
-    "strict": false
-  }
-}
diff --git a/packages/common/tsup.config.ts b/packages/shared/tsup.config.ts
similarity index 100%
rename from packages/common/tsup.config.ts
rename to packages/shared/tsup.config.ts
diff --git a/packages/shared/utils/array.test.ts b/packages/shared/utils/array.test.ts
deleted file mode 100644
index 98d65d671ed..00000000000
--- a/packages/shared/utils/array.test.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { toSentence } from './array';
-
-describe('toSentence', () => {
-  it('returns a single item as-is', () => {
-    expect(toSentence(['xyz'])).toBe('xyz');
-    expect(toSentence(['abc'])).toBe('abc');
-  });
-
-  it('joins multiple items but the last with a comma and the last with ", or"', () => {
-    expect(toSentence(['abc', 'def'])).toBe('abc, or def');
-    expect(toSentence(['qwe', 'zxc', 'asd'])).toBe('qwe, zxc, or asd');
-  });
-
-  it('returns empty string if passed an empty array', () => {
-    expect(toSentence([])).toBe('');
-  });
-});
diff --git a/packages/shared/utils/array.ts b/packages/shared/utils/array.ts
deleted file mode 100644
index 6e72606e37e..00000000000
--- a/packages/shared/utils/array.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-export const toSentence = (items: string[]): string => {
-  // TODO: Once Safari supports it, use Intl.ListFormat
-  if (items.length == 0) {
-    return '';
-  }
-  if (items.length == 1) {
-    return items[0];
-  }
-  let sentence = items.slice(0, -1).join(', ');
-  sentence += `, or ${items.slice(-1)}`;
-  return sentence;
-};
diff --git a/packages/shared/utils/browser.test.ts b/packages/shared/utils/browser.test.ts
deleted file mode 100644
index 8b2404bbbfc..00000000000
--- a/packages/shared/utils/browser.test.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { inBrowser } from './browser';
-
-describe('inBrowser()', () => {
-  it('returns true if window is defined', () => {
-    expect(inBrowser()).toBe(true);
-  });
-});
diff --git a/packages/shared/utils/browser.ts b/packages/shared/utils/browser.ts
deleted file mode 100644
index 442f85e93e4..00000000000
--- a/packages/shared/utils/browser.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export function inBrowser(): boolean {
-  return typeof window !== 'undefined';
-}
diff --git a/packages/shared/utils/color/cssColorUtils.test.ts b/packages/shared/utils/color/cssColorUtils.test.ts
deleted file mode 100644
index 41143d78498..00000000000
--- a/packages/shared/utils/color/cssColorUtils.test.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-import { Color } from 'react-color';
-
-import { colorToSameTypeString, hexStringToRgbaColor, stringToHslaColor, stringToSameTypeColor } from './cssColorUtils';
-
-describe('stringToHslaColor(color)', function () {
-  const hsla = { h: 195, s: 1, l: 0.5 };
-  const cases: Array<[string, Color | null]> = [
-    ['', null],
-    ['transparent', { h: 0, s: 0, l: 0, a: 0 }],
-    ['#00bfff', hsla],
-    ['00bfff', hsla],
-    ['rgb(0, 191, 255)', hsla],
-    ['rgba(0, 191, 255, 0.3)', { ...hsla, a: 0.3 }],
-  ];
-
-  it.each(cases)('.stringToHslaColor(%s) => %s', (a, expected) => {
-    expect(stringToHslaColor(a)).toEqual(expected);
-  });
-});
-
-describe('hexStringToRgbaColor(color)', function () {
-  const cases: Array<[string, Color | null]> = [
-    ['#00bfff', { r: 0, g: 191, b: 255 }],
-    ['00bfff', { r: 0, g: 191, b: 255 }],
-  ];
-
-  it.each(cases)('.hexStringToRgbaColor(%s) => %s', (a, expected) => {
-    expect(hexStringToRgbaColor(a)).toEqual(expected);
-  });
-});
-
-describe('stringToSameTypeColor(color)', function () {
-  const cases: Array<[string, Color | null]> = [
-    ['', ''],
-    ['invalid', ''],
-    ['12ff12', '#12ff12'],
-    ['#12ff12', '#12ff12'],
-    ['1ff', '#1ff'],
-    ['transparent', 'transparent'],
-    ['rgb(100,100,100)', { r: 100, g: 100, b: 100, a: undefined }],
-    ['rgba(100,100,100,0.5)', { r: 100, g: 100, b: 100, a: 0.5 }],
-    ['rgb(100,100,100)', { r: 100, g: 100, b: 100, a: undefined }],
-    ['rgba(100,100,100,0.5)', { r: 100, g: 100, b: 100, a: 0.5 }],
-    ['hsl(244,66%,33%)', { h: 244, s: 0.66, l: 0.33, a: undefined }],
-    ['hsla(244,66%,33%,0.5)', { h: 244, s: 0.66, l: 0.33, a: 0.5 }],
-    ['hsl(244,66%,33)', ''],
-    ['hsla(244,66%,33,0.5)', ''],
-  ];
-
-  it.each(cases)('.stringToSameTypeColor(%s) => %s', (a, expected) => {
-    expect(stringToSameTypeColor(a)).toEqual(expected);
-  });
-});
-
-describe('colorToSameTypeString(color)', function () {
-  const cases: Array<[Color, string]> = [
-    ['', ''],
-    ['invalid', ''],
-    ['#12ff12', '#12ff12'],
-    ['#12ff12', '#12ff12'],
-    ['#1ff', '#1ff'],
-    [{ r: 100, g: 100, b: 100, a: undefined }, 'rgb(100,100,100)'],
-    [{ r: 100, g: 100, b: 100, a: 0.5 }, 'rgba(100,100,100,0.5)'],
-    [{ h: 100, s: 0.55, l: 0.33, a: undefined }, 'hsl(100,55%,33%)'],
-    [{ h: 100, s: 1, l: 1, a: 0.5 }, 'hsla(100,100%,100%,0.5)'],
-  ];
-
-  it.each(cases)('.colorToSameTypeString(%s) => %s', (a, expected) => {
-    expect(colorToSameTypeString(a)).toEqual(expected);
-  });
-});
diff --git a/packages/shared/utils/color/cssColorUtils.ts b/packages/shared/utils/color/cssColorUtils.ts
deleted file mode 100644
index 51b8b59c7c6..00000000000
--- a/packages/shared/utils/color/cssColorUtils.ts
+++ /dev/null
@@ -1,151 +0,0 @@
-import { Color, HslaColor, RgbaColor, TransparentColor } from '@clerk/types';
-
-import {
-  isHSLColor,
-  isRGBColor,
-  isTransparent,
-  isValidHexString,
-  isValidHslaString,
-  isValidRgbaString,
-} from './predicates';
-
-const CLEAN_HSLA_REGEX = /[hsla()]/g;
-const CLEAN_RGBA_REGEX = /[rgba()]/g;
-
-export const stringToHslaColor = (value: string): HslaColor | null => {
-  if (value === 'transparent') {
-    return { h: 0, s: 0, l: 0, a: 0 };
-  }
-
-  if (isValidHexString(value)) {
-    return hexStringToHslaColor(value);
-  }
-
-  if (isValidHslaString(value)) {
-    return parseHslaString(value);
-  }
-
-  if (isValidRgbaString(value)) {
-    return rgbaStringToHslaColor(value);
-  }
-
-  return null;
-};
-
-export const stringToSameTypeColor = (value: string): Color => {
-  value = value.trim();
-  if (isValidHexString(value)) {
-    return value.startsWith('#') ? value : `#${value}`;
-  }
-
-  if (isValidRgbaString(value)) {
-    return parseRgbaString(value);
-  }
-
-  if (isValidHslaString(value)) {
-    return parseHslaString(value);
-  }
-
-  if (isTransparent(value)) {
-    return value;
-  }
-  return '';
-};
-
-export const colorToSameTypeString = (color: Color): string | TransparentColor => {
-  if (typeof color === 'string' && (isValidHexString(color) || isTransparent(color))) {
-    return color;
-  }
-
-  if (isRGBColor(color)) {
-    return rgbaColorToRgbaString(color);
-  }
-
-  if (isHSLColor(color)) {
-    return hslaColorToHslaString(color);
-  }
-
-  return '';
-};
-
-export const hexStringToRgbaColor = (hex: string): RgbaColor => {
-  hex = hex.replace('#', '');
-  const r = parseInt(hex.substring(0, 2), 16);
-  const g = parseInt(hex.substring(2, 4), 16);
-  const b = parseInt(hex.substring(4, 6), 16);
-  return { r, g, b };
-};
-
-const rgbaColorToRgbaString = (color: RgbaColor): string => {
-  const { a, b, g, r } = color;
-  return color.a === 0 ? 'transparent' : color.a != undefined ? `rgba(${r},${g},${b},${a})` : `rgb(${r},${g},${b})`;
-};
-
-const hslaColorToHslaString = (color: HslaColor): string => {
-  const { h, s, l, a } = color;
-  const sPerc = Math.round(s * 100);
-  const lPerc = Math.round(l * 100);
-  return color.a === 0
-    ? 'transparent'
-    : color.a != undefined
-    ? `hsla(${h},${sPerc}%,${lPerc}%,${a})`
-    : `hsl(${h},${sPerc}%,${lPerc}%)`;
-};
-
-const hexStringToHslaColor = (hex: string): HslaColor => {
-  const rgbaString = colorToSameTypeString(hexStringToRgbaColor(hex));
-  return rgbaStringToHslaColor(rgbaString);
-};
-
-const rgbaStringToHslaColor = (rgba: string): HslaColor => {
-  const rgbaColor = parseRgbaString(rgba);
-  const r = rgbaColor.r / 255;
-  const g = rgbaColor.g / 255;
-  const b = rgbaColor.b / 255;
-
-  const max = Math.max(r, g, b),
-    min = Math.min(r, g, b);
-  let h, s;
-  const l = (max + min) / 2;
-
-  if (max == min) {
-    h = s = 0;
-  } else {
-    const d = max - min;
-    s = l >= 0.5 ? d / (2 - (max + min)) : d / (max + min);
-    switch (max) {
-      case r:
-        h = ((g - b) / d) * 60;
-        break;
-      case g:
-        h = ((b - r) / d + 2) * 60;
-        break;
-      default:
-        h = ((r - g) / d + 4) * 60;
-        break;
-    }
-  }
-
-  const res: HslaColor = { h: Math.round(h), s, l };
-  const a = rgbaColor.a;
-  if (a != undefined) {
-    res.a = a;
-  }
-  return res;
-};
-
-const parseRgbaString = (str: string): RgbaColor => {
-  const [r, g, b, a] = str
-    .replace(CLEAN_RGBA_REGEX, '')
-    .split(',')
-    .map(c => Number.parseFloat(c));
-  return { r, g, b, a };
-};
-
-const parseHslaString = (str: string): HslaColor => {
-  const [h, s, l, a] = str
-    .replace(CLEAN_HSLA_REGEX, '')
-    .split(',')
-    .map(c => Number.parseFloat(c));
-  return { h, s: s / 100, l: l / 100, a };
-};
diff --git a/packages/shared/utils/color/index.ts b/packages/shared/utils/color/index.ts
deleted file mode 100644
index 738532889d3..00000000000
--- a/packages/shared/utils/color/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './cssColorUtils';
-export * from './predicates';
diff --git a/packages/shared/utils/color/predicates.ts b/packages/shared/utils/color/predicates.ts
deleted file mode 100644
index c17424f1710..00000000000
--- a/packages/shared/utils/color/predicates.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { Color, HslaColor, RgbaColor, TransparentColor } from '@clerk/types';
-
-const IS_HEX_COLOR_REGEX = /^#?([A-F0-9]{6}|[A-F0-9]{3})$/i;
-
-const IS_RGB_COLOR_REGEX = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/i;
-const IS_RGBA_COLOR_REGEX = /^rgba\((\d+),\s*(\d+),\s*(\d+)(,\s*\d+(\.\d+)?)\)$/i;
-
-const IS_HSL_COLOR_REGEX = /^hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)$/i;
-const IS_HSLA_COLOR_REGEX = /^hsla\((\d+),\s*([\d.]+)%,\s*([\d.]+)%(,\s*\d+(\.\d+)?)*\)$/i;
-
-export const isValidHexString = (s: string) => {
-  return !!s.match(IS_HEX_COLOR_REGEX);
-};
-
-export const isValidRgbaString = (s: string) => {
-  return !!(s.match(IS_RGB_COLOR_REGEX) || s.match(IS_RGBA_COLOR_REGEX));
-};
-
-export const isValidHslaString = (s: string) => {
-  return !!s.match(IS_HSL_COLOR_REGEX) || !!s.match(IS_HSLA_COLOR_REGEX);
-};
-
-export const isRGBColor = (c: Color): c is RgbaColor => {
-  return typeof c !== 'string' && 'r' in c;
-};
-
-export const isHSLColor = (c: Color): c is HslaColor => {
-  return typeof c !== 'string' && 'h' in c;
-};
-
-export const isTransparent = (c: Color): c is TransparentColor => {
-  return c === 'transparent';
-};
-
-export const hasAlpha = (color: Color): boolean => {
-  return typeof color !== 'string' && color.a != undefined && color.a < 1;
-};
diff --git a/packages/shared/utils/cookies.ts b/packages/shared/utils/cookies.ts
deleted file mode 100644
index b701c1da92a..00000000000
--- a/packages/shared/utils/cookies.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import Cookies, { CookieAttributes } from 'js-cookie';
-
-type LocationAttributes = {
-  path?: string;
-  domain?: string;
-};
-
-export function createCookieHandler(cookieName: string) {
-  return {
-    get() {
-      return Cookies.get(cookieName);
-    },
-    /**
-     * Setting a cookie will use some defaults such as path being set to "/".
-     */
-    set(newValue: string, options: CookieAttributes = {}) {
-      return Cookies.set(cookieName, newValue, options);
-    },
-    /**
-     * On removing a cookie, you have to pass the exact same path/domain attributes used to set it initially
-     * @see https://github.com/js-cookie/js-cookie#basic-usage
-     */
-    remove(locationAttributes?: LocationAttributes) {
-      Cookies.remove(cookieName, locationAttributes);
-    },
-  };
-}
diff --git a/packages/shared/utils/date.test.ts b/packages/shared/utils/date.test.ts
deleted file mode 100644
index ce9e23bf464..00000000000
--- a/packages/shared/utils/date.test.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { addYears, dateTo12HourTime, differenceInCalendarDays, formatRelative } from './date';
-
-describe('date utils', () => {
-  describe('dateTo12HourTime(date)', () => {
-    const cases: Array<[Date | undefined, string]> = [
-      [undefined, ''],
-      [new Date('1/1/2020 23:15'), '11:15 PM'],
-      [new Date('1/1/2020 11:15'), '11:15 AM'],
-      [new Date('1/1/2020 01:59'), '01:59 AM'],
-      [new Date('1/1/2020 13:59'), '01:59 PM'],
-      [new Date('1/1/2020 00:59'), '12:59 AM'],
-    ];
-
-    it.each(cases)('.dateTo12HourTime(%s) => %s', (a, expected) => {
-      expect(dateTo12HourTime(a as any)).toBe(expected);
-    });
-  });
-
-  describe('differenceInCalendarDays(date1, date2)', () => {
-    const cases: Array<[Date | undefined, Date, { absolute: boolean }, number]> = [
-      [undefined, new Date(), { absolute: true }, 0],
-      [new Date('1/1/2020'), new Date('1/2/2020'), { absolute: true }, 1],
-      [new Date('1/1/2020'), new Date('1/3/2020'), { absolute: true }, 2],
-      [new Date('1/30/2020'), new Date('1/31/2020'), { absolute: true }, 1],
-      [new Date('1/30/2020'), new Date('2/1/2020'), { absolute: true }, 2],
-      [new Date('1/1/2020'), new Date('2/1/2020'), { absolute: true }, 31],
-      [new Date('1/1/2020'), new Date('1/2/2020'), { absolute: false }, 1],
-      [new Date('1/1/2020'), new Date('1/5/2020'), { absolute: false }, 4],
-      [new Date('1/5/2020'), new Date('1/1/2020'), { absolute: true }, 4],
-      [new Date('1/5/2020'), new Date('1/1/2020'), { absolute: false }, -4],
-    ];
-
-    it.each(cases)('.differenceInCalendarDays(%s,%s) => %s', (a, b, c, expected) => {
-      expect(differenceInCalendarDays(a as Date, b, c)).toBe(expected);
-    });
-  });
-
-  describe('formatRelative(date)', () => {
-    const cases: Array<[Date | undefined, Date | undefined, string]> = [
-      [undefined, undefined, ''],
-      [new Date('1/1/2020 23:15'), new Date('1/1/2020'), 'today at 11:15 PM'],
-      [new Date('1/5/2020 23:15'), new Date('1/6/2020'), 'yesterday at 11:15 PM'],
-      [new Date('1/3/2020 23:15'), new Date('1/6/2020'), 'last Friday at 11:15 PM'],
-      [new Date('1/7/2020 23:15'), new Date('1/6/2020'), 'tomorrow at 11:15 PM'],
-      [new Date('1/10/2020 23:15'), new Date('1/6/2020'), 'Friday at 11:15 PM'],
-      [new Date('12/10/2020 23:15'), new Date('1/6/2020'), '12/10/2020'],
-      [new Date('12/10/2020 23:15'), new Date('1/6/2021'), '12/10/2020'],
-    ];
-
-    it.each(cases)('.formatRelative(%s, %s) => %s', (a, b, expected) => {
-      expect(formatRelative(a as Date, b as Date)).toBe(expected);
-    });
-  });
-
-  describe('addYears(date, number)', () => {
-    const cases: Array<[Date, number, Date]> = [
-      [new Date('1/1/2020 23:15'), 1, new Date('1/1/2021 23:15')],
-      [new Date('1/1/2019 23:15'), 1, new Date('1/1/2020 23:15')],
-      [new Date('1/1/2021 23:15'), 100, new Date('1/1/2121 23:15')],
-      [new Date('1/1/2021 23:15'), 0, new Date('1/1/2021 23:15')],
-    ];
-
-    it.each(cases)('.addYears(%s, %s) => %s', (a, b, expected) => {
-      expect(addYears(a, b)).toStrictEqual(expected);
-    });
-  });
-});
diff --git a/packages/shared/utils/date.ts b/packages/shared/utils/date.ts
deleted file mode 100644
index 31402e411e8..00000000000
--- a/packages/shared/utils/date.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-const MILLISECONDS_IN_DAY = 86400000;
-const DAYS_EN = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
-
-export function dateTo12HourTime(date: Date): string {
-  if (!date) {
-    return '';
-  }
-  return date.toLocaleString('en-US', {
-    hour: '2-digit',
-    minute: 'numeric',
-    hour12: true,
-  });
-}
-
-export function differenceInCalendarDays(a: Date, b: Date, { absolute = true } = {}): number {
-  if (!a || !b) {
-    return 0;
-  }
-  const utcA = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
-  const utcB = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());
-  const diff = Math.floor((utcB - utcA) / MILLISECONDS_IN_DAY);
-  return absolute ? Math.abs(diff) : diff;
-}
-
-function normalizeDate(d: Date | string | number): Date {
-  try {
-    return new Date(d || new Date());
-  } catch (e) {
-    return new Date();
-  }
-}
-
-/*
- * Follows date-fns format, see here:
- * https://date-fns.org/v2.21.1/docs/formatRelative
- * TODO: support localisation
- * | Distance to the base date | Result                    |
- * |---------------------------|---------------------------|
- * | Previous 6 days           | last Sunday at 04:30 AM   |
- * | Last day                  | yesterday at 04:30 AM     |
- * | Same day                  | today at 04:30 AM         |
- * | Next day                  | tomorrow at 04:30 AM      |
- * | Next 6 days               | Sunday at 04:30 AM        |
- * | Other                     | 12/31/2017                |
- */
-export function formatRelative(date: Date, relativeTo: Date): string {
-  if (!date || !relativeTo) {
-    return '';
-  }
-  const a = normalizeDate(date);
-  const b = normalizeDate(relativeTo);
-  const differenceInDays = differenceInCalendarDays(b, a, { absolute: false });
-  const time12Hour = dateTo12HourTime(a);
-  const dayName = DAYS_EN[a.getDay()];
-
-  if (differenceInDays < -6) {
-    return a.toLocaleDateString();
-  }
-  if (differenceInDays < -1) {
-    return `last ${dayName} at ${time12Hour}`;
-  }
-  if (differenceInDays === -1) {
-    return `yesterday at ${time12Hour}`;
-  }
-  if (differenceInDays === 0) {
-    return `today at ${time12Hour}`;
-  }
-  if (differenceInDays === 1) {
-    return `tomorrow at ${time12Hour}`;
-  }
-  if (differenceInDays < 7) {
-    return `${dayName} at ${time12Hour}`;
-  }
-  return a.toLocaleDateString();
-}
-
-export function addYears(initialDate: Date | number | string, yearsToAdd: number): Date {
-  const date = normalizeDate(initialDate);
-  date.setFullYear(date.getFullYear() + yearsToAdd);
-  return date;
-}
diff --git a/packages/shared/utils/file.ts b/packages/shared/utils/file.ts
deleted file mode 100644
index 82dc23a7132..00000000000
--- a/packages/shared/utils/file.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * Read an expected JSON type File.
- *
- * Probably paired with:
- *  <input type='file' accept='application/JSON' ... />
- */
-export function readJSONFile(file: File): Promise<unknown> {
-  return new Promise((resolve, reject) => {
-    const reader = new FileReader();
-    reader.addEventListener('load', function () {
-      const result = JSON.parse(reader.result as string);
-      resolve(result);
-    });
-
-    reader.addEventListener('error', reject);
-    reader.readAsText(file);
-  });
-}
diff --git a/packages/shared/utils/index.ts b/packages/shared/utils/index.ts
deleted file mode 100644
index f06f27b309d..00000000000
--- a/packages/shared/utils/index.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-export * from './browser';
-export * from './cookies';
-export * from './file';
-export * from './noop';
-export * from './object';
-export * from './string';
-export * from './url';
-export * from './ssr';
diff --git a/packages/shared/utils/isRetinaDisplay.ts b/packages/shared/utils/isRetinaDisplay.ts
deleted file mode 100644
index 3e35b03f1ae..00000000000
--- a/packages/shared/utils/isRetinaDisplay.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-export function isRetinaDisplay(): boolean {
-  if (!window.matchMedia) {
-    return false;
-  }
-  const mq = window.matchMedia(
-    'only screen and (min--moz-device-pixel-ratio: 1.3), only screen and (-o-min-device-pixel-ratio: 2.6/2), only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen  and (min-device-pixel-ratio: 1.3), only screen and (min-resolution: 1.3dppx)',
-  );
-  return (mq && mq.matches) || window.devicePixelRatio > 1;
-}
diff --git a/packages/shared/utils/localStorageBroadcastChannel.test.ts b/packages/shared/utils/localStorageBroadcastChannel.test.ts
deleted file mode 100644
index 5f060b3f0be..00000000000
--- a/packages/shared/utils/localStorageBroadcastChannel.test.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import { LocalStorageBroadcastChannel } from './localStorageBroadcastChannel';
-
-const bcName = 'clerk';
-describe('LocalStorageBroadcastChannel', () => {
-  let localStorageMock;
-  beforeEach(() => {
-    localStorageMock = (() => {
-      const store: Record<string, any> = {};
-      return {
-        setItem: jest.fn((key, value) => {
-          store[key] = value;
-          window.dispatchEvent(new StorageEvent('storage', { key, newValue: value }));
-        }),
-        removeItem: jest.fn(key => {
-          store[key] = undefined;
-          window.dispatchEvent(new Event('storage'));
-        }),
-      };
-    })();
-    Object.defineProperty(window, 'localStorage', { value: localStorageMock });
-  });
-
-  it('notifies other LocalStorageBroadcastChannel with same name', () => {
-    const tab1ClerkBCListener = jest.fn();
-    const tab1DifferentBCListener = jest.fn();
-    const tab2ClerkBCListener = jest.fn();
-
-    const tab1ClerkBC = new LocalStorageBroadcastChannel(bcName);
-    const tab1DifferentBC = new LocalStorageBroadcastChannel('somethingElse');
-    const tab2ClerkBC = new LocalStorageBroadcastChannel(bcName);
-
-    tab1ClerkBC.addEventListener('message', tab1ClerkBCListener);
-    tab1DifferentBC.addEventListener('message', tab1DifferentBCListener);
-    tab2ClerkBC.addEventListener('message', tab2ClerkBCListener);
-
-    const message = 'a message from tab1';
-    tab1ClerkBC.postMessage(message);
-    expect(tab1DifferentBCListener).not.toHaveBeenCalled();
-    expect(tab2ClerkBCListener).toHaveBeenCalled();
-  });
-});
diff --git a/packages/shared/utils/localStorageBroadcastChannel.ts b/packages/shared/utils/localStorageBroadcastChannel.ts
deleted file mode 100644
index 3c88c272417..00000000000
--- a/packages/shared/utils/localStorageBroadcastChannel.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-type Listener<T> = (e: MessageEvent<T>) => void;
-
-const KEY_PREFIX = '__lsbc__';
-
-export class LocalStorageBroadcastChannel<E> {
-  private readonly eventTarget = window;
-  private readonly channelKey: string;
-
-  constructor(name: string) {
-    this.channelKey = KEY_PREFIX + name;
-    this.setupLocalStorageListener();
-  }
-
-  public postMessage = (data: E): void => {
-    try {
-      localStorage.setItem(this.channelKey, JSON.stringify(data));
-      localStorage.removeItem(this.channelKey);
-    } catch (e) {
-      //
-    }
-  };
-
-  public addEventListener = (eventName: 'message', listener: Listener<E>): void => {
-    this.eventTarget.addEventListener(this.prefixEventName(eventName), e => {
-      listener(e as MessageEvent);
-    });
-  };
-
-  private setupLocalStorageListener = () => {
-    const notifyListeners = (e: StorageEvent) => {
-      if (e.key !== this.channelKey || !e.newValue) {
-        return;
-      }
-
-      try {
-        const data = JSON.parse(e.newValue || '');
-        const event = new MessageEvent(this.prefixEventName('message'), {
-          data,
-        });
-        this.eventTarget.dispatchEvent(event);
-      } catch (e) {
-        //
-      }
-    };
-
-    window.addEventListener('storage', notifyListeners);
-  };
-
-  private prefixEventName(eventName: string): string {
-    return this.channelKey + eventName;
-  }
-}
diff --git a/packages/shared/utils/mimeTypeExtensions.ts b/packages/shared/utils/mimeTypeExtensions.ts
deleted file mode 100644
index 3d206056ad6..00000000000
--- a/packages/shared/utils/mimeTypeExtensions.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-const MimeTypeToExtensionMap = Object.freeze({
-  'image/png': 'png',
-  'image/jpeg': 'jpg',
-  'image/gif': 'gif',
-  'image/webp': 'webp',
-  'image/x-icon': 'ico',
-  'image/vnd.microsoft.icon': 'ico',
-} as const);
-
-export type SupportedMimeType = keyof typeof MimeTypeToExtensionMap;
-
-export const extension = (mimeType: SupportedMimeType): string => {
-  return MimeTypeToExtensionMap[mimeType];
-};
diff --git a/packages/shared/utils/noop.ts b/packages/shared/utils/noop.ts
deleted file mode 100644
index e65a0290b94..00000000000
--- a/packages/shared/utils/noop.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-/* eslint-disable @typescript-eslint/no-unused-vars */
-/* eslint-disable @typescript-eslint/no-empty-function */
-export const noop = (..._args: any[]): void => {};
diff --git a/packages/shared/utils/object.test.ts b/packages/shared/utils/object.test.ts
deleted file mode 100644
index 01b42cd4569..00000000000
--- a/packages/shared/utils/object.test.ts
+++ /dev/null
@@ -1,145 +0,0 @@
-import { deepCamelToSnake, deepSnakeToCamel } from './object';
-
-describe('camelToSnakeKeys', () => {
-  it('creates a copy and does not modify the original', () => {
-    const original = {
-      an_arr: [{ hello_there: 'hey' }],
-      a_nested_object: { a_message: 'hey' },
-    };
-    const originalCopy = { ...original };
-    const res = deepSnakeToCamel(original);
-    expect(res).toStrictEqual({
-      anArr: [{ helloThere: 'hey' }],
-      aNestedObject: { aMessage: 'hey' },
-    });
-    expect(original).toStrictEqual(originalCopy);
-    expect(original === res).toBeFalsy();
-  });
-
-  it('transforms camelCased keys to snake_cased', () => {
-    expect(deepCamelToSnake({ key: 1, anotherKey: 2 })).toStrictEqual({
-      key: 1,
-      another_key: 2,
-    });
-
-    expect(
-      deepCamelToSnake({
-        key: 1,
-        anotherKey: 2,
-        nestAttribute: { nestedKey: 3 },
-      }),
-    ).toStrictEqual({
-      key: 1,
-      another_key: 2,
-      nest_attribute: {
-        nested_key: 3,
-      },
-    });
-  });
-
-  it('handles null and undefined values', () => {
-    expect(deepCamelToSnake({ key: 1, anotherKey: null })).toStrictEqual({
-      key: 1,
-      another_key: null,
-    });
-
-    expect(
-      deepCamelToSnake({
-        key: 1,
-        anotherKey: 2,
-        nestAttribute: { nestedKey: null },
-      }),
-    ).toStrictEqual({
-      key: 1,
-      another_key: 2,
-      nest_attribute: {
-        nested_key: null,
-      },
-    });
-  });
-
-  it('transforms and removes camelCased keys', () => {
-    const sampleObject = deepCamelToSnake({ key: 1, anotherKey: 2 });
-    expect(sampleObject).not.toHaveProperty('anotherKey');
-    expect(sampleObject).toHaveProperty('another_key');
-  });
-
-  it('deeply transforms objects and arrays to camelCase', () => {
-    const sample = {
-      sessions: [
-        {
-          last_active_at: 1647133602586,
-          user: {
-            primary_web3_wallet_id: null,
-            email_addresses: [
-              {
-                email_address: 'n@ck.dev',
-                verification: {
-                  status: 'verified',
-                  strategy: 'email_link',
-                  expire_at: 1645216476574,
-                },
-                linked_to: [{ type: 'oauth_google', id: 'idn_25QqWb' }],
-              },
-            ],
-            web3_wallets: [],
-            external_accounts: [
-              {
-                identification_id: 'idn_25QqWbzargsao',
-                provider_user_id: '106087',
-              },
-            ],
-          },
-        },
-      ],
-      sign_in_attempt: null,
-    };
-
-    const expected = {
-      sessions: [
-        {
-          user: {
-            primaryWeb3WalletId: null,
-            emailAddresses: [
-              {
-                verification: {
-                  status: 'verified',
-                  strategy: 'email_link',
-                  expireAt: 1645216476574,
-                },
-                emailAddress: 'n@ck.dev',
-                linkedTo: [
-                  {
-                    type: 'oauth_google',
-                    id: 'idn_25QqWb',
-                  },
-                ],
-              },
-            ],
-            web3Wallets: [],
-            externalAccounts: [
-              {
-                identificationId: 'idn_25QqWbzargsao',
-                providerUserId: '106087',
-              },
-            ],
-          },
-          lastActiveAt: 1647133602586,
-        },
-      ],
-      signInAttempt: null,
-    };
-    const res = deepSnakeToCamel(sample);
-    expect(res).toStrictEqual(expected);
-  });
-
-  it('prioritizes the camelCased property', () => {
-    const sampleObject = deepCamelToSnake({ oneKey: 1, one_key: 2 });
-    const anotherSampleObject = deepCamelToSnake({ one_key: 2, oneKey: 1 });
-
-    expect(sampleObject.one_key).toEqual(1);
-    expect(sampleObject).not.toHaveProperty('oneKey');
-    expect(anotherSampleObject.one_key).toEqual(1);
-    expect(anotherSampleObject).not.toHaveProperty('oneKey');
-  });
-});
diff --git a/packages/shared/utils/object.ts b/packages/shared/utils/object.ts
deleted file mode 100644
index d59b9b0c279..00000000000
--- a/packages/shared/utils/object.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { camelToSnake, snakeToCamel } from './string';
-
-const createDeepObjectTransformer = (transform: any) => {
-  const deepTransform = (obj: any): any => {
-    if (!obj) {
-      return obj;
-    }
-
-    if (Array.isArray(obj)) {
-      return obj.map(el => {
-        if (typeof el === 'object' || Array.isArray(el)) {
-          return deepTransform(el);
-        }
-        return el;
-      });
-    }
-
-    const copy = { ...obj };
-    const keys = Object.keys(copy) as string[];
-    for (const oldName of keys) {
-      const newName = transform(oldName.toString());
-      if (newName !== oldName) {
-        copy[newName] = copy[oldName];
-        delete copy[oldName];
-      }
-      if (typeof copy[newName] === 'object') {
-        copy[newName] = deepTransform(copy[newName]);
-      }
-    }
-    return copy;
-  };
-
-  return deepTransform;
-};
-
-/**
- * Transforms camelCased objects/ arrays to snake_cased.
- * This function recursively traverses all objects and arrays of the passed value
- * camelCased keys are removed.
- */
-export const deepCamelToSnake = createDeepObjectTransformer(camelToSnake);
-
-/**
- * Transforms snake_cased objects/ arrays to camelCased.
- * This function recursively traverses all objects and arrays of the passed value
- * camelCased keys are removed.
- */
-export const deepSnakeToCamel = createDeepObjectTransformer(snakeToCamel);
diff --git a/packages/shared/utils/poller.ts b/packages/shared/utils/poller.ts
deleted file mode 100644
index 8b24dcf1733..00000000000
--- a/packages/shared/utils/poller.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-export type PollerStop = () => void;
-export type PollerCallback = (stop: PollerStop) => Promise<unknown>;
-export type PollerRun = (cb: PollerCallback) => Promise<void>;
-
-type PollerOptions = {
-  delayInMs: number;
-};
-
-export type Poller = {
-  run: PollerRun;
-  stop: PollerStop;
-};
-
-export function Poller({ delayInMs }: PollerOptions = { delayInMs: 1000 }): Poller {
-  let timerId: number | undefined;
-  let stopped = false;
-
-  const stop: PollerStop = () => {
-    clearTimeout(timerId);
-    stopped = true;
-  };
-
-  const run: PollerRun = async cb => {
-    stopped = false;
-    await cb(stop);
-    if (stopped) {
-      return;
-    }
-    timerId = setTimeout(() => run(cb), delayInMs) as any as number;
-  };
-
-  return { run, stop };
-}
diff --git a/packages/shared/utils/ssr.ts b/packages/shared/utils/ssr.ts
deleted file mode 100644
index e0ede1979d2..00000000000
--- a/packages/shared/utils/ssr.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export const inClientSide = (): boolean => {
-  return typeof window !== 'undefined';
-};
diff --git a/packages/shared/utils/string.test.ts b/packages/shared/utils/string.test.ts
deleted file mode 100644
index db64e565c10..00000000000
--- a/packages/shared/utils/string.test.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { isIPV4Address, titleize } from './string';
-
-describe('isIPV4Address(str)', () => {
-  it('checks if as string is an IP V4', () => {
-    expect(isIPV4Address(null)).toBe(false);
-    expect(isIPV4Address(undefined)).toBe(false);
-    expect(isIPV4Address('')).toBe(false);
-    expect(isIPV4Address('127.0.0.1')).toBe(true);
-  });
-});
-
-describe('titleize(str)', () => {
-  it('titleizes the string', () => {
-    expect(titleize(null)).toBe('');
-    expect(titleize(undefined)).toBe('');
-    expect(titleize('')).toBe('');
-    expect(titleize('foo')).toBe('Foo');
-    expect(titleize('foo bar')).toBe('Foo bar');
-  });
-});
diff --git a/packages/shared/utils/string.ts b/packages/shared/utils/string.ts
deleted file mode 100644
index 08b8b0d9d86..00000000000
--- a/packages/shared/utils/string.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-const IP_V4_ADDRESS_REGEX =
-  /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
-
-export function isIPV4Address(str: string | undefined | null): boolean {
-  return IP_V4_ADDRESS_REGEX.test(str || '');
-}
-
-export function titleize(str: string | undefined | null): string {
-  const s = str || '';
-  return s.charAt(0).toUpperCase() + s.slice(1);
-}
-
-export function snakeToCamel(str: string): string {
-  return str.replace(/([-_][a-z])/g, match => match.toUpperCase().replace(/-|_/, ''));
-}
-
-export function camelToSnake(str: string): string {
-  return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);
-}
diff --git a/packages/shared/utils/svgTransform.js b/packages/shared/utils/svgTransform.js
deleted file mode 100644
index 472f3f896d4..00000000000
--- a/packages/shared/utils/svgTransform.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/* eslint-disable */
-const path = require('path');
-const babel = require('@babel/core');
-const reactPreset = require('@babel/preset-react');
-const presetEnv = require('@babel/preset-env');
-
-module.exports = {
-  process(_, filename) {
-    const code = babel.transform(
-      `
-        import React from 'react';
-        export default () => (<svg data-filename="${path.relative(process.cwd(), filename)}" />);
-      `,
-      {
-        filename,
-        presets: [presetEnv, reactPreset],
-        retainLines: true,
-      },
-    ).code;
-    return code;
-  },
-};
diff --git a/packages/shared/utils/testUtils.ts b/packages/shared/utils/testUtils.ts
deleted file mode 100644
index 7917101fc9c..00000000000
--- a/packages/shared/utils/testUtils.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import '@testing-library/jest-dom/extend-expect';
-
-import { render, RenderOptions } from '@testing-library/react';
-import React from 'react';
-import renderer from 'react-test-renderer';
-
-import { noop } from '../utils';
-
-// Wrap components with test providers
-const customRender = (ui: React.ReactElement, options?: RenderOptions) => {
-  return render(ui, options);
-};
-
-// To be used for structural snapshot testing
-const renderJSON = (c: React.ReactElement) => renderer.create(c).toJSON();
-
-// To be used for structural snapshot testing after the first rerender on mount
-const renderJSONAfterFirstAct = (c: React.ReactElement) => {
-  let root;
-
-  renderer.act(() => {
-    root = renderer.create(c);
-  });
-
-  // @ts-ignore
-  return root.toJSON();
-};
-
-// Re-export everything
-export * from '@testing-library/react';
-export { act as actHook, renderHook } from '@testing-library/react-hooks';
-export { default as userEvent } from '@testing-library/user-event';
-export { mocked } from 'jest-mock';
-
-// Override render method
-export { customRender as render, renderJSON, renderJSONAfterFirstAct, noop };
diff --git a/packages/shared/utils/url.test.ts b/packages/shared/utils/url.test.ts
deleted file mode 100644
index 8d06b7a94a7..00000000000
--- a/packages/shared/utils/url.test.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { parseSearchParams } from './url';
-
-describe('parseSearchParams(queryString)', () => {
-  it('parses query string and returns a URLSearchParams object', () => {
-    let searchParams = parseSearchParams('');
-    expect(searchParams.get('foo')).toBeNull();
-
-    searchParams = parseSearchParams('foo=42&bar=43');
-    expect(searchParams.get('foo')).toBe('42');
-    expect(searchParams.get('bar')).toBe('43');
-
-    searchParams = parseSearchParams('?foo=42&bar=43');
-    expect(searchParams.get('foo')).toBe('42');
-    expect(searchParams.get('bar')).toBe('43');
-  });
-});
diff --git a/packages/shared/utils/url.ts b/packages/shared/utils/url.ts
deleted file mode 100644
index bc33767cae0..00000000000
--- a/packages/shared/utils/url.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export function parseSearchParams(queryString = ''): URLSearchParams {
-  if (queryString.startsWith('?')) {
-    queryString = queryString.slice(1);
-  }
-  return new URLSearchParams(queryString);
-}
diff --git a/packages/common/vite.config.ts b/packages/shared/vite.config.ts
similarity index 100%
rename from packages/common/vite.config.ts
rename to packages/shared/vite.config.ts

From 342e0a55e4d070a68643f6f28e70016a551cf0ab Mon Sep 17 00:00:00 2001
From: Nikos Douvlis <nikosdouvlis@gmail.com>
Date: Sun, 9 Oct 2022 22:50:55 +0300
Subject: [PATCH 17/41] chore(repo): Introduce nextjs playground app

---
 .gitignore                               |    2 -
 playground/nextjs/.eslintrc.json         |    3 +
 playground/nextjs/.gitignore             |   36 +
 playground/nextjs/README.md              |   34 +
 playground/nextjs/next.config.js         |   17 +
 playground/nextjs/package-lock.json      | 5574 ++++++++++++++++++++++
 playground/nextjs/package.json           |   25 +
 playground/nextjs/pages/_app.tsx         |   21 +
 playground/nextjs/pages/api/hello.ts     |   10 +
 playground/nextjs/pages/index.tsx        |   86 +
 playground/nextjs/public/favicon.ico     |  Bin 0 -> 25931 bytes
 playground/nextjs/public/vercel.svg      |    4 +
 playground/nextjs/styles/Home.module.css |  129 +
 playground/nextjs/styles/globals.css     |   26 +
 playground/nextjs/tsconfig.json          |   20 +
 15 files changed, 5985 insertions(+), 2 deletions(-)
 create mode 100644 playground/nextjs/.eslintrc.json
 create mode 100644 playground/nextjs/.gitignore
 create mode 100644 playground/nextjs/README.md
 create mode 100644 playground/nextjs/next.config.js
 create mode 100644 playground/nextjs/package-lock.json
 create mode 100644 playground/nextjs/package.json
 create mode 100644 playground/nextjs/pages/_app.tsx
 create mode 100644 playground/nextjs/pages/api/hello.ts
 create mode 100644 playground/nextjs/pages/index.tsx
 create mode 100644 playground/nextjs/public/favicon.ico
 create mode 100644 playground/nextjs/public/vercel.svg
 create mode 100644 playground/nextjs/styles/Home.module.css
 create mode 100644 playground/nextjs/styles/globals.css
 create mode 100644 playground/nextjs/tsconfig.json

diff --git a/.gitignore b/.gitignore
index 56a856da391..e804d4e0df4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -50,5 +50,3 @@ Thumbs.db
 .turbo
 
 lerna-debug.log
-playground
-playground1
diff --git a/playground/nextjs/.eslintrc.json b/playground/nextjs/.eslintrc.json
new file mode 100644
index 00000000000..bffb357a712
--- /dev/null
+++ b/playground/nextjs/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+  "extends": "next/core-web-vitals"
+}
diff --git a/playground/nextjs/.gitignore b/playground/nextjs/.gitignore
new file mode 100644
index 00000000000..c87c9b392c0
--- /dev/null
+++ b/playground/nextjs/.gitignore
@@ -0,0 +1,36 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.pnpm-debug.log*
+
+# local env files
+.env*.local
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
diff --git a/playground/nextjs/README.md b/playground/nextjs/README.md
new file mode 100644
index 00000000000..c87e0421d22
--- /dev/null
+++ b/playground/nextjs/README.md
@@ -0,0 +1,34 @@
+This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
+
+## Getting Started
+
+First, run the development server:
+
+```bash
+npm run dev
+# or
+yarn dev
+```
+
+Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
+
+You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file.
+
+[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`.
+
+The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
+
+## Learn More
+
+To learn more about Next.js, take a look at the following resources:
+
+- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
+- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
+
+You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
+
+## Deploy on Vercel
+
+The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
+
+Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
diff --git a/playground/nextjs/next.config.js b/playground/nextjs/next.config.js
new file mode 100644
index 00000000000..aab0bc034af
--- /dev/null
+++ b/playground/nextjs/next.config.js
@@ -0,0 +1,17 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+  reactStrictMode: true,
+  swcMinify: true,
+  // Configure webpack NOT to ignore node_modules changes for HMR
+  webpack: config => {
+    config.snapshot = {
+      ...(config.snapshot ?? {}),
+      // Add all node_modules but @next module to managedPaths
+      // Allows for hot refresh of changes to @next module
+      managedPaths: [/^(.+?[\\/]node_modules[\\/])(?!@next)/],
+    };
+    return config;
+  },
+};
+
+module.exports = nextConfig;
diff --git a/playground/nextjs/package-lock.json b/playground/nextjs/package-lock.json
new file mode 100644
index 00000000000..e7b34441cee
--- /dev/null
+++ b/playground/nextjs/package-lock.json
@@ -0,0 +1,5574 @@
+{
+  "name": "@playground/nextjs",
+  "version": "0.1.0",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "@playground/nextjs",
+      "version": "0.1.0",
+      "dependencies": {
+        "@clerk/backend-core": "file:../../packages/backend-core/",
+        "@clerk/clerk-react": "file:../../packages/react/",
+        "@clerk/clerk-sdk-node": "file:../../packages/sdk-node/",
+        "@clerk/edge": "file:../../packages/edge/",
+        "@clerk/nextjs": "file:../../packages/nextjs/",
+        "@clerk/shared": "file:../../packages/common/",
+        "@clerk/types": "file:../../packages/types/",
+        "next": "12.3.1",
+        "react": "18.2.0",
+        "react-dom": "18.2.0"
+      },
+      "devDependencies": {
+        "@types/node": "18.8.3",
+        "@types/react": "18.0.21",
+        "@types/react-dom": "18.0.6",
+        "eslint": "8.24.0",
+        "eslint-config-next": "12.3.1",
+        "typescript": "4.8.4"
+      }
+    },
+    "../../packages/backend-core": {
+      "version": "2.8.1",
+      "license": "MIT",
+      "dependencies": {
+        "@clerk/types": "^3.10.1",
+        "@peculiar/webcrypto": "^1.4.0",
+        "@types/node": "^16.11.55",
+        "@types/node-fetch": "^2",
+        "node-fetch": "^2.6.0",
+        "query-string": "^7.0.1",
+        "snakecase-keys": "^5.4.4",
+        "tslib": "^2.3.1"
+      },
+      "devDependencies": {
+        "@types/jest": "^27.4.0",
+        "jest": "^27.4.7",
+        "nock": "^13.2.1",
+        "ts-jest": "^27.1.3",
+        "typescript": "*"
+      },
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "../../packages/common": {
+      "version": "0.0.1",
+      "license": "ISC",
+      "devDependencies": {
+        "tsup": "^6.2.3",
+        "typescript": "^4.6.4",
+        "vitest": "^0.23.4"
+      }
+    },
+    "../../packages/common/dist": {
+      "extraneous": true
+    },
+    "../../packages/edge": {
+      "version": "1.12.2",
+      "license": "MIT",
+      "dependencies": {
+        "@clerk/backend-core": "^2.8.1",
+        "@clerk/types": "^3.10.1",
+        "@peculiar/webcrypto": "^1.4.0",
+        "@types/node": "^16.11.55",
+        "next": "^12.2.0"
+      },
+      "devDependencies": {
+        "@types/jest": "^27.4.0",
+        "jest": "^27.4.7",
+        "ts-jest": "^27.1.3",
+        "typescript": "*"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "../../packages/nextjs": {
+      "name": "@clerk/nextjs",
+      "version": "4.5.2",
+      "license": "MIT",
+      "dependencies": {
+        "@clerk/clerk-react": "^4.2.6",
+        "@clerk/clerk-sdk-node": "^4.4.2",
+        "@clerk/edge": "^1.12.2",
+        "@clerk/types": "^3.10.1",
+        "tslib": "^2.3.1"
+      },
+      "devDependencies": {
+        "@types/jest": "^27.4.0",
+        "@types/node": "^16.11.55",
+        "@types/react": "^17.0.39",
+        "@types/react-dom": "^17.0.11",
+        "jest": "^27.4.7",
+        "next": "^12.2.3",
+        "react": "17.0.2",
+        "react-dom": "17.0.2",
+        "ts-jest": "^27.1.3",
+        "typescript": "*"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "next": ">=10"
+      }
+    },
+    "../../packages/react": {
+      "name": "@clerk/clerk-react",
+      "version": "4.2.6",
+      "license": "MIT",
+      "dependencies": {
+        "@clerk/types": "^3.10.1",
+        "swr": "^1.3.0",
+        "tslib": "^2.3.1"
+      },
+      "devDependencies": {
+        "@testing-library/dom": "^7.28.1",
+        "@testing-library/jest-dom": "^5.11.6",
+        "@testing-library/react": "^11.2.1",
+        "@testing-library/react-hooks": "^3.4.2",
+        "@testing-library/user-event": "^12.2.2",
+        "@types/jest": "^27.4.0",
+        "@types/node": "^16.11.55",
+        "@types/react": "^17.0.39",
+        "@types/react-dom": "^17.0.11",
+        "@types/react-test-renderer": "^17",
+        "@types/testing-library__jest-dom": "^5",
+        "@types/testing-library__react-hooks": "^3",
+        "jest": "^27.4.7",
+        "react": "17.0.2",
+        "react-dom": "17.0.2",
+        "ts-jest": "^27.1.3",
+        "typescript": "*"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "react": ">=16"
+      }
+    },
+    "../../packages/react/dist": {
+      "extraneous": true
+    },
+    "../../packages/sdk-node": {
+      "version": "4.4.2",
+      "license": "MIT",
+      "dependencies": {
+        "@clerk/backend-core": "^2.8.1",
+        "@clerk/types": "^3.10.1",
+        "@peculiar/webcrypto": "^1.4.0",
+        "@types/cookies": "^0.7.7",
+        "@types/express": "^4.17.11",
+        "@types/jsonwebtoken": "^8.5.6",
+        "@types/node-fetch": "^2",
+        "camelcase-keys": "^6.2.2",
+        "cookies": "^0.8.0",
+        "deepmerge": "^4.2.2",
+        "jsonwebtoken": "^8.5.1",
+        "jwks-rsa": "^2.0.4",
+        "node-fetch": "^2.6.0",
+        "snakecase-keys": "^3.2.1",
+        "tslib": "^2.3.1"
+      },
+      "devDependencies": {
+        "@types/jest": "^27.4.0",
+        "jest": "^27.4.7",
+        "nock": "^13.0.7",
+        "npm-run-all": "^4.1.5",
+        "prettier": "^2.5.0",
+        "ts-jest": "^27.1.3",
+        "typescript": "*"
+      },
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "../../packages/types": {
+      "version": "3.10.1",
+      "license": "MIT",
+      "dependencies": {
+        "csstype": "^3.1.0"
+      },
+      "devDependencies": {
+        "@types/jest": "^27.4.0",
+        "jest": "^27.4.7",
+        "ts-jest": "^27.1.3",
+        "typescript": "*"
+      },
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/@babel/runtime": {
+      "version": "7.19.0",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz",
+      "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==",
+      "dev": true,
+      "dependencies": {
+        "regenerator-runtime": "^0.13.4"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/runtime-corejs3": {
+      "version": "7.19.1",
+      "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.1.tgz",
+      "integrity": "sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g==",
+      "dev": true,
+      "dependencies": {
+        "core-js-pure": "^3.25.1",
+        "regenerator-runtime": "^0.13.4"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@clerk/backend-core": {
+      "resolved": "../../packages/backend-core",
+      "link": true
+    },
+    "node_modules/@clerk/clerk-react": {
+      "resolved": "../../packages/react",
+      "link": true
+    },
+    "node_modules/@clerk/clerk-sdk-node": {
+      "resolved": "../../packages/sdk-node",
+      "link": true
+    },
+    "node_modules/@clerk/edge": {
+      "resolved": "../../packages/edge",
+      "link": true
+    },
+    "node_modules/@clerk/nextjs": {
+      "resolved": "../../packages/nextjs",
+      "link": true
+    },
+    "node_modules/@clerk/shared": {
+      "resolved": "../../packages/common",
+      "link": true
+    },
+    "node_modules/@clerk/types": {
+      "resolved": "../../packages/types",
+      "link": true
+    },
+    "node_modules/@eslint/eslintrc": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz",
+      "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==",
+      "dev": true,
+      "dependencies": {
+        "ajv": "^6.12.4",
+        "debug": "^4.3.2",
+        "espree": "^9.4.0",
+        "globals": "^13.15.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"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/@humanwhocodes/config-array": {
+      "version": "0.10.7",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz",
+      "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==",
+      "dev": true,
+      "dependencies": {
+        "@humanwhocodes/object-schema": "^1.2.1",
+        "debug": "^4.1.1",
+        "minimatch": "^3.0.4"
+      },
+      "engines": {
+        "node": ">=10.10.0"
+      }
+    },
+    "node_modules/@humanwhocodes/gitignore-to-minimatch": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz",
+      "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==",
+      "dev": true,
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
+    "node_modules/@humanwhocodes/module-importer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+      "dev": true,
+      "engines": {
+        "node": ">=12.22"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
+    "node_modules/@humanwhocodes/object-schema": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+      "dev": true
+    },
+    "node_modules/@next/env": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/env/-/env-12.3.1.tgz",
+      "integrity": "sha512-9P9THmRFVKGKt9DYqeC2aKIxm8rlvkK38V1P1sRE7qyoPBIs8l9oo79QoSdPtOWfzkbDAVUqvbQGgTMsb8BtJg=="
+    },
+    "node_modules/@next/eslint-plugin-next": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-12.3.1.tgz",
+      "integrity": "sha512-sw+lTf6r6P0j+g/n9y4qdWWI2syPqZx+uc0+B/fRENqfR3KpSid6MIKqc9gNwGhJASazEQ5b3w8h4cAET213jw==",
+      "dev": true,
+      "dependencies": {
+        "glob": "7.1.7"
+      }
+    },
+    "node_modules/@next/swc-android-arm-eabi": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.3.1.tgz",
+      "integrity": "sha512-i+BvKA8tB//srVPPQxIQN5lvfROcfv4OB23/L1nXznP+N/TyKL8lql3l7oo2LNhnH66zWhfoemg3Q4VJZSruzQ==",
+      "cpu": [
+        "arm"
+      ],
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-android-arm64": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.3.1.tgz",
+      "integrity": "sha512-CmgU2ZNyBP0rkugOOqLnjl3+eRpXBzB/I2sjwcGZ7/Z6RcUJXK5Evz+N0ucOxqE4cZ3gkTeXtSzRrMK2mGYV8Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-darwin-arm64": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.3.1.tgz",
+      "integrity": "sha512-hT/EBGNcu0ITiuWDYU9ur57Oa4LybD5DOQp4f22T6zLfpoBMfBibPtR8XktXmOyFHrL/6FC2p9ojdLZhWhvBHg==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-darwin-x64": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.3.1.tgz",
+      "integrity": "sha512-9S6EVueCVCyGf2vuiLiGEHZCJcPAxglyckTZcEwLdJwozLqN0gtS0Eq0bQlGS3dH49Py/rQYpZ3KVWZ9BUf/WA==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-freebsd-x64": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.3.1.tgz",
+      "integrity": "sha512-qcuUQkaBZWqzM0F1N4AkAh88lLzzpfE6ImOcI1P6YeyJSsBmpBIV8o70zV+Wxpc26yV9vpzb+e5gCyxNjKJg5Q==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-arm-gnueabihf": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.3.1.tgz",
+      "integrity": "sha512-diL9MSYrEI5nY2wc/h/DBewEDUzr/DqBjIgHJ3RUNtETAOB3spMNHvJk2XKUDjnQuluLmFMloet9tpEqU2TT9w==",
+      "cpu": [
+        "arm"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-arm64-gnu": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.3.1.tgz",
+      "integrity": "sha512-o/xB2nztoaC7jnXU3Q36vGgOolJpsGG8ETNjxM1VAPxRwM7FyGCPHOMk1XavG88QZSQf+1r+POBW0tLxQOJ9DQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-arm64-musl": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.3.1.tgz",
+      "integrity": "sha512-2WEasRxJzgAmP43glFNhADpe8zB7kJofhEAVNbDJZANp+H4+wq+/cW1CdDi8DqjkShPEA6/ejJw+xnEyDID2jg==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-x64-gnu": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.3.1.tgz",
+      "integrity": "sha512-JWEaMyvNrXuM3dyy9Pp5cFPuSSvG82+yABqsWugjWlvfmnlnx9HOQZY23bFq3cNghy5V/t0iPb6cffzRWylgsA==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-x64-musl": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.3.1.tgz",
+      "integrity": "sha512-xoEWQQ71waWc4BZcOjmatuvPUXKTv6MbIFzpm4LFeCHsg2iwai0ILmNXf81rJR+L1Wb9ifEke2sQpZSPNz1Iyg==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-win32-arm64-msvc": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.3.1.tgz",
+      "integrity": "sha512-hswVFYQYIeGHE2JYaBVtvqmBQ1CppplQbZJS/JgrVI3x2CurNhEkmds/yqvDONfwfbttTtH4+q9Dzf/WVl3Opw==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-win32-ia32-msvc": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.3.1.tgz",
+      "integrity": "sha512-Kny5JBehkTbKPmqulr5i+iKntO5YMP+bVM8Hf8UAmjSMVo3wehyLVc9IZkNmcbxi+vwETnQvJaT5ynYBkJ9dWA==",
+      "cpu": [
+        "ia32"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-win32-x64-msvc": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.3.1.tgz",
+      "integrity": "sha512-W1ijvzzg+kPEX6LAc+50EYYSEo0FVu7dmTE+t+DM4iOLqgGHoW9uYSz9wCVdkXOEEMP9xhXfGpcSxsfDucyPkA==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dev": true,
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "dev": true,
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dev": true,
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@rushstack/eslint-patch": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz",
+      "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==",
+      "dev": true
+    },
+    "node_modules/@swc/helpers": {
+      "version": "0.4.11",
+      "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz",
+      "integrity": "sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==",
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@types/json5": {
+      "version": "0.0.29",
+      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+      "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+      "dev": true
+    },
+    "node_modules/@types/node": {
+      "version": "18.8.3",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.3.tgz",
+      "integrity": "sha512-0os9vz6BpGwxGe9LOhgP/ncvYN5Tx1fNcd2TM3rD/aCGBkysb+ZWpXEocG24h6ZzOi13+VB8HndAQFezsSOw1w==",
+      "dev": true
+    },
+    "node_modules/@types/prop-types": {
+      "version": "15.7.5",
+      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
+      "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
+      "dev": true
+    },
+    "node_modules/@types/react": {
+      "version": "18.0.21",
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz",
+      "integrity": "sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==",
+      "dev": true,
+      "dependencies": {
+        "@types/prop-types": "*",
+        "@types/scheduler": "*",
+        "csstype": "^3.0.2"
+      }
+    },
+    "node_modules/@types/react-dom": {
+      "version": "18.0.6",
+      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz",
+      "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==",
+      "dev": true,
+      "dependencies": {
+        "@types/react": "*"
+      }
+    },
+    "node_modules/@types/scheduler": {
+      "version": "0.16.2",
+      "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
+      "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==",
+      "dev": true
+    },
+    "node_modules/@typescript-eslint/parser": {
+      "version": "5.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.39.0.tgz",
+      "integrity": "sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/scope-manager": "5.39.0",
+        "@typescript-eslint/types": "5.39.0",
+        "@typescript-eslint/typescript-estree": "5.39.0",
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependencies": {
+        "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@typescript-eslint/scope-manager": {
+      "version": "5.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.39.0.tgz",
+      "integrity": "sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "5.39.0",
+        "@typescript-eslint/visitor-keys": "5.39.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/types": {
+      "version": "5.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.39.0.tgz",
+      "integrity": "sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw==",
+      "dev": true,
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/@typescript-eslint/typescript-estree": {
+      "version": "5.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.39.0.tgz",
+      "integrity": "sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "5.39.0",
+        "@typescript-eslint/visitor-keys": "5.39.0",
+        "debug": "^4.3.4",
+        "globby": "^11.1.0",
+        "is-glob": "^4.0.3",
+        "semver": "^7.3.7",
+        "tsutils": "^3.21.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@typescript-eslint/visitor-keys": {
+      "version": "5.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.39.0.tgz",
+      "integrity": "sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg==",
+      "dev": true,
+      "dependencies": {
+        "@typescript-eslint/types": "5.39.0",
+        "eslint-visitor-keys": "^3.3.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      }
+    },
+    "node_modules/acorn": {
+      "version": "8.8.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
+      "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
+      "dev": true,
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-jsx": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+      "dev": true,
+      "peerDependencies": {
+        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+      }
+    },
+    "node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dev": true,
+      "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"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/argparse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+      "dev": true
+    },
+    "node_modules/aria-query": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
+      "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
+      "dev": true,
+      "dependencies": {
+        "@babel/runtime": "^7.10.2",
+        "@babel/runtime-corejs3": "^7.10.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      }
+    },
+    "node_modules/array-includes": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz",
+      "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.19.5",
+        "get-intrinsic": "^1.1.1",
+        "is-string": "^1.0.7"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/array-union": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/array.prototype.flat": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz",
+      "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.19.2",
+        "es-shim-unscopables": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/array.prototype.flatmap": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz",
+      "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.19.2",
+        "es-shim-unscopables": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/ast-types-flow": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
+      "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==",
+      "dev": true
+    },
+    "node_modules/axe-core": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz",
+      "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/axobject-query": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
+      "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==",
+      "dev": true
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "dev": true,
+      "dependencies": {
+        "fill-range": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/call-bind": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+      "dev": true,
+      "dependencies": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001416",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001416.tgz",
+      "integrity": "sha512-06wzzdAkCPZO+Qm4e/eNghZBDfVNDsCgw33T27OwBH9unE9S478OYw//Q2L7Npf/zBzs7rjZOszIFQkwQKAEqA==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        }
+      ]
+    },
+    "node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+      "dev": true
+    },
+    "node_modules/core-js-pure": {
+      "version": "3.25.5",
+      "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.5.tgz",
+      "integrity": "sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg==",
+      "dev": true,
+      "hasInstallScript": true,
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/core-js"
+      }
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "dev": true,
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/csstype": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
+      "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==",
+      "dev": true
+    },
+    "node_modules/damerau-levenshtein": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+      "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+      "dev": true
+    },
+    "node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/deep-is": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+      "dev": true
+    },
+    "node_modules/define-properties": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
+      "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
+      "dev": true,
+      "dependencies": {
+        "has-property-descriptors": "^1.0.0",
+        "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/dir-glob": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+      "dev": true,
+      "dependencies": {
+        "path-type": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/doctrine": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+      "dev": true,
+      "dependencies": {
+        "esutils": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/emoji-regex": {
+      "version": "9.2.2",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+      "dev": true
+    },
+    "node_modules/es-abstract": {
+      "version": "1.20.4",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz",
+      "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "es-to-primitive": "^1.2.1",
+        "function-bind": "^1.1.1",
+        "function.prototype.name": "^1.1.5",
+        "get-intrinsic": "^1.1.3",
+        "get-symbol-description": "^1.0.0",
+        "has": "^1.0.3",
+        "has-property-descriptors": "^1.0.0",
+        "has-symbols": "^1.0.3",
+        "internal-slot": "^1.0.3",
+        "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-weakref": "^1.0.2",
+        "object-inspect": "^1.12.2",
+        "object-keys": "^1.1.1",
+        "object.assign": "^4.1.4",
+        "regexp.prototype.flags": "^1.4.3",
+        "safe-regex-test": "^1.0.0",
+        "string.prototype.trimend": "^1.0.5",
+        "string.prototype.trimstart": "^1.0.5",
+        "unbox-primitive": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/es-shim-unscopables": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
+      "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
+      "dev": true,
+      "dependencies": {
+        "has": "^1.0.3"
+      }
+    },
+    "node_modules/es-to-primitive": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+      "dev": true,
+      "dependencies": {
+        "is-callable": "^1.1.4",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint": {
+      "version": "8.24.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz",
+      "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==",
+      "dev": true,
+      "dependencies": {
+        "@eslint/eslintrc": "^1.3.2",
+        "@humanwhocodes/config-array": "^0.10.5",
+        "@humanwhocodes/gitignore-to-minimatch": "^1.0.2",
+        "@humanwhocodes/module-importer": "^1.0.1",
+        "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-utils": "^3.0.0",
+        "eslint-visitor-keys": "^3.3.0",
+        "espree": "^9.4.0",
+        "esquery": "^1.4.0",
+        "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.1",
+        "globals": "^13.15.0",
+        "globby": "^11.1.0",
+        "grapheme-splitter": "^1.0.4",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.0.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "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",
+        "regexpp": "^3.2.0",
+        "strip-ansi": "^6.0.1",
+        "strip-json-comments": "^3.1.0",
+        "text-table": "^0.2.0"
+      },
+      "bin": {
+        "eslint": "bin/eslint.js"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint-config-next": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-12.3.1.tgz",
+      "integrity": "sha512-EN/xwKPU6jz1G0Qi6Bd/BqMnHLyRAL0VsaQaWA7F3KkjAgZHi4f1uL1JKGWNxdQpHTW/sdGONBd0bzxUka/DJg==",
+      "dev": true,
+      "dependencies": {
+        "@next/eslint-plugin-next": "12.3.1",
+        "@rushstack/eslint-patch": "^1.1.3",
+        "@typescript-eslint/parser": "^5.21.0",
+        "eslint-import-resolver-node": "^0.3.6",
+        "eslint-import-resolver-typescript": "^2.7.1",
+        "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"
+      },
+      "peerDependencies": {
+        "eslint": "^7.23.0 || ^8.0.0",
+        "typescript": ">=3.3.1"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/eslint-import-resolver-node": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
+      "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
+      "dev": true,
+      "dependencies": {
+        "debug": "^3.2.7",
+        "resolve": "^1.20.0"
+      }
+    },
+    "node_modules/eslint-import-resolver-node/node_modules/debug": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+      "dev": true,
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/eslint-import-resolver-typescript": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz",
+      "integrity": "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==",
+      "dev": true,
+      "dependencies": {
+        "debug": "^4.3.4",
+        "glob": "^7.2.0",
+        "is-glob": "^4.0.3",
+        "resolve": "^1.22.0",
+        "tsconfig-paths": "^3.14.1"
+      },
+      "engines": {
+        "node": ">=4"
+      },
+      "peerDependencies": {
+        "eslint": "*",
+        "eslint-plugin-import": "*"
+      }
+    },
+    "node_modules/eslint-import-resolver-typescript/node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "dev": true,
+      "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"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/eslint-module-utils": {
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz",
+      "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==",
+      "dev": true,
+      "dependencies": {
+        "debug": "^3.2.7"
+      },
+      "engines": {
+        "node": ">=4"
+      },
+      "peerDependenciesMeta": {
+        "eslint": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/eslint-module-utils/node_modules/debug": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+      "dev": true,
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/eslint-plugin-import": {
+      "version": "2.26.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz",
+      "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==",
+      "dev": true,
+      "dependencies": {
+        "array-includes": "^3.1.4",
+        "array.prototype.flat": "^1.2.5",
+        "debug": "^2.6.9",
+        "doctrine": "^2.1.0",
+        "eslint-import-resolver-node": "^0.3.6",
+        "eslint-module-utils": "^2.7.3",
+        "has": "^1.0.3",
+        "is-core-module": "^2.8.1",
+        "is-glob": "^4.0.3",
+        "minimatch": "^3.1.2",
+        "object.values": "^1.1.5",
+        "resolve": "^1.22.0",
+        "tsconfig-paths": "^3.14.1"
+      },
+      "engines": {
+        "node": ">=4"
+      },
+      "peerDependencies": {
+        "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
+      }
+    },
+    "node_modules/eslint-plugin-import/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/eslint-plugin-import/node_modules/doctrine": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+      "dev": true,
+      "dependencies": {
+        "esutils": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/eslint-plugin-import/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "dev": true
+    },
+    "node_modules/eslint-plugin-jsx-a11y": {
+      "version": "6.6.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz",
+      "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==",
+      "dev": true,
+      "dependencies": {
+        "@babel/runtime": "^7.18.9",
+        "aria-query": "^4.2.2",
+        "array-includes": "^3.1.5",
+        "ast-types-flow": "^0.0.7",
+        "axe-core": "^4.4.3",
+        "axobject-query": "^2.2.0",
+        "damerau-levenshtein": "^1.0.8",
+        "emoji-regex": "^9.2.2",
+        "has": "^1.0.3",
+        "jsx-ast-utils": "^3.3.2",
+        "language-tags": "^1.0.5",
+        "minimatch": "^3.1.2",
+        "semver": "^6.3.0"
+      },
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependencies": {
+        "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+      }
+    },
+    "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/eslint-plugin-react": {
+      "version": "7.31.8",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz",
+      "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==",
+      "dev": true,
+      "dependencies": {
+        "array-includes": "^3.1.5",
+        "array.prototype.flatmap": "^1.3.0",
+        "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.5",
+        "object.fromentries": "^2.0.5",
+        "object.hasown": "^1.1.1",
+        "object.values": "^1.1.5",
+        "prop-types": "^15.8.1",
+        "resolve": "^2.0.0-next.3",
+        "semver": "^6.3.0",
+        "string.prototype.matchall": "^4.0.7"
+      },
+      "engines": {
+        "node": ">=4"
+      },
+      "peerDependencies": {
+        "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+      }
+    },
+    "node_modules/eslint-plugin-react-hooks": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
+      "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+      }
+    },
+    "node_modules/eslint-plugin-react/node_modules/doctrine": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+      "dev": true,
+      "dependencies": {
+        "esutils": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/eslint-plugin-react/node_modules/resolve": {
+      "version": "2.0.0-next.4",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
+      "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
+      "dev": true,
+      "dependencies": {
+        "is-core-module": "^2.9.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/eslint-plugin-react/node_modules/semver": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/eslint-scope": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+      "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+      "dev": true,
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      }
+    },
+    "node_modules/eslint-utils": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+      "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+      "dev": true,
+      "dependencies": {
+        "eslint-visitor-keys": "^2.0.0"
+      },
+      "engines": {
+        "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mysticatea"
+      },
+      "peerDependencies": {
+        "eslint": ">=5"
+      }
+    },
+    "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+      "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/eslint-visitor-keys": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+      "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+      "dev": true,
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      }
+    },
+    "node_modules/espree": {
+      "version": "9.4.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz",
+      "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==",
+      "dev": true,
+      "dependencies": {
+        "acorn": "^8.8.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^3.3.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/esquery": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+      "dev": true,
+      "dependencies": {
+        "estraverse": "^5.1.0"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dev": true,
+      "dependencies": {
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "dev": true,
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "dev": true
+    },
+    "node_modules/fast-glob": {
+      "version": "3.2.12",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+      "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+      "dev": true,
+      "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"
+      },
+      "engines": {
+        "node": ">=8.6.0"
+      }
+    },
+    "node_modules/fast-glob/node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true
+    },
+    "node_modules/fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+      "dev": true
+    },
+    "node_modules/fastq": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+      "dev": true,
+      "dependencies": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "node_modules/file-entry-cache": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+      "dev": true,
+      "dependencies": {
+        "flat-cache": "^3.0.4"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      }
+    },
+    "node_modules/fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "dev": true,
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/find-up": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+      "dev": true,
+      "dependencies": {
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/flat-cache": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+      "dev": true,
+      "dependencies": {
+        "flatted": "^3.1.0",
+        "rimraf": "^3.0.2"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      }
+    },
+    "node_modules/flatted": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+      "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+      "dev": true
+    },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+      "dev": true
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "node_modules/function.prototype.name": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
+      "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.19.0",
+        "functions-have-names": "^1.2.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/functions-have-names": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
+      "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+      "dev": true,
+      "dependencies": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-symbol-description": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+      "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "get-intrinsic": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/glob": {
+      "version": "7.1.7",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+      "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+      "dev": true,
+      "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"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+      "dev": true,
+      "dependencies": {
+        "is-glob": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/globals": {
+      "version": "13.17.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
+      "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
+      "dev": true,
+      "dependencies": {
+        "type-fest": "^0.20.2"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/globby": {
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+      "dev": true,
+      "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"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/grapheme-splitter": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+      "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+      "dev": true
+    },
+    "node_modules/has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "dependencies": {
+        "function-bind": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/has-bigints": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+      "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/has-property-descriptors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
+      "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+      "dev": true,
+      "dependencies": {
+        "get-intrinsic": "^1.1.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-tostringtag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+      "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+      "dev": true,
+      "dependencies": {
+        "has-symbols": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/ignore": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+      "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+      "dev": true,
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/import-fresh": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+      "dev": true,
+      "dependencies": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8.19"
+      }
+    },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "dev": true,
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "dev": true
+    },
+    "node_modules/internal-slot": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
+      "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
+      "dev": true,
+      "dependencies": {
+        "get-intrinsic": "^1.1.0",
+        "has": "^1.0.3",
+        "side-channel": "^1.0.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/is-bigint": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+      "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+      "dev": true,
+      "dependencies": {
+        "has-bigints": "^1.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-boolean-object": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+      "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-callable": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+      "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-core-module": {
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
+      "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
+      "dev": true,
+      "dependencies": {
+        "has": "^1.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-date-object": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+      "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+      "dev": true,
+      "dependencies": {
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-negative-zero": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+      "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/is-number-object": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+      "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+      "dev": true,
+      "dependencies": {
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-regex": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+      "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-shared-array-buffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+      "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-string": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+      "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+      "dev": true,
+      "dependencies": {
+        "has-tostringtag": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-symbol": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+      "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+      "dev": true,
+      "dependencies": {
+        "has-symbols": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-weakref": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+      "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+      "dev": true
+    },
+    "node_modules/js-sdsl": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz",
+      "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==",
+      "dev": true
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "node_modules/js-yaml": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+      "dev": true,
+      "dependencies": {
+        "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
+    },
+    "node_modules/json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+      "dev": true
+    },
+    "node_modules/json5": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+      "dev": true,
+      "dependencies": {
+        "minimist": "^1.2.0"
+      },
+      "bin": {
+        "json5": "lib/cli.js"
+      }
+    },
+    "node_modules/jsx-ast-utils": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz",
+      "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==",
+      "dev": true,
+      "dependencies": {
+        "array-includes": "^3.1.5",
+        "object.assign": "^4.1.3"
+      },
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/language-subtag-registry": {
+      "version": "0.3.22",
+      "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
+      "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==",
+      "dev": true
+    },
+    "node_modules/language-tags": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
+      "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==",
+      "dev": true,
+      "dependencies": {
+        "language-subtag-registry": "~0.3.2"
+      }
+    },
+    "node_modules/levn": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+      "dev": true,
+      "dependencies": {
+        "prelude-ls": "^1.2.1",
+        "type-check": "~0.4.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/locate-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+      "dev": true,
+      "dependencies": {
+        "p-locate": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "dev": true
+    },
+    "node_modules/loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "dependencies": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      },
+      "bin": {
+        "loose-envify": "cli.js"
+      }
+    },
+    "node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dev": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/micromatch": {
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+      "dev": true,
+      "dependencies": {
+        "braces": "^3.0.2",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+      "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
+      "dev": true
+    },
+    "node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.4",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+      "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+      "dev": true
+    },
+    "node_modules/next": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/next/-/next-12.3.1.tgz",
+      "integrity": "sha512-l7bvmSeIwX5lp07WtIiP9u2ytZMv7jIeB8iacR28PuUEFG5j0HGAPnMqyG5kbZNBG2H7tRsrQ4HCjuMOPnANZw==",
+      "dependencies": {
+        "@next/env": "12.3.1",
+        "@swc/helpers": "0.4.11",
+        "caniuse-lite": "^1.0.30001406",
+        "postcss": "8.4.14",
+        "styled-jsx": "5.0.7",
+        "use-sync-external-store": "1.2.0"
+      },
+      "bin": {
+        "next": "dist/bin/next"
+      },
+      "engines": {
+        "node": ">=12.22.0"
+      },
+      "optionalDependencies": {
+        "@next/swc-android-arm-eabi": "12.3.1",
+        "@next/swc-android-arm64": "12.3.1",
+        "@next/swc-darwin-arm64": "12.3.1",
+        "@next/swc-darwin-x64": "12.3.1",
+        "@next/swc-freebsd-x64": "12.3.1",
+        "@next/swc-linux-arm-gnueabihf": "12.3.1",
+        "@next/swc-linux-arm64-gnu": "12.3.1",
+        "@next/swc-linux-arm64-musl": "12.3.1",
+        "@next/swc-linux-x64-gnu": "12.3.1",
+        "@next/swc-linux-x64-musl": "12.3.1",
+        "@next/swc-win32-arm64-msvc": "12.3.1",
+        "@next/swc-win32-ia32-msvc": "12.3.1",
+        "@next/swc-win32-x64-msvc": "12.3.1"
+      },
+      "peerDependencies": {
+        "fibers": ">= 3.1.0",
+        "node-sass": "^6.0.0 || ^7.0.0",
+        "react": "^17.0.2 || ^18.0.0-0",
+        "react-dom": "^17.0.2 || ^18.0.0-0",
+        "sass": "^1.3.0"
+      },
+      "peerDependenciesMeta": {
+        "fibers": {
+          "optional": true
+        },
+        "node-sass": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-inspect": {
+      "version": "1.12.2",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
+      "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/object.assign": {
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
+      "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "has-symbols": "^1.0.3",
+        "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object.entries": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz",
+      "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.19.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/object.fromentries": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz",
+      "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.19.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object.hasown": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz",
+      "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==",
+      "dev": true,
+      "dependencies": {
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.19.5"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object.values": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
+      "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.19.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dev": true,
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/optionator": {
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+      "dev": true,
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/p-limit": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+      "dev": true,
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+      "dev": true,
+      "dependencies": {
+        "p-limit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "dependencies": {
+        "callsites": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true
+    },
+    "node_modules/path-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true,
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.4.14",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
+      "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        }
+      ],
+      "dependencies": {
+        "nanoid": "^3.3.4",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/prelude-ls": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/prop-types": {
+      "version": "15.8.1",
+      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+      "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+      "dev": true,
+      "dependencies": {
+        "loose-envify": "^1.4.0",
+        "object-assign": "^4.1.1",
+        "react-is": "^16.13.1"
+      }
+    },
+    "node_modules/punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/react": {
+      "version": "18.2.0",
+      "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
+      "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+      "dependencies": {
+        "loose-envify": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/react-dom": {
+      "version": "18.2.0",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
+      "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+      "dependencies": {
+        "loose-envify": "^1.1.0",
+        "scheduler": "^0.23.0"
+      },
+      "peerDependencies": {
+        "react": "^18.2.0"
+      }
+    },
+    "node_modules/react-is": {
+      "version": "16.13.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+      "dev": true
+    },
+    "node_modules/regenerator-runtime": {
+      "version": "0.13.9",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
+      "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
+      "dev": true
+    },
+    "node_modules/regexp.prototype.flags": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
+      "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "functions-have-names": "^1.2.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/regexpp": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mysticatea"
+      }
+    },
+    "node_modules/resolve": {
+      "version": "1.22.1",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+      "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+      "dev": true,
+      "dependencies": {
+        "is-core-module": "^2.9.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true,
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "dev": true,
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "node_modules/safe-regex-test": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
+      "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "get-intrinsic": "^1.1.3",
+        "is-regex": "^1.1.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/scheduler": {
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
+      "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+      "dependencies": {
+        "loose-envify": "^1.1.0"
+      }
+    },
+    "node_modules/semver": {
+      "version": "7.3.8",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dev": true,
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/side-channel": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.0",
+        "get-intrinsic": "^1.0.2",
+        "object-inspect": "^1.9.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/slash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/string.prototype.matchall": {
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz",
+      "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.19.1",
+        "get-intrinsic": "^1.1.1",
+        "has-symbols": "^1.0.3",
+        "internal-slot": "^1.0.3",
+        "regexp.prototype.flags": "^1.4.1",
+        "side-channel": "^1.0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/string.prototype.trimend": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz",
+      "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.19.5"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/string.prototype.trimstart": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz",
+      "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.19.5"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-bom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+      "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/strip-json-comments": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/styled-jsx": {
+      "version": "5.0.7",
+      "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.7.tgz",
+      "integrity": "sha512-b3sUzamS086YLRuvnaDigdAewz1/EFYlHpYBP5mZovKEdQQOIIYq8lApylub3HHZ6xFjV051kkGU7cudJmrXEA==",
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "peerDependencies": {
+        "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0"
+      },
+      "peerDependenciesMeta": {
+        "@babel/core": {
+          "optional": true
+        },
+        "babel-plugin-macros": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+      "dev": true
+    },
+    "node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "dev": true,
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/tsconfig-paths": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz",
+      "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==",
+      "dev": true,
+      "dependencies": {
+        "@types/json5": "^0.0.29",
+        "json5": "^1.0.1",
+        "minimist": "^1.2.6",
+        "strip-bom": "^3.0.0"
+      }
+    },
+    "node_modules/tslib": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+      "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+    },
+    "node_modules/tsutils": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+      "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+      "dev": true,
+      "dependencies": {
+        "tslib": "^1.8.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      },
+      "peerDependencies": {
+        "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+      }
+    },
+    "node_modules/tsutils/node_modules/tslib": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+      "dev": true
+    },
+    "node_modules/type-check": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+      "dev": true,
+      "dependencies": {
+        "prelude-ls": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/type-fest": {
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/typescript": {
+      "version": "4.8.4",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
+      "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
+      "dev": true,
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=4.2.0"
+      }
+    },
+    "node_modules/unbox-primitive": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+      "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "has-bigints": "^1.0.2",
+        "has-symbols": "^1.0.3",
+        "which-boxed-primitive": "^1.0.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dev": true,
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/use-sync-external-store": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+      "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      }
+    },
+    "node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dev": true,
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/which-boxed-primitive": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+      "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+      "dev": true,
+      "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"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/word-wrap": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+      "dev": true
+    },
+    "node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "dev": true
+    },
+    "node_modules/yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    }
+  },
+  "dependencies": {
+    "@babel/runtime": {
+      "version": "7.19.0",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz",
+      "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==",
+      "dev": true,
+      "requires": {
+        "regenerator-runtime": "^0.13.4"
+      }
+    },
+    "@babel/runtime-corejs3": {
+      "version": "7.19.1",
+      "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.1.tgz",
+      "integrity": "sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g==",
+      "dev": true,
+      "requires": {
+        "core-js-pure": "^3.25.1",
+        "regenerator-runtime": "^0.13.4"
+      }
+    },
+    "@clerk/backend-core": {
+      "version": "file:../../packages/backend-core",
+      "requires": {
+        "@clerk/types": "^3.10.1",
+        "@peculiar/webcrypto": "^1.4.0",
+        "@types/jest": "^27.4.0",
+        "@types/node": "^16.11.55",
+        "@types/node-fetch": "^2",
+        "jest": "^27.4.7",
+        "nock": "^13.2.1",
+        "node-fetch": "^2.6.0",
+        "query-string": "^7.0.1",
+        "snakecase-keys": "^5.4.4",
+        "ts-jest": "^27.1.3",
+        "tslib": "^2.3.1",
+        "typescript": "*"
+      }
+    },
+    "@clerk/clerk-react": {
+      "version": "file:../../packages/react",
+      "requires": {
+        "@clerk/types": "^3.10.1",
+        "@testing-library/dom": "^7.28.1",
+        "@testing-library/jest-dom": "^5.11.6",
+        "@testing-library/react": "^11.2.1",
+        "@testing-library/react-hooks": "^3.4.2",
+        "@testing-library/user-event": "^12.2.2",
+        "@types/jest": "^27.4.0",
+        "@types/node": "^16.11.55",
+        "@types/react": "^17.0.39",
+        "@types/react-dom": "^17.0.11",
+        "@types/react-test-renderer": "^17",
+        "@types/testing-library__jest-dom": "^5",
+        "@types/testing-library__react-hooks": "^3",
+        "jest": "^27.4.7",
+        "react": "17.0.2",
+        "react-dom": "17.0.2",
+        "swr": "^1.3.0",
+        "ts-jest": "^27.1.3",
+        "tslib": "^2.3.1",
+        "typescript": "*"
+      }
+    },
+    "@clerk/clerk-sdk-node": {
+      "version": "file:../../packages/sdk-node",
+      "requires": {
+        "@clerk/backend-core": "^2.8.1",
+        "@clerk/types": "^3.10.1",
+        "@peculiar/webcrypto": "^1.4.0",
+        "@types/cookies": "^0.7.7",
+        "@types/express": "^4.17.11",
+        "@types/jest": "^27.4.0",
+        "@types/jsonwebtoken": "^8.5.6",
+        "@types/node-fetch": "^2",
+        "camelcase-keys": "^6.2.2",
+        "cookies": "^0.8.0",
+        "deepmerge": "^4.2.2",
+        "jest": "^27.4.7",
+        "jsonwebtoken": "^8.5.1",
+        "jwks-rsa": "^2.0.4",
+        "nock": "^13.0.7",
+        "node-fetch": "^2.6.0",
+        "npm-run-all": "^4.1.5",
+        "prettier": "^2.5.0",
+        "snakecase-keys": "^3.2.1",
+        "ts-jest": "^27.1.3",
+        "tslib": "^2.3.1",
+        "typescript": "*"
+      }
+    },
+    "@clerk/edge": {
+      "version": "file:../../packages/edge",
+      "requires": {
+        "@clerk/backend-core": "^2.8.1",
+        "@clerk/types": "^3.10.1",
+        "@peculiar/webcrypto": "^1.4.0",
+        "@types/jest": "^27.4.0",
+        "@types/node": "^16.11.55",
+        "jest": "^27.4.7",
+        "next": "^12.2.0",
+        "ts-jest": "^27.1.3",
+        "typescript": "*"
+      }
+    },
+    "@clerk/nextjs": {
+      "version": "file:../../packages/nextjs",
+      "requires": {
+        "@clerk/clerk-react": "^4.2.6",
+        "@clerk/clerk-sdk-node": "^4.4.2",
+        "@clerk/edge": "^1.12.2",
+        "@clerk/types": "^3.10.1",
+        "@types/jest": "^27.4.0",
+        "@types/node": "^16.11.55",
+        "@types/react": "^17.0.39",
+        "@types/react-dom": "^17.0.11",
+        "jest": "^27.4.7",
+        "next": "^12.2.3",
+        "react": "17.0.2",
+        "react-dom": "17.0.2",
+        "ts-jest": "^27.1.3",
+        "tslib": "^2.3.1",
+        "typescript": "*"
+      }
+    },
+    "@clerk/shared": {
+      "version": "file:../../packages/common",
+      "requires": {
+        "tsup": "^6.2.3",
+        "typescript": "^4.6.4",
+        "vitest": "^0.23.4"
+      }
+    },
+    "@clerk/types": {
+      "version": "file:../../packages/types",
+      "requires": {
+        "@types/jest": "^27.4.0",
+        "csstype": "^3.1.0",
+        "jest": "^27.4.7",
+        "ts-jest": "^27.1.3",
+        "typescript": "*"
+      }
+    },
+    "@eslint/eslintrc": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz",
+      "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.12.4",
+        "debug": "^4.3.2",
+        "espree": "^9.4.0",
+        "globals": "^13.15.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"
+      }
+    },
+    "@humanwhocodes/config-array": {
+      "version": "0.10.7",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz",
+      "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==",
+      "dev": true,
+      "requires": {
+        "@humanwhocodes/object-schema": "^1.2.1",
+        "debug": "^4.1.1",
+        "minimatch": "^3.0.4"
+      }
+    },
+    "@humanwhocodes/gitignore-to-minimatch": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz",
+      "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==",
+      "dev": true
+    },
+    "@humanwhocodes/module-importer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+      "dev": true
+    },
+    "@humanwhocodes/object-schema": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+      "dev": true
+    },
+    "@next/env": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/env/-/env-12.3.1.tgz",
+      "integrity": "sha512-9P9THmRFVKGKt9DYqeC2aKIxm8rlvkK38V1P1sRE7qyoPBIs8l9oo79QoSdPtOWfzkbDAVUqvbQGgTMsb8BtJg=="
+    },
+    "@next/eslint-plugin-next": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-12.3.1.tgz",
+      "integrity": "sha512-sw+lTf6r6P0j+g/n9y4qdWWI2syPqZx+uc0+B/fRENqfR3KpSid6MIKqc9gNwGhJASazEQ5b3w8h4cAET213jw==",
+      "dev": true,
+      "requires": {
+        "glob": "7.1.7"
+      }
+    },
+    "@next/swc-android-arm-eabi": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.3.1.tgz",
+      "integrity": "sha512-i+BvKA8tB//srVPPQxIQN5lvfROcfv4OB23/L1nXznP+N/TyKL8lql3l7oo2LNhnH66zWhfoemg3Q4VJZSruzQ==",
+      "optional": true
+    },
+    "@next/swc-android-arm64": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.3.1.tgz",
+      "integrity": "sha512-CmgU2ZNyBP0rkugOOqLnjl3+eRpXBzB/I2sjwcGZ7/Z6RcUJXK5Evz+N0ucOxqE4cZ3gkTeXtSzRrMK2mGYV8Q==",
+      "optional": true
+    },
+    "@next/swc-darwin-arm64": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.3.1.tgz",
+      "integrity": "sha512-hT/EBGNcu0ITiuWDYU9ur57Oa4LybD5DOQp4f22T6zLfpoBMfBibPtR8XktXmOyFHrL/6FC2p9ojdLZhWhvBHg==",
+      "optional": true
+    },
+    "@next/swc-darwin-x64": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.3.1.tgz",
+      "integrity": "sha512-9S6EVueCVCyGf2vuiLiGEHZCJcPAxglyckTZcEwLdJwozLqN0gtS0Eq0bQlGS3dH49Py/rQYpZ3KVWZ9BUf/WA==",
+      "optional": true
+    },
+    "@next/swc-freebsd-x64": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-12.3.1.tgz",
+      "integrity": "sha512-qcuUQkaBZWqzM0F1N4AkAh88lLzzpfE6ImOcI1P6YeyJSsBmpBIV8o70zV+Wxpc26yV9vpzb+e5gCyxNjKJg5Q==",
+      "optional": true
+    },
+    "@next/swc-linux-arm-gnueabihf": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.3.1.tgz",
+      "integrity": "sha512-diL9MSYrEI5nY2wc/h/DBewEDUzr/DqBjIgHJ3RUNtETAOB3spMNHvJk2XKUDjnQuluLmFMloet9tpEqU2TT9w==",
+      "optional": true
+    },
+    "@next/swc-linux-arm64-gnu": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.3.1.tgz",
+      "integrity": "sha512-o/xB2nztoaC7jnXU3Q36vGgOolJpsGG8ETNjxM1VAPxRwM7FyGCPHOMk1XavG88QZSQf+1r+POBW0tLxQOJ9DQ==",
+      "optional": true
+    },
+    "@next/swc-linux-arm64-musl": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.3.1.tgz",
+      "integrity": "sha512-2WEasRxJzgAmP43glFNhADpe8zB7kJofhEAVNbDJZANp+H4+wq+/cW1CdDi8DqjkShPEA6/ejJw+xnEyDID2jg==",
+      "optional": true
+    },
+    "@next/swc-linux-x64-gnu": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.3.1.tgz",
+      "integrity": "sha512-JWEaMyvNrXuM3dyy9Pp5cFPuSSvG82+yABqsWugjWlvfmnlnx9HOQZY23bFq3cNghy5V/t0iPb6cffzRWylgsA==",
+      "optional": true
+    },
+    "@next/swc-linux-x64-musl": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.3.1.tgz",
+      "integrity": "sha512-xoEWQQ71waWc4BZcOjmatuvPUXKTv6MbIFzpm4LFeCHsg2iwai0ILmNXf81rJR+L1Wb9ifEke2sQpZSPNz1Iyg==",
+      "optional": true
+    },
+    "@next/swc-win32-arm64-msvc": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.3.1.tgz",
+      "integrity": "sha512-hswVFYQYIeGHE2JYaBVtvqmBQ1CppplQbZJS/JgrVI3x2CurNhEkmds/yqvDONfwfbttTtH4+q9Dzf/WVl3Opw==",
+      "optional": true
+    },
+    "@next/swc-win32-ia32-msvc": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.3.1.tgz",
+      "integrity": "sha512-Kny5JBehkTbKPmqulr5i+iKntO5YMP+bVM8Hf8UAmjSMVo3wehyLVc9IZkNmcbxi+vwETnQvJaT5ynYBkJ9dWA==",
+      "optional": true
+    },
+    "@next/swc-win32-x64-msvc": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.3.1.tgz",
+      "integrity": "sha512-W1ijvzzg+kPEX6LAc+50EYYSEo0FVu7dmTE+t+DM4iOLqgGHoW9uYSz9wCVdkXOEEMP9xhXfGpcSxsfDucyPkA==",
+      "optional": true
+    },
+    "@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "dev": true
+    },
+    "@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      }
+    },
+    "@rushstack/eslint-patch": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz",
+      "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==",
+      "dev": true
+    },
+    "@swc/helpers": {
+      "version": "0.4.11",
+      "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz",
+      "integrity": "sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==",
+      "requires": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "@types/json5": {
+      "version": "0.0.29",
+      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+      "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+      "dev": true
+    },
+    "@types/node": {
+      "version": "18.8.3",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.3.tgz",
+      "integrity": "sha512-0os9vz6BpGwxGe9LOhgP/ncvYN5Tx1fNcd2TM3rD/aCGBkysb+ZWpXEocG24h6ZzOi13+VB8HndAQFezsSOw1w==",
+      "dev": true
+    },
+    "@types/prop-types": {
+      "version": "15.7.5",
+      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
+      "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
+      "dev": true
+    },
+    "@types/react": {
+      "version": "18.0.21",
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz",
+      "integrity": "sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==",
+      "dev": true,
+      "requires": {
+        "@types/prop-types": "*",
+        "@types/scheduler": "*",
+        "csstype": "^3.0.2"
+      }
+    },
+    "@types/react-dom": {
+      "version": "18.0.6",
+      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz",
+      "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==",
+      "dev": true,
+      "requires": {
+        "@types/react": "*"
+      }
+    },
+    "@types/scheduler": {
+      "version": "0.16.2",
+      "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
+      "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==",
+      "dev": true
+    },
+    "@typescript-eslint/parser": {
+      "version": "5.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.39.0.tgz",
+      "integrity": "sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/scope-manager": "5.39.0",
+        "@typescript-eslint/types": "5.39.0",
+        "@typescript-eslint/typescript-estree": "5.39.0",
+        "debug": "^4.3.4"
+      }
+    },
+    "@typescript-eslint/scope-manager": {
+      "version": "5.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.39.0.tgz",
+      "integrity": "sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "5.39.0",
+        "@typescript-eslint/visitor-keys": "5.39.0"
+      }
+    },
+    "@typescript-eslint/types": {
+      "version": "5.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.39.0.tgz",
+      "integrity": "sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw==",
+      "dev": true
+    },
+    "@typescript-eslint/typescript-estree": {
+      "version": "5.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.39.0.tgz",
+      "integrity": "sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "5.39.0",
+        "@typescript-eslint/visitor-keys": "5.39.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": {
+      "version": "5.39.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.39.0.tgz",
+      "integrity": "sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg==",
+      "dev": true,
+      "requires": {
+        "@typescript-eslint/types": "5.39.0",
+        "eslint-visitor-keys": "^3.3.0"
+      }
+    },
+    "acorn": {
+      "version": "8.8.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
+      "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
+      "dev": true
+    },
+    "acorn-jsx": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+      "dev": true,
+      "requires": {}
+    },
+    "ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dev": true,
+      "requires": {
+        "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": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "dev": true
+    },
+    "ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "requires": {
+        "color-convert": "^2.0.1"
+      }
+    },
+    "argparse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+      "dev": true
+    },
+    "aria-query": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
+      "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.10.2",
+        "@babel/runtime-corejs3": "^7.10.2"
+      }
+    },
+    "array-includes": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz",
+      "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.19.5",
+        "get-intrinsic": "^1.1.1",
+        "is-string": "^1.0.7"
+      }
+    },
+    "array-union": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+      "dev": true
+    },
+    "array.prototype.flat": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz",
+      "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.19.2",
+        "es-shim-unscopables": "^1.0.0"
+      }
+    },
+    "array.prototype.flatmap": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz",
+      "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.19.2",
+        "es-shim-unscopables": "^1.0.0"
+      }
+    },
+    "ast-types-flow": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
+      "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==",
+      "dev": true
+    },
+    "axe-core": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz",
+      "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==",
+      "dev": true
+    },
+    "axobject-query": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
+      "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==",
+      "dev": true
+    },
+    "balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "dev": true,
+      "requires": {
+        "fill-range": "^7.0.1"
+      }
+    },
+    "call-bind": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.2"
+      }
+    },
+    "callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true
+    },
+    "caniuse-lite": {
+      "version": "1.0.30001416",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001416.tgz",
+      "integrity": "sha512-06wzzdAkCPZO+Qm4e/eNghZBDfVNDsCgw33T27OwBH9unE9S478OYw//Q2L7Npf/zBzs7rjZOszIFQkwQKAEqA=="
+    },
+    "chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      }
+    },
+    "color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "requires": {
+        "color-name": "~1.1.4"
+      }
+    },
+    "color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+      "dev": true
+    },
+    "core-js-pure": {
+      "version": "3.25.5",
+      "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.5.tgz",
+      "integrity": "sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg==",
+      "dev": true
+    },
+    "cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "dev": true,
+      "requires": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      }
+    },
+    "csstype": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
+      "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==",
+      "dev": true
+    },
+    "damerau-levenshtein": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+      "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+      "dev": true
+    },
+    "debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dev": true,
+      "requires": {
+        "ms": "2.1.2"
+      }
+    },
+    "deep-is": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+      "dev": true
+    },
+    "define-properties": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
+      "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
+      "dev": true,
+      "requires": {
+        "has-property-descriptors": "^1.0.0",
+        "object-keys": "^1.1.1"
+      }
+    },
+    "dir-glob": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+      "dev": true,
+      "requires": {
+        "path-type": "^4.0.0"
+      }
+    },
+    "doctrine": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+      "dev": true,
+      "requires": {
+        "esutils": "^2.0.2"
+      }
+    },
+    "emoji-regex": {
+      "version": "9.2.2",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+      "dev": true
+    },
+    "es-abstract": {
+      "version": "1.20.4",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz",
+      "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "es-to-primitive": "^1.2.1",
+        "function-bind": "^1.1.1",
+        "function.prototype.name": "^1.1.5",
+        "get-intrinsic": "^1.1.3",
+        "get-symbol-description": "^1.0.0",
+        "has": "^1.0.3",
+        "has-property-descriptors": "^1.0.0",
+        "has-symbols": "^1.0.3",
+        "internal-slot": "^1.0.3",
+        "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-weakref": "^1.0.2",
+        "object-inspect": "^1.12.2",
+        "object-keys": "^1.1.1",
+        "object.assign": "^4.1.4",
+        "regexp.prototype.flags": "^1.4.3",
+        "safe-regex-test": "^1.0.0",
+        "string.prototype.trimend": "^1.0.5",
+        "string.prototype.trimstart": "^1.0.5",
+        "unbox-primitive": "^1.0.2"
+      }
+    },
+    "es-shim-unscopables": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
+      "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+      "dev": true,
+      "requires": {
+        "is-callable": "^1.1.4",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.2"
+      }
+    },
+    "escape-string-regexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+      "dev": true
+    },
+    "eslint": {
+      "version": "8.24.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz",
+      "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==",
+      "dev": true,
+      "requires": {
+        "@eslint/eslintrc": "^1.3.2",
+        "@humanwhocodes/config-array": "^0.10.5",
+        "@humanwhocodes/gitignore-to-minimatch": "^1.0.2",
+        "@humanwhocodes/module-importer": "^1.0.1",
+        "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-utils": "^3.0.0",
+        "eslint-visitor-keys": "^3.3.0",
+        "espree": "^9.4.0",
+        "esquery": "^1.4.0",
+        "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.1",
+        "globals": "^13.15.0",
+        "globby": "^11.1.0",
+        "grapheme-splitter": "^1.0.4",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.0.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "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",
+        "regexpp": "^3.2.0",
+        "strip-ansi": "^6.0.1",
+        "strip-json-comments": "^3.1.0",
+        "text-table": "^0.2.0"
+      }
+    },
+    "eslint-config-next": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-12.3.1.tgz",
+      "integrity": "sha512-EN/xwKPU6jz1G0Qi6Bd/BqMnHLyRAL0VsaQaWA7F3KkjAgZHi4f1uL1JKGWNxdQpHTW/sdGONBd0bzxUka/DJg==",
+      "dev": true,
+      "requires": {
+        "@next/eslint-plugin-next": "12.3.1",
+        "@rushstack/eslint-patch": "^1.1.3",
+        "@typescript-eslint/parser": "^5.21.0",
+        "eslint-import-resolver-node": "^0.3.6",
+        "eslint-import-resolver-typescript": "^2.7.1",
+        "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": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
+      "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
+      "dev": true,
+      "requires": {
+        "debug": "^3.2.7",
+        "resolve": "^1.20.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.7",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        }
+      }
+    },
+    "eslint-import-resolver-typescript": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz",
+      "integrity": "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.3.4",
+        "glob": "^7.2.0",
+        "is-glob": "^4.0.3",
+        "resolve": "^1.22.0",
+        "tsconfig-paths": "^3.14.1"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+          "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+          "dev": true,
+          "requires": {
+            "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"
+          }
+        }
+      }
+    },
+    "eslint-module-utils": {
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz",
+      "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==",
+      "dev": true,
+      "requires": {
+        "debug": "^3.2.7"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.7",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        }
+      }
+    },
+    "eslint-plugin-import": {
+      "version": "2.26.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz",
+      "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==",
+      "dev": true,
+      "requires": {
+        "array-includes": "^3.1.4",
+        "array.prototype.flat": "^1.2.5",
+        "debug": "^2.6.9",
+        "doctrine": "^2.1.0",
+        "eslint-import-resolver-node": "^0.3.6",
+        "eslint-module-utils": "^2.7.3",
+        "has": "^1.0.3",
+        "is-core-module": "^2.8.1",
+        "is-glob": "^4.0.3",
+        "minimatch": "^3.1.2",
+        "object.values": "^1.1.5",
+        "resolve": "^1.22.0",
+        "tsconfig-paths": "^3.14.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "doctrine": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+          "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-plugin-jsx-a11y": {
+      "version": "6.6.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz",
+      "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.18.9",
+        "aria-query": "^4.2.2",
+        "array-includes": "^3.1.5",
+        "ast-types-flow": "^0.0.7",
+        "axe-core": "^4.4.3",
+        "axobject-query": "^2.2.0",
+        "damerau-levenshtein": "^1.0.8",
+        "emoji-regex": "^9.2.2",
+        "has": "^1.0.3",
+        "jsx-ast-utils": "^3.3.2",
+        "language-tags": "^1.0.5",
+        "minimatch": "^3.1.2",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-plugin-react": {
+      "version": "7.31.8",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz",
+      "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==",
+      "dev": true,
+      "requires": {
+        "array-includes": "^3.1.5",
+        "array.prototype.flatmap": "^1.3.0",
+        "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.5",
+        "object.fromentries": "^2.0.5",
+        "object.hasown": "^1.1.1",
+        "object.values": "^1.1.5",
+        "prop-types": "^15.8.1",
+        "resolve": "^2.0.0-next.3",
+        "semver": "^6.3.0",
+        "string.prototype.matchall": "^4.0.7"
+      },
+      "dependencies": {
+        "doctrine": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+          "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2"
+          }
+        },
+        "resolve": {
+          "version": "2.0.0-next.4",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
+          "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
+          "dev": true,
+          "requires": {
+            "is-core-module": "^2.9.0",
+            "path-parse": "^1.0.7",
+            "supports-preserve-symlinks-flag": "^1.0.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-plugin-react-hooks": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
+      "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
+      "dev": true,
+      "requires": {}
+    },
+    "eslint-scope": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+      "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+      "dev": true,
+      "requires": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^5.2.0"
+      }
+    },
+    "eslint-utils": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+      "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+      "dev": true,
+      "requires": {
+        "eslint-visitor-keys": "^2.0.0"
+      },
+      "dependencies": {
+        "eslint-visitor-keys": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+          "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-visitor-keys": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+      "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+      "dev": true
+    },
+    "espree": {
+      "version": "9.4.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz",
+      "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==",
+      "dev": true,
+      "requires": {
+        "acorn": "^8.8.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^3.3.0"
+      }
+    },
+    "esquery": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^5.1.0"
+      }
+    },
+    "esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^5.2.0"
+      }
+    },
+    "estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "dev": true
+    },
+    "esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true
+    },
+    "fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "dev": true
+    },
+    "fast-glob": {
+      "version": "3.2.12",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+      "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+      "dev": true,
+      "requires": {
+        "@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"
+      },
+      "dependencies": {
+        "glob-parent": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+          "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        }
+      }
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true
+    },
+    "fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+      "dev": true
+    },
+    "fastq": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+      "dev": true,
+      "requires": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "file-entry-cache": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+      "dev": true,
+      "requires": {
+        "flat-cache": "^3.0.4"
+      }
+    },
+    "fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "dev": true,
+      "requires": {
+        "to-regex-range": "^5.0.1"
+      }
+    },
+    "find-up": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+      "dev": true,
+      "requires": {
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
+      }
+    },
+    "flat-cache": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+      "dev": true,
+      "requires": {
+        "flatted": "^3.1.0",
+        "rimraf": "^3.0.2"
+      }
+    },
+    "flatted": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+      "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+      "dev": true
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+      "dev": true
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "function.prototype.name": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
+      "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.19.0",
+        "functions-have-names": "^1.2.2"
+      }
+    },
+    "functions-have-names": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+      "dev": true
+    },
+    "get-intrinsic": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
+      "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.3"
+      }
+    },
+    "get-symbol-description": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+      "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "get-intrinsic": "^1.1.1"
+      }
+    },
+    "glob": {
+      "version": "7.1.7",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+      "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+      "dev": true,
+      "requires": {
+        "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-parent": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+      "dev": true,
+      "requires": {
+        "is-glob": "^4.0.3"
+      }
+    },
+    "globals": {
+      "version": "13.17.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
+      "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
+      "dev": true,
+      "requires": {
+        "type-fest": "^0.20.2"
+      }
+    },
+    "globby": {
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+      "dev": true,
+      "requires": {
+        "array-union": "^2.1.0",
+        "dir-glob": "^3.0.1",
+        "fast-glob": "^3.2.9",
+        "ignore": "^5.2.0",
+        "merge2": "^1.4.1",
+        "slash": "^3.0.0"
+      }
+    },
+    "grapheme-splitter": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+      "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+      "dev": true
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-bigints": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+      "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+      "dev": true
+    },
+    "has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true
+    },
+    "has-property-descriptors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
+      "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+      "dev": true,
+      "requires": {
+        "get-intrinsic": "^1.1.1"
+      }
+    },
+    "has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+      "dev": true
+    },
+    "has-tostringtag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+      "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+      "dev": true,
+      "requires": {
+        "has-symbols": "^1.0.2"
+      }
+    },
+    "ignore": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+      "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+      "dev": true
+    },
+    "import-fresh": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+      "dev": true,
+      "requires": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      }
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+      "dev": true
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "dev": true,
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "dev": true
+    },
+    "internal-slot": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
+      "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
+      "dev": true,
+      "requires": {
+        "get-intrinsic": "^1.1.0",
+        "has": "^1.0.3",
+        "side-channel": "^1.0.4"
+      }
+    },
+    "is-bigint": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+      "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+      "dev": true,
+      "requires": {
+        "has-bigints": "^1.0.1"
+      }
+    },
+    "is-boolean-object": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+      "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-callable": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+      "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+      "dev": true
+    },
+    "is-core-module": {
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
+      "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
+    "is-date-object": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+      "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+      "dev": true,
+      "requires": {
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "dev": true
+    },
+    "is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-negative-zero": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+      "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+      "dev": true
+    },
+    "is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true
+    },
+    "is-number-object": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+      "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+      "dev": true,
+      "requires": {
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-regex": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+      "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-shared-array-buffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+      "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2"
+      }
+    },
+    "is-string": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+      "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+      "dev": true,
+      "requires": {
+        "has-tostringtag": "^1.0.0"
+      }
+    },
+    "is-symbol": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+      "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+      "dev": true,
+      "requires": {
+        "has-symbols": "^1.0.2"
+      }
+    },
+    "is-weakref": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+      "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2"
+      }
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+      "dev": true
+    },
+    "js-sdsl": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz",
+      "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==",
+      "dev": true
+    },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "js-yaml": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+      "dev": true,
+      "requires": {
+        "argparse": "^2.0.1"
+      }
+    },
+    "json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
+    },
+    "json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+      "dev": true
+    },
+    "json5": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+      "dev": true,
+      "requires": {
+        "minimist": "^1.2.0"
+      }
+    },
+    "jsx-ast-utils": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz",
+      "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==",
+      "dev": true,
+      "requires": {
+        "array-includes": "^3.1.5",
+        "object.assign": "^4.1.3"
+      }
+    },
+    "language-subtag-registry": {
+      "version": "0.3.22",
+      "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
+      "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==",
+      "dev": true
+    },
+    "language-tags": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
+      "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==",
+      "dev": true,
+      "requires": {
+        "language-subtag-registry": "~0.3.2"
+      }
+    },
+    "levn": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "^1.2.1",
+        "type-check": "~0.4.0"
+      }
+    },
+    "locate-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+      "dev": true,
+      "requires": {
+        "p-locate": "^5.0.0"
+      }
+    },
+    "lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "dev": true
+    },
+    "loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "requires": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      }
+    },
+    "lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dev": true,
+      "requires": {
+        "yallist": "^4.0.0"
+      }
+    },
+    "merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true
+    },
+    "micromatch": {
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+      "dev": true,
+      "requires": {
+        "braces": "^3.0.2",
+        "picomatch": "^2.3.1"
+      }
+    },
+    "minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "minimist": {
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+      "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
+      "dev": true
+    },
+    "ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
+    "nanoid": {
+      "version": "3.3.4",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+      "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
+    },
+    "natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+      "dev": true
+    },
+    "next": {
+      "version": "12.3.1",
+      "resolved": "https://registry.npmjs.org/next/-/next-12.3.1.tgz",
+      "integrity": "sha512-l7bvmSeIwX5lp07WtIiP9u2ytZMv7jIeB8iacR28PuUEFG5j0HGAPnMqyG5kbZNBG2H7tRsrQ4HCjuMOPnANZw==",
+      "requires": {
+        "@next/env": "12.3.1",
+        "@next/swc-android-arm-eabi": "12.3.1",
+        "@next/swc-android-arm64": "12.3.1",
+        "@next/swc-darwin-arm64": "12.3.1",
+        "@next/swc-darwin-x64": "12.3.1",
+        "@next/swc-freebsd-x64": "12.3.1",
+        "@next/swc-linux-arm-gnueabihf": "12.3.1",
+        "@next/swc-linux-arm64-gnu": "12.3.1",
+        "@next/swc-linux-arm64-musl": "12.3.1",
+        "@next/swc-linux-x64-gnu": "12.3.1",
+        "@next/swc-linux-x64-musl": "12.3.1",
+        "@next/swc-win32-arm64-msvc": "12.3.1",
+        "@next/swc-win32-ia32-msvc": "12.3.1",
+        "@next/swc-win32-x64-msvc": "12.3.1",
+        "@swc/helpers": "0.4.11",
+        "caniuse-lite": "^1.0.30001406",
+        "postcss": "8.4.14",
+        "styled-jsx": "5.0.7",
+        "use-sync-external-store": "1.2.0"
+      }
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+      "dev": true
+    },
+    "object-inspect": {
+      "version": "1.12.2",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
+      "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
+      "dev": true
+    },
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "dev": true
+    },
+    "object.assign": {
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
+      "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "has-symbols": "^1.0.3",
+        "object-keys": "^1.1.1"
+      }
+    },
+    "object.entries": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz",
+      "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.19.1"
+      }
+    },
+    "object.fromentries": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz",
+      "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.19.1"
+      }
+    },
+    "object.hasown": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz",
+      "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.19.5"
+      }
+    },
+    "object.values": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
+      "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.19.1"
+      }
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dev": true,
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "optionator": {
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+      "dev": true,
+      "requires": {
+        "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": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+      "dev": true,
+      "requires": {
+        "yocto-queue": "^0.1.0"
+      }
+    },
+    "p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+      "dev": true,
+      "requires": {
+        "p-limit": "^3.0.2"
+      }
+    },
+    "parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "requires": {
+        "callsites": "^3.0.0"
+      }
+    },
+    "path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "dev": true
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "dev": true
+    },
+    "path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true
+    },
+    "path-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+      "dev": true
+    },
+    "picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+    },
+    "picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true
+    },
+    "postcss": {
+      "version": "8.4.14",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
+      "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
+      "requires": {
+        "nanoid": "^3.3.4",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2"
+      }
+    },
+    "prelude-ls": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+      "dev": true
+    },
+    "prop-types": {
+      "version": "15.8.1",
+      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+      "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+      "dev": true,
+      "requires": {
+        "loose-envify": "^1.4.0",
+        "object-assign": "^4.1.1",
+        "react-is": "^16.13.1"
+      }
+    },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+      "dev": true
+    },
+    "queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "dev": true
+    },
+    "react": {
+      "version": "18.2.0",
+      "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
+      "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+      "requires": {
+        "loose-envify": "^1.1.0"
+      }
+    },
+    "react-dom": {
+      "version": "18.2.0",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
+      "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+      "requires": {
+        "loose-envify": "^1.1.0",
+        "scheduler": "^0.23.0"
+      }
+    },
+    "react-is": {
+      "version": "16.13.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+      "dev": true
+    },
+    "regenerator-runtime": {
+      "version": "0.13.9",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
+      "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
+      "dev": true
+    },
+    "regexp.prototype.flags": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
+      "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "functions-have-names": "^1.2.2"
+      }
+    },
+    "regexpp": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+      "dev": true
+    },
+    "resolve": {
+      "version": "1.22.1",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+      "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+      "dev": true,
+      "requires": {
+        "is-core-module": "^2.9.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      }
+    },
+    "resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+      "dev": true
+    },
+    "reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true
+    },
+    "rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
+    "run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "dev": true,
+      "requires": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "safe-regex-test": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
+      "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "get-intrinsic": "^1.1.3",
+        "is-regex": "^1.1.4"
+      }
+    },
+    "scheduler": {
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
+      "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+      "requires": {
+        "loose-envify": "^1.1.0"
+      }
+    },
+    "semver": {
+      "version": "7.3.8",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+      "dev": true,
+      "requires": {
+        "lru-cache": "^6.0.0"
+      }
+    },
+    "shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "^3.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true
+    },
+    "side-channel": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.0",
+        "get-intrinsic": "^1.0.2",
+        "object-inspect": "^1.9.0"
+      }
+    },
+    "slash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+      "dev": true
+    },
+    "source-map-js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
+    },
+    "string.prototype.matchall": {
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz",
+      "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.19.1",
+        "get-intrinsic": "^1.1.1",
+        "has-symbols": "^1.0.3",
+        "internal-slot": "^1.0.3",
+        "regexp.prototype.flags": "^1.4.1",
+        "side-channel": "^1.0.4"
+      }
+    },
+    "string.prototype.trimend": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz",
+      "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.19.5"
+      }
+    },
+    "string.prototype.trimstart": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz",
+      "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.4",
+        "es-abstract": "^1.19.5"
+      }
+    },
+    "strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "^5.0.1"
+      }
+    },
+    "strip-bom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+      "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+      "dev": true
+    },
+    "strip-json-comments": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+      "dev": true
+    },
+    "styled-jsx": {
+      "version": "5.0.7",
+      "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.7.tgz",
+      "integrity": "sha512-b3sUzamS086YLRuvnaDigdAewz1/EFYlHpYBP5mZovKEdQQOIIYq8lApylub3HHZ6xFjV051kkGU7cudJmrXEA==",
+      "requires": {}
+    },
+    "supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "requires": {
+        "has-flag": "^4.0.0"
+      }
+    },
+    "supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true
+    },
+    "text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+      "dev": true
+    },
+    "to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "dev": true,
+      "requires": {
+        "is-number": "^7.0.0"
+      }
+    },
+    "tsconfig-paths": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz",
+      "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==",
+      "dev": true,
+      "requires": {
+        "@types/json5": "^0.0.29",
+        "json5": "^1.0.1",
+        "minimist": "^1.2.6",
+        "strip-bom": "^3.0.0"
+      }
+    },
+    "tslib": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+      "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+    },
+    "tsutils": {
+      "version": "3.21.0",
+      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+      "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.8.1"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+          "dev": true
+        }
+      }
+    },
+    "type-check": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "^1.2.1"
+      }
+    },
+    "type-fest": {
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+      "dev": true
+    },
+    "typescript": {
+      "version": "4.8.4",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
+      "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
+      "dev": true
+    },
+    "unbox-primitive": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+      "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "has-bigints": "^1.0.2",
+        "has-symbols": "^1.0.3",
+        "which-boxed-primitive": "^1.0.2"
+      }
+    },
+    "uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dev": true,
+      "requires": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "use-sync-external-store": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+      "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+      "requires": {}
+    },
+    "which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dev": true,
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "which-boxed-primitive": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+      "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+      "dev": true,
+      "requires": {
+        "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"
+      }
+    },
+    "word-wrap": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+      "dev": true
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+      "dev": true
+    },
+    "yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "dev": true
+    },
+    "yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+      "dev": true
+    }
+  }
+}
diff --git a/playground/nextjs/package.json b/playground/nextjs/package.json
new file mode 100644
index 00000000000..4f5e06508c1
--- /dev/null
+++ b/playground/nextjs/package.json
@@ -0,0 +1,25 @@
+{
+  "name": "@playground/nextjs",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "dev": "rm -rf .next && next dev",
+    "build": "next build",
+    "start": "next start",
+    "lint": "next lint"
+  },
+  "dependencies": {
+    "@clerk/nextjs": "file:../../packages/nextjs/",
+    "next": "12.3.1",
+    "react": "18.2.0",
+    "react-dom": "18.2.0"
+  },
+  "devDependencies": {
+    "@types/node": "18.8.3",
+    "@types/react": "18.0.21",
+    "@types/react-dom": "18.0.6",
+    "eslint": "8.24.0",
+    "eslint-config-next": "12.3.1",
+    "typescript": "4.8.4"
+  }
+}
diff --git a/playground/nextjs/pages/_app.tsx b/playground/nextjs/pages/_app.tsx
new file mode 100644
index 00000000000..21e4fb80b59
--- /dev/null
+++ b/playground/nextjs/pages/_app.tsx
@@ -0,0 +1,21 @@
+import '../styles/globals.css';
+import type { AppProps } from 'next/app';
+
+import { ClerkProvider, SignedOut, SignIn } from '@clerk/nextjs';
+
+function MyApp({ Component, pageProps }: AppProps) {
+  return (
+    <ClerkProvider
+      frontendApi={'clerk.touching.camel-78.dev.lclclerk.com'}
+      clerkJSUrl={'https://js.lclclerk.com/npm/clerk.browser.js'}
+      {...pageProps}
+    >
+      <SignedOut>
+        <SignIn />
+      </SignedOut>
+      <Component {...pageProps} />
+    </ClerkProvider>
+  );
+}
+
+export default MyApp;
diff --git a/playground/nextjs/pages/api/hello.ts b/playground/nextjs/pages/api/hello.ts
new file mode 100644
index 00000000000..eb4cc6657b3
--- /dev/null
+++ b/playground/nextjs/pages/api/hello.ts
@@ -0,0 +1,10 @@
+// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
+import type { NextApiRequest, NextApiResponse } from 'next';
+
+type Data = {
+  name: string;
+};
+
+export default function handler(req: NextApiRequest, res: NextApiResponse<Data>) {
+  res.status(200).json({ name: 'John Doe' });
+}
diff --git a/playground/nextjs/pages/index.tsx b/playground/nextjs/pages/index.tsx
new file mode 100644
index 00000000000..9613544210c
--- /dev/null
+++ b/playground/nextjs/pages/index.tsx
@@ -0,0 +1,86 @@
+import type { NextPage } from 'next';
+import Head from 'next/head';
+import Image from 'next/image';
+import styles from '../styles/Home.module.css';
+
+const Home: NextPage = () => {
+  return (
+    <div className={styles.container}>
+      <Head>
+        <title>Create Next App</title>
+        <meta
+          name='description'
+          content='Generated by create next app'
+        />
+        <link
+          rel='icon'
+          href='/favicon.ico'
+        />
+      </Head>
+
+      <main className={styles.main}>
+        <h1 className={styles.title}>
+          Welcome to <a href='https://nextjs.org'>Next.js!</a>
+        </h1>
+
+        <p className={styles.description}>
+          Get started by editing <code className={styles.code}>pages/index.tsx</code>
+        </p>
+
+        <div className={styles.grid}>
+          <a
+            href='https://nextjs.org/docs'
+            className={styles.card}
+          >
+            <h2>Documentation &rarr;</h2>
+            <p>Find in-depth information about Next.js features and API.</p>
+          </a>
+
+          <a
+            href='https://nextjs.org/learn'
+            className={styles.card}
+          >
+            <h2>Learn &rarr;</h2>
+            <p>Learn about Next.js in an interactive course with quizzes!</p>
+          </a>
+
+          <a
+            href='https://github.com/vercel/next.js/tree/canary/examples'
+            className={styles.card}
+          >
+            <h2>Examples &rarr;</h2>
+            <p>Discover and deploy boilerplate example Next.js projects.</p>
+          </a>
+
+          <a
+            href='https://vercel.com/new?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app'
+            className={styles.card}
+          >
+            <h2>Deploy &rarr;</h2>
+            <p>Instantly deploy your Next.js site to a public URL with Vercel.</p>
+          </a>
+        </div>
+      </main>
+
+      <footer className={styles.footer}>
+        <a
+          href='https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app'
+          target='_blank'
+          rel='noopener noreferrer'
+        >
+          Powered by{' '}
+          <span className={styles.logo}>
+            <Image
+              src='/vercel.svg'
+              alt='Vercel Logo'
+              width={72}
+              height={16}
+            />
+          </span>
+        </a>
+      </footer>
+    </div>
+  );
+};
+
+export default Home;
diff --git a/playground/nextjs/public/favicon.ico b/playground/nextjs/public/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c
GIT binary patch
literal 25931
zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83
zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO<?sK2}EE5RAKnxHU7lft+
zNRAPL3?T?25I&drAjl1ssi=G|D?(7bFsgtO(2o>{pgX9699l+Qppw7jXaYf~-84xW
z)w4x8?=youko|}Vr~(D$UX<xm7|19n6Hxvd5m6xx<*9a4%RmR{en}E&p$X-wy5A}T
zU0^dwXVA>IbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0
zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v
zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%<G)
zWdETe=&R39RaKR)udn|#TOgZ!e!yM=<=+`Uz{l^5UtkZ2fHDQ;UwMB}v%l$A-`~F-
z{Qr^x^CSUf63Sry{6y#+`<sMA?dPFvg)$lC_RkFRKnCi7&P<a6>hJ){&rlvg`CDTj
z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF
z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8(
z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8)
zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M<!8cv(gkb9@A>>36U4Us
zfgYWSiHZL3;lpWT=<n~R&zm>zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu
z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m
z{DeR7?0-1^zVs&`AV6<!ZvGbtU{7FdY&`9DeD(=q|M30$GCs(E?S0J1$e@G0#Z=wz
zl)*a>Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B<UyBc9U%rn&@xFZ-e{%i>@xiyCANc(l
zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<<x-(q{Yn-pG
zKTz?fwGmh&&2-F3f57**)?Xk#p#S9h^DhK{VVKE&0KR^-_MMD9nf@pDACnmVll!kp
z3?Tha?LWW70P;AL{}cP~sW|?W|MbA09{7Kt2f!i(y>fvZQ2zUz5WRc(UnFMKHwe1|
zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?<jWWPHxu*D53Uq)j1!ZtH3Vi&#Nd^rV
zj`B>MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv
z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL
z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU*
zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr
zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq
z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5
z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F
zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0
zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj
z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4
z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7<Kk?_r;;``Uc^3+u}-v3@Q8<@$Nr`<F?K
z-%F>?r!zQTPPSv}{so2e>Fjs1{<qUF=hGRSFDG$<z3x<+@%{Vd%a`e+qodRP&D<om
zAEn>gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{
zdVUDbHm5`2taPUOY^MAGOw*<R_VaVlPH<<CgYr!E->>=s7=Gst=D+p+2yON!0%Hk`
zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6
zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~
z9{AG(e|q3g5B%wYKRxiL2Y$8(4w<boVrLOyLG9R$m+7N>6bzchKuloQW#e&S3n+P-
z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu
zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD=
z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P<HJ;%@cvfCkvm6xcMjdY
zed_u6xK)F%|1Hy`)`e~K(f*MqTJ?92I+4lga{A5`-U@Cab35G6unNk<*dpB|Rtkp;
z?32o^yBlJsuA-^abQ~7;%<oa^k<DbKc{lOW2!yM#nEALvv)IhY7b|Wfg(UhtiurTM
zY-B6L26$JQo&Kt3nh3JTJ)garEgw^{uEM3__%b$U5{~+aMO*k)6R#grkER2`U6KS-
z=j1=QhCkuy%iiHWrqH8CeGNw*C?epTpl2Bo@ugUPKRFeiVHOpL7PHu-SAgX@qmTGH
z_%ePz1`io8XDfwLmip;Rn;1yo+3>3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM
z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2
z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3
zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@<gIi}tCXee1<sGV$i
z4r_`X#mEQbiDh!Efji0GjM9z-0bF}p0(*s(OzMJ|;K&OJBar<ARLp}T>a|r-@d#f7
z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw
z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5
zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1<ZO0#U-k07ifx!>
zrO6RSXHH}D<I*>Mc$&|?D004<Y&c6)m74d`LOLU@ruR+Um4>DiOVMHV8kXCP@7NKB
zgaZq^^O<7PoKEp72kby@W0Z!Y*A<g|TlOeriuPP`vK2IntATvs?Iv|J14j&;NFSFo
zyJ+sca?G+8C%!b{Sq=6cJJqS>y{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a
zuDZDT<?u;)RfLQwg>N}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI
z9X4Ul<x{xc_m~`mWBP0<g-{#wm}Vv~Ef3pKWC&N_<~88zSbEk;;+{DnJ9-u&Zc74s
zJ6TCQyl_^|5cY;wmDdrU@LTL-3v0H#Ui?8ICQV{imof1MHuM$`e*ux>IWA|ZYHgbI
z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y
z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M
zEMyT<MDk{HKbd#ckg5-pS_?QUVhZv?&Q-ioBS}$nvBd)nE7YO0deN~G(#zCJAbY$E
z!)g3Ytl=_NDUV%pykcE+Q<{EoZ_4FR@&#d<hqs%N>DrC&9K$d|kZe2#ws6)L=7K+{
zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW
zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8>
z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5E<MCr+anDo)-{XRlCJ;D#M(
zT=3WgR02;Nm!54biUb^FtzPh8iGrf412epnki-k+G4mdkzC|lJqaRMbb0~Jjp-{}I
z5Do5afZi>ajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G
z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP
ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O&
zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7gi<U
zTpbX&UCeYeNu>LVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c
z<cK@1=jX>?J<BS8bpdt^R+}%A_DEhF^%o}8e!!lc`Y!qU>;U~&FfH#*98^G?i}pA{
z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk
zUiY$thvX;>Tby6z9Y1e<Q<iIG*|o$r?OTFp`s)@_nHs4LeWbGvg7^}NK)>dAMQaiH
zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO
zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V
zG#-?gKlr}Eeqifb{|So?HM&g91<J5P5=Ly{?(NNY{6`O~L5r@sJe3rNZn06%SLk);
z9?hvE^Hr{!*G$<_doyzGn#*z*#}?)8dH=eYTgvc)T~}Jw!kCv68<+KL5{5?EXtDAZ
zWeNqp8%KIuBi&icn5s815Vho<+99VW1~m@L8l0=$c`t-L{q))~<!p*~vCdUcBcPz`
zyUi}!-k_`G{>P8|av8hQoCmQXkd?7wIJw<dY^{|7OQJUHKB~nksN_|Xy;DL?xjxU^
zbMa`WdfTBnr<wTd$mY&SgJ4U|X``k`#`gN@M+0x2W{YgC3kbLk<uYFJWglkx_)2#b
ztRiuA!EK9o)f`I2k)l;Of%E`ff91WlZh8yfRi6#N-mC`Ma(yr~U82SyAhc9B+ur!f
zP-3igg*KeYs9mGOAw@OaXYy9DnGjn0<m`JH&Q^h}^!h+uS9Ct*o-oEy(?iT6Yco>b
z_^v8bbg`<ZOL)a;i=IdfK0Zvw4nXsoC?eTOMpY)_ptiORm%J(1CD3dE0Z%Vy<2iHp
zcp>SAn{I*4bH$u(RZ6*x<DqKJ+5;a6Jq~=Y8V&c?Vsyq88!2nD?H?Eww58Mqt$7R8
z5BMjmKx>UhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k
zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq3<?y%xNvu0N78_R?~<RDFQx0ynlRG(E|j
zvEGN3bF<E_9p-I!UwQXFqcSGV#e^98tgFqLp+z9eP}y!jNA{)r*a+%M-_20xg?94<
zzmM{}syi0cd&P)zywMdS&Y_9k5JDtOM!L)b^2WP!+fHYGv>6!pV6Az&m{O8$wGFD?
zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH(
zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce
zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x
z);_{lY<;);XzT`dBFpRmGrr}z5u1=p<K1~3>C^<jVp}L(pzgMB_Vs-O?{Z?y$8M;)
zi@7zwpzV9#m72%En~(9@E)GWV^(~J*@^*K*TE0mynAnGJ5YSLCEnC42H-`tr4L=oW
zI}N{xQ$HT8Q6CVHf%RY&xw7!Zj(0xmg(K#UQ4u!ej95z7V4phlcTJ2&AR}$)zV-s!
zO7bqY6(=?1t+JCOW_z%HRE>S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA
zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T
z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a(
z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb
zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I
z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F=
zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk(<gsVPionpJ-imI56$j4P0!br@ny3=!{x2TY^
zCD=)8_PgmN)E!^nczcDGc9Wm7oo5O3@fh=k=kh8J?_3KqEp7JHdv8z_iZ5#KmbiPt
z2Bt8Ro^p$7pS!xL3mtj<iN3f}#r6_&$Es0PnJTE?c;0#$%cGdu`T%~`gW;c^VD-S=
zrAatMf^%Lzr*wQ4kHSOb?WOUuEsJQ3xr{Imf1t{~iNmRwb_SP9!?FFN=b-E){!8P2
ztWCT~262O8`%?3<W4Wg+ovWY<re)?^kZ|Yi>$?Qw({erA$^bC;q33hv!d!>%wRhj#
zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I
zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j
zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc
zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU<o
zeu8G~Z>^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?-
zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvh<G@KZw
z+<GL!lpeahq2+nO{>CL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg
zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu
z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ
zy|Qn`hxx(58c<SELWpDAg~83oY-J_WoDiI6d7>70$E;L(X0uZZ72M1!6oeg)(cdKO
ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC>
z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl
z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*<wp?Ryt$UFh41$qd}LyNJ7Oao(Aw2g|wy
zH_nZ+R#~EUME^#j4$@^5&>_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM
zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111a<qXXnUI&{l`dM&{4Gw)jZn;
zlj{VxW@#OcVE1Y%J*u^Z@H+XSqL6SwA|^jv2RU_+d;O!mk)dw7-m9B4{6*G1zRdR6
zQ}6v&Xt7R2h3Xp}EQk4nF2TULG{Ri=D|JC<a+K7dldN1}CY_f!vK#u}K3`g#TpO&W
z;!;64`0$d9raD!VbYP`kuFUasaMh!;&81y}LHS(SuGRxwEn4LZb4DS1j9iAq$MXd@
z(Ebka7_Gc(ljGaJqtI-OzmA@c@sYB$)Vg!RP4~``vaVyRq$rJXRjIPwtepN;(B%wy
zmU>H}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD
z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+
z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{
z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc
zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk
z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^
zb&uBN!Ja3UzYHK-CTyA5=L<c0d<h!DNBIa<xax8W3(Ru8L0cVXQ18|Y^|*S%)R96z
zBT$(=zQ}2vmt6LzN~Oyf_Y92%P@QOx{7~}5!UIqCdfu?VwC0Nb!2@iiit8-5zUWFG
z*G&+GLIU#J;}hvowNJWnglvb^<2q~lS#?ixVtYT@(O3{TC|4kFJYLB*jni-4YZi0>
zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U
zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M
zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*I<Cd*bZlOJ9YmRUK2<qXkpRR3nr6r~%Jz
z*(8tA&DYO)etdgVmoonqD{*<5Fog4ClIs-~_uhjuZOI}#Wy+ce${%#oyHloXelqfz
z8)?D3Y_>cmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$
z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D
zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G;
zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8
zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU<MM~gB&J0gc}IH}?|B4WRK
zWPL0FhctFGdMucOFdhrVunIe5)4K^H9IjB#eA)p5w?c#v7kp8jx^~bxxJB{;hPFL9
zkR9Dbpj+T5ZMgHQg|oj*DS;x&jK}1rn&}Shp9sgOI*7puQD-w?3H*cg72;5H(_zW*
zApJBIM-p2~F;qWDj!n|Kd=5|T8OPkQ_G;ujgvKybr5@~eci2{8WAz+%NUSp-&eoG!
zOGLNLJewWl&1*NT467W3god~fYgX?!f0?NCFnjD$qE-fyQ)|Q_DLc*{olmXSVl$g_
z$vj}o?RatMy(o*j8?q1Mgw{OUOgVR6_qvS<Co*&!cR`ROi|*I`ajyG5s@L8agnX2J
zF=DLkMG`z{RP&996y0yAtvJcb<cba?TV#j4VYFPC>&68iRikRrHRW|ZxzRR^`eIGt
zIeiDgVS>IeExKVRWW8-=<xUfo0v~z=RA=cFWKXgcMECd}xHp7iqkBanH}TZ0h0rA=
zqxUZ>A=<k-RjTtwbJkkep{8z*173wY^e%-U0{Ue!n@wbg^2q)Vx5c(_RfvuR4}XXn
z+JE>yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b
zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O
zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_
zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v<oS3Xw7
zu51m`3~hoyxErcHymdFTZd#AO59{EkuFTcpAR33(3xc{zRnn1~1Ei(i*^HdCvM~;;
za&}Uip|u>#ix45EVrcEhr>!NMhprl<CqZuKa#zuI&@zymVzIicetS0bq#u?m(r_@S
zJ79bl%4EyHCQ3fK@en+A1@)e}HWLP|gr_zuoA{}Z<(-*53Zu@k+=^%~5F(z$EFLI;
z-TQTS8$W|GRbZq93Ha1?lu+`O;rn>$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B
zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~<Ao%ZuW})CJ)6^(aRV(gGxR
z89#(FDW;GZEAf;rI$+PU)rEV|rASrwP0_mr^Ldv)IuUf1M>&^=4?PL&nd8)`OfG#n
zwAMN$1&>K++c{^|7<<q5KGu)u(OEfEJJw2aEi(;x-i=Y=j3ram9H2n-Fuqv0dVlXJ
z&WgG5X({!vJFDrEbm+CWDca^zIe2@s1@a;;Y3!U9Q)&P0UXFmCP51_!wvTfAIyR^M
z7^R*O@yz1b-s4VC>4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB
zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb
zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C<kr{U&JG{9FhoZ<aTve_lLz39>
zI@}sc<h3gsW}hp-`WUywKA>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+<Td{{5RWR}u2f(q<b(D$9JsF0OOzJ*+z0P5kc1t}CXlYgua%x*2lSgp|*WS3H-#
zdYr7?GQOL18zUS<2|;+vi4|4sQBM2Gs&WVS!D`q5Lz;XR@5rEfa{uG-!q?R8Ncz%(
z5K6~LQ@d2wp#)5q4u<ENlFbS)U4o1t9{-d>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<VfJZemI(PFAD{6Sm|uE%BTbkl
zROsg*MOh20YgGs3H7?@pmQ>`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<xTd?60J5qsr1Cg7F~~U2N!(@lC<>=hu4#Aw173YxIVbISaoc
z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(<ov
z$YXcI9;^grAyiJ4dWTv3b}K~Ww09(;mLY4+kj|$A?IMr}`7q?mIS1>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/playground/nextjs/public/vercel.svg b/playground/nextjs/public/vercel.svg
new file mode 100644
index 00000000000..fbf0e25a651
--- /dev/null
+++ b/playground/nextjs/public/vercel.svg
@@ -0,0 +1,4 @@
+<svg width="283" height="64" viewBox="0 0 283 64" fill="none" 
+    xmlns="http://www.w3.org/2000/svg">
+    <path d="M141.04 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.46 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM248.72 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.45 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM200.24 34c0 6 3.92 10 10 10 4.12 0 7.21-1.87 8.8-4.92l7.68 4.43c-3.18 5.3-9.14 8.49-16.48 8.49-11.05 0-19-7.2-19-18s7.96-18 19-18c7.34 0 13.29 3.19 16.48 8.49l-7.68 4.43c-1.59-3.05-4.68-4.92-8.8-4.92-6.07 0-10 4-10 10zm82.48-29v46h-9V5h9zM36.95 0L73.9 64H0L36.95 0zm92.38 5l-27.71 48L73.91 5H84.3l17.32 30 17.32-30h10.39zm58.91 12v9.69c-1-.29-2.06-.49-3.2-.49-5.81 0-10 4-10 10V51h-9V17h9v9.2c0-5.08 5.91-9.2 13.2-9.2z" fill="#000"/>
+</svg>
\ No newline at end of file
diff --git a/playground/nextjs/styles/Home.module.css b/playground/nextjs/styles/Home.module.css
new file mode 100644
index 00000000000..83c0edbe20b
--- /dev/null
+++ b/playground/nextjs/styles/Home.module.css
@@ -0,0 +1,129 @@
+.container {
+  padding: 0 2rem;
+}
+
+.main {
+  min-height: 100vh;
+  padding: 4rem 0;
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+}
+
+.footer {
+  display: flex;
+  flex: 1;
+  padding: 2rem 0;
+  border-top: 1px solid #eaeaea;
+  justify-content: center;
+  align-items: center;
+}
+
+.footer a {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-grow: 1;
+}
+
+.title a {
+  color: #0070f3;
+  text-decoration: none;
+}
+
+.title a:hover,
+.title a:focus,
+.title a:active {
+  text-decoration: underline;
+}
+
+.title {
+  margin: 0;
+  line-height: 1.15;
+  font-size: 4rem;
+}
+
+.title,
+.description {
+  text-align: center;
+}
+
+.description {
+  margin: 4rem 0;
+  line-height: 1.5;
+  font-size: 1.5rem;
+}
+
+.code {
+  background: #fafafa;
+  border-radius: 5px;
+  padding: 0.75rem;
+  font-size: 1.1rem;
+  font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New,
+    monospace;
+}
+
+.grid {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-wrap: wrap;
+  max-width: 800px;
+}
+
+.card {
+  margin: 1rem;
+  padding: 1.5rem;
+  text-align: left;
+  color: inherit;
+  text-decoration: none;
+  border: 1px solid #eaeaea;
+  border-radius: 10px;
+  transition: color 0.15s ease, border-color 0.15s ease;
+  max-width: 300px;
+}
+
+.card:hover,
+.card:focus,
+.card:active {
+  color: #0070f3;
+  border-color: #0070f3;
+}
+
+.card h2 {
+  margin: 0 0 1rem 0;
+  font-size: 1.5rem;
+}
+
+.card p {
+  margin: 0;
+  font-size: 1.25rem;
+  line-height: 1.5;
+}
+
+.logo {
+  height: 1em;
+  margin-left: 0.5rem;
+}
+
+@media (max-width: 600px) {
+  .grid {
+    width: 100%;
+    flex-direction: column;
+  }
+}
+
+@media (prefers-color-scheme: dark) {
+  .card,
+  .footer {
+    border-color: #222;
+  }
+  .code {
+    background: #111;
+  }
+  .logo img {
+    filter: invert(1);
+  }
+}
diff --git a/playground/nextjs/styles/globals.css b/playground/nextjs/styles/globals.css
new file mode 100644
index 00000000000..aa3b7f2a5b3
--- /dev/null
+++ b/playground/nextjs/styles/globals.css
@@ -0,0 +1,26 @@
+html,
+body {
+  padding: 0;
+  margin: 0;
+  font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans,
+    Helvetica Neue, sans-serif;
+}
+
+a {
+  color: inherit;
+  text-decoration: none;
+}
+
+* {
+  box-sizing: border-box;
+}
+
+@media (prefers-color-scheme: dark) {
+  html {
+    color-scheme: dark;
+  }
+  body {
+    color: white;
+    background: black;
+  }
+}
diff --git a/playground/nextjs/tsconfig.json b/playground/nextjs/tsconfig.json
new file mode 100644
index 00000000000..99710e85787
--- /dev/null
+++ b/playground/nextjs/tsconfig.json
@@ -0,0 +1,20 @@
+{
+  "compilerOptions": {
+    "target": "es5",
+    "lib": ["dom", "dom.iterable", "esnext"],
+    "allowJs": true,
+    "skipLibCheck": true,
+    "strict": true,
+    "forceConsistentCasingInFileNames": true,
+    "noEmit": true,
+    "esModuleInterop": true,
+    "module": "esnext",
+    "moduleResolution": "node",
+    "resolveJsonModule": true,
+    "isolatedModules": true,
+    "jsx": "preserve",
+    "incremental": true
+  },
+  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
+  "exclude": ["node_modules"]
+}

From 49c97e2165eb54a430c22a74e86649e298205644 Mon Sep 17 00:00:00 2001
From: John Raptis <johnsitpar@gmail.com>
Date: Mon, 10 Oct 2022 14:18:13 +0300
Subject: [PATCH 18/41] fix(clerk-js): Remove redundant code

---
 packages/clerk-js/src/ui/UserProfile/RootPage.tsx | 15 +--------------
 1 file changed, 1 insertion(+), 14 deletions(-)

diff --git a/packages/clerk-js/src/ui/UserProfile/RootPage.tsx b/packages/clerk-js/src/ui/UserProfile/RootPage.tsx
index 4593f4d8025..71a1823f5d0 100644
--- a/packages/clerk-js/src/ui/UserProfile/RootPage.tsx
+++ b/packages/clerk-js/src/ui/UserProfile/RootPage.tsx
@@ -2,7 +2,7 @@ import React from 'react';
 
 import { useEnvironment } from '../contexts';
 import { Col, descriptors, localizationKeys } from '../customizables';
-import { Header, Tab, TabPanel, TabPanels, Tabs, TabsList } from '../elements';
+import { Header } from '../elements';
 import { ActiveDevicesSection } from './ActiveDevicesSection';
 import { ConnectedAccountsSection } from './ConnectedAccountsSection';
 import { EmailsSection } from './EmailSection';
@@ -45,19 +45,6 @@ export const RootPage = () => {
         </Header.Root>
         <UserProfileSection />
 
-        <Tabs>
-          <TabsList>
-            <Tab>Active</Tab>
-            <Tab>Invited</Tab>
-            <Tab>Danger</Tab>
-          </TabsList>
-          <TabPanels>
-            <TabPanel>section 1</TabPanel>
-            <TabPanel>section 2</TabPanel>
-            <TabPanel>section 3</TabPanel>
-          </TabPanels>
-        </Tabs>
-
         {showUsername && <UsernameSection />}
         {showEmail && <EmailsSection />}
         {showPhone && <PhoneSection />}

From 1e34e6986ee49aeb9ca9f72cdc5d799d6611b53f Mon Sep 17 00:00:00 2001
From: Nikos Douvlis <nikosdouvlis@gmail.com>
Date: Tue, 4 Oct 2022 11:11:11 +0300
Subject: [PATCH 19/41] feat(clerk-js,clerk-react,types): Wire up
 `OrganizationSwitcher` and `OrganizationProfile`

---
 packages/clerk-js/src/core/clerk.ts           | 49 +++++++++-
 packages/clerk-js/src/ui/Components.tsx       | 41 ++++++++-
 .../src/ui/customizables/parseAppearance.ts   |  2 +-
 .../elements/contexts/FlowMetadataContext.tsx |  2 +-
 packages/clerk-js/src/ui/types.ts             | 19 +++-
 .../react/src/components/uiComponents.tsx     | 31 ++++++-
 packages/react/src/isomorphicClerk.ts         | 52 +++++++++++
 packages/types/src/appearance.ts              | 10 +++
 packages/types/src/clerk.ts                   | 90 ++++++++++++++++++-
 9 files changed, 287 insertions(+), 9 deletions(-)

diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts
index 2f419f0cab7..40d6f820abe 100644
--- a/packages/clerk-js/src/core/clerk.ts
+++ b/packages/clerk-js/src/core/clerk.ts
@@ -14,13 +14,17 @@ import type {
   ListenerCallback,
   OrganizationInvitationResource,
   OrganizationMembershipResource,
+  OrganizationProfileProps,
   OrganizationResource,
+  OrganizationSwitcherProps,
   RedirectOptions,
   Resources,
+  SetActiveParams,
   SignInProps,
   SignInResource,
   SignOut,
   SignOutCallback,
+  SignOutOptions,
   SignUpProps,
   SignUpResource,
   UnsubscribeCallback,
@@ -28,7 +32,6 @@ import type {
   UserProfileProps,
   UserResource,
 } from '@clerk/types';
-import { SetActiveParams, SignOutOptions } from '@clerk/types/src';
 
 import packageJSON from '../../package.json';
 import type { ComponentControls, MountComponentRenderer } from '../ui';
@@ -205,6 +208,16 @@ export default class Clerk implements ClerkInterface {
     this.#componentControls?.closeModal('userProfile');
   };
 
+  public openOrganizationProfile = (props?: OrganizationProfileProps): void => {
+    this.assertComponentsReady(this.#componentControls);
+    this.#componentControls?.openModal('organizationProfile', props || {});
+  };
+
+  public closeOrganizationProfile = (): void => {
+    this.assertComponentsReady(this.#componentControls);
+    this.#componentControls?.closeModal('organizationProfile');
+  };
+
   public mountSignIn = (node: HTMLDivElement, props?: SignInProps): void => {
     this.assertComponentsReady(this.#componentControls);
     this.#componentControls.mountComponent({
@@ -256,6 +269,40 @@ export default class Clerk implements ClerkInterface {
     });
   };
 
+  public mountOrganizationProfile = (node: HTMLDivElement, props?: OrganizationProfileProps): void => {
+    this.assertComponentsReady(this.#componentControls);
+    this.#componentControls.mountComponent({
+      name: 'OrganizationProfile',
+      appearanceKey: 'userProfile',
+      node,
+      props,
+    });
+  };
+
+  public unmountOrganizationProfile = (node: HTMLDivElement): void => {
+    this.assertComponentsReady(this.#componentControls);
+    this.#componentControls.unmountComponent({
+      node,
+    });
+  };
+
+  public mountOrganizationSwitcher = (node: HTMLDivElement, props?: OrganizationSwitcherProps): void => {
+    this.assertComponentsReady(this.#componentControls);
+    this.#componentControls.mountComponent({
+      name: 'OrganizationSwitcher',
+      appearanceKey: 'userProfile',
+      node,
+      props,
+    });
+  };
+
+  public unmountOrganizationSwitcher = (node: HTMLDivElement): void => {
+    this.assertComponentsReady(this.#componentControls);
+    this.#componentControls.unmountComponent({
+      node,
+    });
+  };
+
   public mountUserButton = (node: HTMLDivElement, props?: UserButtonProps): void => {
     this.assertComponentsReady(this.#componentControls);
     this.#componentControls.mountComponent({
diff --git a/packages/clerk-js/src/ui/Components.tsx b/packages/clerk-js/src/ui/Components.tsx
index 66ad14bcbb1..7c488a0b868 100644
--- a/packages/clerk-js/src/ui/Components.tsx
+++ b/packages/clerk-js/src/ui/Components.tsx
@@ -1,4 +1,5 @@
 import type { Appearance, Clerk, ClerkOptions, EnvironmentResource, SignInProps, SignUpProps } from '@clerk/types';
+import { OrganizationProfileProps } from '@clerk/types';
 import { UserProfileProps } from '@clerk/types/src';
 import React from 'react';
 import ReactDOM from 'react-dom';
@@ -43,11 +44,11 @@ export type ComponentControls = {
     node?: HTMLDivElement;
     props?: unknown;
   }) => void;
-  openModal: <T extends 'signIn' | 'signUp' | 'userProfile'>(
+  openModal: <T extends 'signIn' | 'signUp' | 'userProfile' | 'organizationProfile'>(
     modal: T,
     props: T extends 'signIn' ? SignInProps : T extends 'signUp' ? SignUpProps : UserProfileProps,
   ) => void;
-  closeModal: (modal: 'signIn' | 'signUp' | 'userProfile') => void;
+  closeModal: (modal: 'signIn' | 'signUp' | 'userProfile' | 'organizationProfile') => void;
 };
 
 const AvailableComponents = {
@@ -55,6 +56,8 @@ const AvailableComponents = {
   SignUp,
   UserButton,
   UserProfile,
+  OrganizationProfile: () => <div>hello from org profile</div>,
+  OrganizationSwitcher: () => <div>hello from org switcher</div>,
 };
 
 type AvailableComponentNames = keyof typeof AvailableComponents;
@@ -78,6 +81,7 @@ interface ComponentsState {
   signInModal: null | SignInProps;
   signUpModal: null | SignUpProps;
   userProfileModal: null | UserProfileProps;
+  organizationProfileModal: null | OrganizationProfileProps;
   nodes: Map<HTMLDivElement, HtmlNodeOptions>;
 }
 
@@ -125,9 +129,10 @@ const Components = (props: ComponentsProps) => {
     signInModal: null,
     signUpModal: null,
     userProfileModal: null,
+    organizationProfileModal: null,
     nodes: new Map(),
   });
-  const { signInModal, signUpModal, userProfileModal, nodes } = state;
+  const { signInModal, signUpModal, userProfileModal, organizationProfileModal, nodes } = state;
 
   useSafeLayoutEffect(() => {
     componentsControls.mountComponent = params => {
@@ -255,6 +260,35 @@ const Components = (props: ComponentsProps) => {
     </AppearanceProvider>
   );
 
+  const mountedOrganizationProfileModal = (
+    <AppearanceProvider
+      globalAppearance={state.appearance}
+      appearanceKey='organizationProfile'
+      appearance={organizationProfileModal?.appearance}
+    >
+      <FlowMetadataProvider flow='organizationProfile'>
+        <InternalThemeProvider>
+          <Modal
+            handleClose={() => componentsControls.closeModal('organizationProfile')}
+            containerSx={{ alignItems: 'center' }}
+            contentSx={t => ({
+              height: `min(${t.sizes.$176}, calc(100% - ${t.sizes.$12}))`,
+              margin: 0,
+            })}
+          >
+            <VirtualRouter
+              preservedParams={PRESERVED_QUERYSTRING_PARAMS}
+              onExternalNavigate={() => componentsControls.closeModal('organizationProfile')}
+              startPath='/user'
+            >
+              hello from org profil
+            </VirtualRouter>
+          </Modal>
+        </InternalThemeProvider>
+      </FlowMetadataProvider>
+    </AppearanceProvider>
+  );
+
   const mountedImpersonationFab = (
     <AppearanceProvider
       globalAppearance={state.appearance}
@@ -292,6 +326,7 @@ const Components = (props: ComponentsProps) => {
           {signInModal && mountedSignInModal}
           {signUpModal && mountedSignUpModal}
           {userProfileModal && mountedUserProfileModal}
+          {organizationProfileModal && mountedOrganizationProfileModal}
           {mountedImpersonationFab}
         </OptionsProvider>
       </EnvironmentProvider>
diff --git a/packages/clerk-js/src/ui/customizables/parseAppearance.ts b/packages/clerk-js/src/ui/customizables/parseAppearance.ts
index 57254aea1ff..0b595c043fa 100644
--- a/packages/clerk-js/src/ui/customizables/parseAppearance.ts
+++ b/packages/clerk-js/src/ui/customizables/parseAppearance.ts
@@ -17,7 +17,7 @@ export type ParsedElements = Elements[];
 export type ParsedInternalTheme = InternalTheme;
 export type ParsedLayout = Required<Layout>;
 
-type PublicAppearanceTopLevelKey = keyof Pick<Appearance, 'signIn' | 'signUp' | 'userProfile' | 'userButton'>;
+type PublicAppearanceTopLevelKey = keyof Omit<Appearance, 'baseTheme' | 'elements' | 'layout' | 'variables'>;
 
 export type AppearanceCascade = {
   globalAppearance?: Appearance;
diff --git a/packages/clerk-js/src/ui/elements/contexts/FlowMetadataContext.tsx b/packages/clerk-js/src/ui/elements/contexts/FlowMetadataContext.tsx
index a17fbcb26ea..64737600a37 100644
--- a/packages/clerk-js/src/ui/elements/contexts/FlowMetadataContext.tsx
+++ b/packages/clerk-js/src/ui/elements/contexts/FlowMetadataContext.tsx
@@ -3,7 +3,7 @@ import React from 'react';
 import { createContextAndHook } from '../../utils';
 
 type FlowMetadata = {
-  flow: 'signIn' | 'signUp' | 'userButton' | 'userProfile';
+  flow: 'signIn' | 'signUp' | 'userButton' | 'userProfile' | 'organizationProfile' | 'organizationSwitcher';
   part?:
     | 'start'
     | 'emailCode'
diff --git a/packages/clerk-js/src/ui/types.ts b/packages/clerk-js/src/ui/types.ts
index 0f0b8b2a378..e26645e0da5 100644
--- a/packages/clerk-js/src/ui/types.ts
+++ b/packages/clerk-js/src/ui/types.ts
@@ -1,4 +1,5 @@
 import type { SignInProps, SignUpProps, UserButtonProps, UserProfileProps } from '@clerk/types';
+import { OrganizationProfileProps, OrganizationSwitcherProps } from '@clerk/types';
 
 export type { SignInProps, SignUpProps, UserButtonProps, UserProfileProps };
 
@@ -26,4 +27,20 @@ export type UserButtonCtx = UserButtonProps & {
   mode?: ComponentMode;
 };
 
-export type AvailableComponentCtx = SignInCtx | SignUpCtx | UserButtonCtx | UserProfileCtx;
+export type OrganizationProfileCtx = OrganizationProfileProps & {
+  componentName: 'OrganizationProfile';
+  mode?: ComponentMode;
+};
+
+export type OrganizationSwitcherCtx = OrganizationSwitcherProps & {
+  componentName: 'OrganizationSwitcher';
+  mode?: ComponentMode;
+};
+
+export type AvailableComponentCtx =
+  | SignInCtx
+  | SignUpCtx
+  | UserButtonCtx
+  | UserProfileCtx
+  | OrganizationProfileCtx
+  | OrganizationSwitcherCtx;
diff --git a/packages/react/src/components/uiComponents.tsx b/packages/react/src/components/uiComponents.tsx
index 185c73c27ba..39b2a28c435 100644
--- a/packages/react/src/components/uiComponents.tsx
+++ b/packages/react/src/components/uiComponents.tsx
@@ -1,4 +1,11 @@
-import { SignInProps, SignUpProps, UserButtonProps, UserProfileProps } from '@clerk/types';
+import {
+  OrganizationProfileProps,
+  OrganizationSwitcherProps,
+  SignInProps,
+  SignUpProps,
+  UserButtonProps,
+  UserProfileProps,
+} from '@clerk/types';
 import React from 'react';
 
 import { MountProps, WithClerkProp } from '../types';
@@ -101,3 +108,25 @@ export const UserButton = withClerk(({ clerk, ...props }: WithClerkProp<UserButt
     />
   );
 }, 'UserButton');
+
+export const OrganizationProfile = withClerk(({ clerk, ...props }: WithClerkProp<OrganizationProfileProps>) => {
+  return (
+    <Portal
+      mount={clerk.mountOrganizationProfile}
+      unmount={clerk.unmountOrganizationProfile}
+      updateProps={(clerk as any).__unstable__updateProps}
+      props={props}
+    />
+  );
+}, 'OrganizationProfile');
+
+export const OrganizationSwitcher = withClerk(({ clerk, ...props }: WithClerkProp<OrganizationSwitcherProps>) => {
+  return (
+    <Portal
+      mount={clerk.mountOrganizationSwitcher}
+      unmount={clerk.unmountOrganizationSwitcher}
+      updateProps={(clerk as any).__unstable__updateProps}
+      props={props}
+    />
+  );
+}, 'OrganizationSwitcher');
diff --git a/packages/react/src/isomorphicClerk.ts b/packages/react/src/isomorphicClerk.ts
index c0f71874e9a..2a66db14544 100644
--- a/packages/react/src/isomorphicClerk.ts
+++ b/packages/react/src/isomorphicClerk.ts
@@ -19,6 +19,7 @@ import type {
   UserProfileProps,
   UserResource,
 } from '@clerk/types';
+import { OrganizationProfileProps, OrganizationSwitcherProps } from '@clerk/types/src';
 
 import { noFrontendApiError } from './errors';
 import type { BrowserClerk, BrowserClerkConstructor, ClerkProp, IsomorphicClerkOptions } from './types';
@@ -50,10 +51,13 @@ export default class IsomorphicClerk {
   private preopenSignIn?: null | SignInProps = null;
   private preopenSignUp?: null | SignUpProps = null;
   private preopenUserProfile?: null | UserProfileProps = null;
+  private preopenOrganizationProfile?: null | OrganizationProfileProps = null;
   private premountSignInNodes = new Map<HTMLDivElement, SignInProps>();
   private premountSignUpNodes = new Map<HTMLDivElement, SignUpProps>();
   private premountUserProfileNodes = new Map<HTMLDivElement, UserProfileProps>();
   private premountUserButtonNodes = new Map<HTMLDivElement, UserButtonProps>();
+  private premountOrganizationProfileNodes = new Map<HTMLDivElement, OrganizationProfileProps>();
+  private premountOrganizationSwitcherNodes = new Map<HTMLDivElement, OrganizationSwitcherProps>();
   private premountMethodCalls = new Map<MethodName<BrowserClerk>, MethodCallback>();
   private loadedListeners: Array<() => void> = [];
 
@@ -321,6 +325,22 @@ export default class IsomorphicClerk {
     }
   };
 
+  openOrganizationProfile = (props?: OrganizationProfileProps): void => {
+    if (this.clerkjs && this.#loaded) {
+      this.clerkjs.openOrganizationProfile(props);
+    } else {
+      this.preopenOrganizationProfile = props;
+    }
+  };
+
+  closeOrganizationProfile = (): void => {
+    if (this.clerkjs && this.#loaded) {
+      this.clerkjs.closeOrganizationProfile();
+    } else {
+      this.preopenOrganizationProfile = null;
+    }
+  };
+
   openSignUp = (props?: SignUpProps): void => {
     if (this.clerkjs && this.#loaded) {
       this.clerkjs.openSignUp(props);
@@ -385,6 +405,38 @@ export default class IsomorphicClerk {
     }
   };
 
+  mountOrganizationProfile = (node: HTMLDivElement, props: OrganizationProfileProps): void => {
+    if (this.clerkjs && this.#loaded) {
+      this.clerkjs.mountOrganizationProfile(node, props);
+    } else {
+      this.premountOrganizationProfileNodes.set(node, props);
+    }
+  };
+
+  unmountOrganizationProfile = (node: HTMLDivElement): void => {
+    if (this.clerkjs && this.#loaded) {
+      this.clerkjs.unmountOrganizationProfile(node);
+    } else {
+      this.premountOrganizationProfileNodes.delete(node);
+    }
+  };
+
+  mountOrganizationSwitcher = (node: HTMLDivElement, props: OrganizationSwitcherProps): void => {
+    if (this.clerkjs && this.#loaded) {
+      this.clerkjs.mountOrganizationSwitcher(node, props);
+    } else {
+      this.premountOrganizationSwitcherNodes.set(node, props);
+    }
+  };
+
+  unmountOrganizationSwitcher = (node: HTMLDivElement): void => {
+    if (this.clerkjs && this.#loaded) {
+      this.clerkjs.unmountOrganizationSwitcher(node);
+    } else {
+      this.premountOrganizationSwitcherNodes.delete(node);
+    }
+  };
+
   mountUserButton = (node: HTMLDivElement, userButtonProps: UserButtonProps): void => {
     if (this.clerkjs && this.#loaded) {
       this.clerkjs.mountUserButton(node, userButtonProps);
diff --git a/packages/types/src/appearance.ts b/packages/types/src/appearance.ts
index 8158a3e76fc..f36c7b196dd 100644
--- a/packages/types/src/appearance.ts
+++ b/packages/types/src/appearance.ts
@@ -505,6 +505,8 @@ export type SignInTheme = Theme;
 export type SignUpTheme = Theme;
 export type UserButtonTheme = Theme;
 export type UserProfileTheme = Theme;
+export type OrganizationSwitcherTheme = Theme;
+export type OrganizationProfileTheme = Theme;
 
 export type Appearance<T = Theme> = T & {
   /**
@@ -523,4 +525,12 @@ export type Appearance<T = Theme> = T & {
    * Theme overrides that only apply to the `<UserProfile/>` component
    */
   userProfile?: T;
+  /**
+   * Theme overrides that only apply to the `<OrganizationSwitcher/>` component
+   */
+  organizationSwitcher?: T;
+  /**
+   * Theme overrides that only apply to the `<OrganizationProfile/>` component
+   */
+  organizationProfile?: T;
 };
diff --git a/packages/types/src/clerk.ts b/packages/types/src/clerk.ts
index 034ad9a80ae..24a1944196f 100644
--- a/packages/types/src/clerk.ts
+++ b/packages/types/src/clerk.ts
@@ -1,4 +1,12 @@
-import { Appearance, SignInTheme, SignUpTheme, UserButtonTheme, UserProfileTheme } from './appearance';
+import {
+  Appearance,
+  OrganizationProfileTheme,
+  OrganizationSwitcherTheme,
+  SignInTheme,
+  SignUpTheme,
+  UserButtonTheme,
+  UserProfileTheme,
+} from './appearance';
 import { ClientResource } from './client';
 import { DisplayThemeJSON } from './json';
 import { LocalizationResource } from './localization';
@@ -98,6 +106,17 @@ export interface Clerk {
    */
   closeUserProfile: () => void;
 
+  /**
+   * Opens the Clerk OrganizationProfile modal.
+   * @param props Optional props that will be passed to the OrganizationProfile component.
+   */
+  openOrganizationProfile: (props?: OrganizationProfileProps) => void;
+
+  /**
+   * Closes the Clerk OrganizationProfile modal.
+   */
+  closeOrganizationProfile: () => void;
+
   /**
    * Mounts a sign in flow component at the target element.
    * @param targetNode Target node to mount the SignIn component.
@@ -161,6 +180,32 @@ export interface Clerk {
    */
   unmountUserProfile: (targetNode: HTMLDivElement) => void;
 
+  /**
+   * Mount an organization profile component at the target element.
+   * @param targetNode Target to mount the UserProfile component.
+   * @param props Configuration parameters.
+   */
+  mountOrganizationProfile: (targetNode: HTMLDivElement, props?: OrganizationProfileProps) => void;
+
+  /**
+   * Unmount the organization profile component from the target node.
+   * @param targetNode Target node to unmount the UserProfile component from.
+   */
+  unmountOrganizationProfile: (targetNode: HTMLDivElement) => void;
+
+  /**
+   * Mount an organization switcher component at the target element.
+   * @param targetNode Target to mount the UserProfile component.
+   * @param props Configuration parameters.
+   */
+  mountOrganizationSwitcher: (targetNode: HTMLDivElement, props?: OrganizationSwitcherProps) => void;
+
+  /**
+   * Unmount the organization profile component from the target node.*
+   * @param targetNode Target node to unmount the UserProfile component from.
+   */
+  unmountOrganizationSwitcher: (targetNode: HTMLDivElement) => void;
+
   /**
    * Register a listener that triggers a callback each time important Clerk resources are changed.
    * Allows to hook up at different steps in the sign up, sign in processes.
@@ -436,6 +481,31 @@ export type UserProfileProps = {
   appearance?: UserProfileTheme;
 };
 
+export type OrganizationProfileProps = {
+  /*
+   * Page routing strategy
+   */
+  routing?: RoutingStrategy;
+  /*
+   * Root URL where the component is mounted on, eg: '/user'
+   */
+  path?: string;
+  /*
+   * Hides the default navigation bar
+   */
+  hideNavigation?: boolean;
+  /*
+   * Renders only a specific view of the component eg: 'security'
+   */
+  only?: 'account' | 'security';
+  /**
+   * Customisation options to fully match the Clerk components to your own brand.
+   * These options serve as overrides and will be merged with the global `appearance`
+   * prop of ClerkProvided (if one is provided)
+   */
+  appearance?: OrganizationProfileTheme;
+};
+
 export type UserButtonProps = {
   /**
    * Controls if the username is displayed next to the trigger button
@@ -483,6 +553,24 @@ export type UserButtonProps = {
   appearance?: UserButtonTheme & { userProfile?: UserProfileTheme };
 };
 
+export type OrganizationSwitcherProps = {
+  /**
+   Controls the default state of the OrganizationSwitcher
+   */
+  defaultOpen?: boolean;
+  /**
+   * Full URL or path to navigate after successful account change.
+   * Multi-session mode only.
+   */
+  afterSwitchSessionUrl?: string;
+  /**
+   * Customisation options to fully match the Clerk components to your own brand.
+   * These options serve as overrides and will be merged with the global `appearance`
+   * prop of ClerkProvided (if one is provided)
+   */
+  appearance?: OrganizationSwitcherTheme;
+};
+
 export interface HandleMagicLinkVerificationParams {
   /**
    * Full URL or path to navigate after successful magic link verification

From 16a91fe681ff694894f327fa14404b00fa73bbfa Mon Sep 17 00:00:00 2001
From: Nikos Douvlis <nikosdouvlis@gmail.com>
Date: Mon, 10 Oct 2022 21:52:57 +0300
Subject: [PATCH 20/41] chore(clerk-js): Move all prebuilt components under
 ui/components

---
 packages/clerk-js/src/ui/Components.tsx       |  8 +++----
 .../src/ui/SignIn/SignInSSOCallback.tsx       |  4 ----
 .../src/ui/SignUp/SignUpSSOCallback.tsx       |  4 ----
 .../src/ui/common/EmailLinkVerify.tsx         |  2 +-
 .../SignIn/AlternativeMethods.tsx             | 10 ++++----
 .../{ => components}/SignIn/HavingTrouble.tsx |  6 ++---
 .../src/ui/{ => components}/SignIn/SignIn.tsx |  8 +++----
 .../SignIn/SignInAccountSwitcher.tsx          | 18 +++++++-------
 .../SignIn/SignInFactorOne.tsx                |  8 +++----
 .../SignIn/SignInFactorOneCodeForm.tsx        | 16 ++++++-------
 .../SignIn/SignInFactorOneEmailCodeCard.tsx   |  4 ++--
 .../SignIn/SignInFactorOneEmailLinkCard.tsx   | 18 +++++++-------
 .../SignIn/SignInFactorOnePasswordCard.tsx    | 14 +++++------
 .../SignIn/SignInFactorOnePhoneCodeCard.tsx   |  4 ++--
 .../SignIn/SignInFactorTwo.tsx                |  6 ++---
 .../SignInFactorTwoAlternativeMethods.tsx     | 10 ++++----
 .../SignIn/SignInFactorTwoBackupCodeCard.tsx  | 12 +++++-----
 .../SignIn/SignInFactorTwoCodeForm.tsx        | 12 +++++-----
 .../SignIn/SignInFactorTwoPhoneCodeCard.tsx   |  4 ++--
 .../SignIn/SignInFactorTwoTOTPCard.tsx        |  2 +-
 .../components/SignIn/SignInSSOCallback.tsx   |  4 ++++
 .../SignIn/SignInSocialButtons.tsx            | 14 +++++------
 .../{ => components}/SignIn/SignInStart.tsx   | 24 +++++++++----------
 .../src/ui/{ => components}/SignIn/index.ts   |  0
 .../strategies/factorSortingUtils.test.tsx    |  0
 .../SignIn/strategies/factorSortingUtils.tsx  |  0
 .../ui/{ => components}/SignIn/utils.test.ts  |  0
 .../src/ui/{ => components}/SignIn/utils.ts   |  4 ++--
 .../src/ui/{ => components}/SignUp/SignUp.tsx |  8 +++----
 .../SignUp/SignUpContinue.tsx                 | 14 +++++------
 .../SignUp/SignUpEmailCodeCard.tsx            |  4 ++--
 .../SignUp/SignUpEmailLinkCard.tsx            | 18 +++++++-------
 .../ui/{ => components}/SignUp/SignUpForm.tsx |  6 ++---
 .../SignUp/SignUpPhoneCodeCard.tsx            |  6 ++---
 .../components/SignUp/SignUpSSOCallback.tsx   |  4 ++++
 .../SignUp/SignUpSocialButtons.tsx            | 14 +++++------
 .../{ => components}/SignUp/SignUpStart.tsx   | 20 ++++++++--------
 .../SignUp/SignUpVerificationCodeForm.tsx     |  8 +++----
 .../SignUp/SignUpVerifyEmail.tsx              |  4 ++--
 .../SignUp/SignUpVerifyPhone.tsx              |  0
 .../src/ui/{ => components}/SignUp/index.ts   |  0
 .../SignUp/signUpFormHelpers.test.ts          |  0
 .../SignUp/signUpFormHelpers.ts               |  2 +-
 .../ui/{ => components}/SignUp/util.test.ts   |  0
 .../src/ui/{ => components}/SignUp/util.ts    |  0
 .../UserButton/CurrentAccountActions.tsx      | 10 ++++----
 .../UserButton/OtherSessionActions.tsx        |  8 +++----
 .../UserButton/UserButton.tsx                 | 12 +++++-----
 .../UserButton/UserButtonPopover.tsx          | 12 +++++-----
 .../UserButton/UserButtonTrigger.tsx          |  8 +++----
 .../ui/{ => components}/UserButton/index.ts   |  0
 .../UserButton/useMultisessionActions.tsx     | 10 ++++----
 .../UserProfile/ActiveDevicesSection.tsx      | 10 ++++----
 .../UserProfile/AddAuthenticatorApp.tsx       |  8 +++----
 .../UserProfile/Breadcrumbs.tsx               |  6 ++---
 .../UserProfile/ConnectedAccountsPage.tsx     | 14 +++++------
 .../UserProfile/ConnectedAccountsSection.tsx  | 12 +++++-----
 .../{ => components}/UserProfile/Content.tsx  |  6 ++---
 .../UserProfile/EmailPage.tsx                 | 12 +++++-----
 .../UserProfile/EmailSection.tsx              | 10 ++++----
 .../UserProfile/FormButtons.tsx               |  6 ++---
 .../UserProfile/LinkButtonWithDescription.tsx |  6 ++---
 .../UserProfile/MfaBackupCodeAccordion.tsx    |  6 ++---
 .../UserProfile/MfaBackupCodeCreatePage.tsx   |  8 +++----
 .../UserProfile/MfaBackupCodeList.tsx         | 12 +++++-----
 .../UserProfile/MfaBackupCodePage.tsx         |  6 ++---
 .../UserProfile/MfaBackupCodeTile.tsx         |  2 +-
 .../{ => components}/UserProfile/MfaPage.tsx  | 10 ++++----
 .../UserProfile/MfaPhoneCodeAccordion.tsx     | 10 ++++----
 .../UserProfile/MfaPhoneCodePage.tsx          | 10 ++++----
 .../UserProfile/MfaSection.tsx                |  6 ++---
 .../UserProfile/MfaTOTPAccordion.tsx          |  6 ++---
 .../UserProfile/MfaTOTPPage.tsx               |  4 ++--
 .../{ => components}/UserProfile/Navbar.tsx   | 12 +++++-----
 .../UserProfile/NavigateToFlowStartButton.tsx |  6 ++---
 .../ui/{ => components}/UserProfile/Page.tsx  |  6 ++---
 .../UserProfile/PasswordPage.tsx              | 10 ++++----
 .../UserProfile/PasswordSection.tsx           |  6 ++---
 .../UserProfile/PhonePage.tsx                 | 12 +++++-----
 .../UserProfile/PhoneSection.tsx              | 10 ++++----
 .../UserProfile/ProfilePage.tsx               | 10 ++++----
 .../UserProfile/RemoveResourcePage.tsx        | 14 +++++------
 .../{ => components}/UserProfile/RootPage.tsx | 10 ++++----
 .../{ => components}/UserProfile/Section.tsx  |  6 ++---
 .../UserProfile/SuccessPage.tsx               |  2 +-
 .../UserProfile/UserProfile.tsx               | 10 ++++----
 .../UserProfile/UserProfileAccordion.tsx      |  6 ++---
 .../UserProfile/UserProfileBlockButtons.tsx   |  8 +++----
 .../UserProfile/UserProfileSection.tsx        |  8 +++----
 .../UserProfile/UsernamePage.tsx              | 10 ++++----
 .../UserProfile/UsernameSection.tsx           |  6 ++---
 .../UserProfile/VerifyTOTP.tsx                | 12 +++++-----
 .../UserProfile/VerifyWithCode.tsx            | 10 ++++----
 .../UserProfile/VerifyWithLink.tsx            | 14 +++++------
 .../{ => components}/UserProfile/Web3Page.tsx | 16 ++++++-------
 .../UserProfile/Web3Section.tsx               |  8 +++----
 .../ui/{ => components}/UserProfile/index.ts  |  0
 .../ui/{ => components}/UserProfile/utils.ts  |  0
 98 files changed, 383 insertions(+), 383 deletions(-)
 delete mode 100644 packages/clerk-js/src/ui/SignIn/SignInSSOCallback.tsx
 delete mode 100644 packages/clerk-js/src/ui/SignUp/SignUpSSOCallback.tsx
 rename packages/clerk-js/src/ui/{ => components}/SignIn/AlternativeMethods.tsx (95%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/HavingTrouble.tsx (66%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/SignIn.tsx (90%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/SignInAccountSwitcher.tsx (84%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/SignInFactorOne.tsx (95%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/SignInFactorOneCodeForm.tsx (87%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/SignInFactorOneEmailCodeCard.tsx (89%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/SignInFactorOneEmailLinkCard.tsx (87%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/SignInFactorOnePasswordCard.tsx (88%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/SignInFactorOnePhoneCodeCard.tsx (89%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/SignInFactorTwo.tsx (93%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/SignInFactorTwoAlternativeMethods.tsx (95%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/SignInFactorTwoBackupCodeCard.tsx (89%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/SignInFactorTwoCodeForm.tsx (89%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/SignInFactorTwoPhoneCodeCard.tsx (91%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/SignInFactorTwoTOTPCard.tsx (92%)
 create mode 100644 packages/clerk-js/src/ui/components/SignIn/SignInSSOCallback.tsx
 rename packages/clerk-js/src/ui/{ => components}/SignIn/SignInSocialButtons.tsx (75%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/SignInStart.tsx (92%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/index.ts (100%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/strategies/factorSortingUtils.test.tsx (100%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/strategies/factorSortingUtils.tsx (100%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/utils.test.ts (100%)
 rename packages/clerk-js/src/ui/{ => components}/SignIn/utils.ts (97%)
 rename packages/clerk-js/src/ui/{ => components}/SignUp/SignUp.tsx (91%)
 rename packages/clerk-js/src/ui/{ => components}/SignUp/SignUpContinue.tsx (95%)
 rename packages/clerk-js/src/ui/{ => components}/SignUp/SignUpEmailCodeCard.tsx (91%)
 rename packages/clerk-js/src/ui/{ => components}/SignUp/SignUpEmailLinkCard.tsx (84%)
 rename packages/clerk-js/src/ui/{ => components}/SignUp/SignUpForm.tsx (96%)
 rename packages/clerk-js/src/ui/{ => components}/SignUp/SignUpPhoneCodeCard.tsx (88%)
 create mode 100644 packages/clerk-js/src/ui/components/SignUp/SignUpSSOCallback.tsx
 rename packages/clerk-js/src/ui/{ => components}/SignUp/SignUpSocialButtons.tsx (76%)
 rename packages/clerk-js/src/ui/{ => components}/SignUp/SignUpStart.tsx (95%)
 rename packages/clerk-js/src/ui/{ => components}/SignUp/SignUpVerificationCodeForm.tsx (90%)
 rename packages/clerk-js/src/ui/{ => components}/SignUp/SignUpVerifyEmail.tsx (82%)
 rename packages/clerk-js/src/ui/{ => components}/SignUp/SignUpVerifyPhone.tsx (100%)
 rename packages/clerk-js/src/ui/{ => components}/SignUp/index.ts (100%)
 rename packages/clerk-js/src/ui/{ => components}/SignUp/signUpFormHelpers.test.ts (100%)
 rename packages/clerk-js/src/ui/{ => components}/SignUp/signUpFormHelpers.ts (99%)
 rename packages/clerk-js/src/ui/{ => components}/SignUp/util.test.ts (100%)
 rename packages/clerk-js/src/ui/{ => components}/SignUp/util.ts (100%)
 rename packages/clerk-js/src/ui/{ => components}/UserButton/CurrentAccountActions.tsx (89%)
 rename packages/clerk-js/src/ui/{ => components}/UserButton/OtherSessionActions.tsx (84%)
 rename packages/clerk-js/src/ui/{ => components}/UserButton/UserButton.tsx (81%)
 rename packages/clerk-js/src/ui/{ => components}/UserButton/UserButtonPopover.tsx (95%)
 rename packages/clerk-js/src/ui/{ => components}/UserButton/UserButtonTrigger.tsx (78%)
 rename packages/clerk-js/src/ui/{ => components}/UserButton/index.ts (100%)
 rename packages/clerk-js/src/ui/{ => components}/UserButton/useMultisessionActions.tsx (90%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/ActiveDevicesSection.tsx (95%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/AddAuthenticatorApp.tsx (94%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/Breadcrumbs.tsx (95%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/ConnectedAccountsPage.tsx (91%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/ConnectedAccountsSection.tsx (92%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/Content.tsx (96%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/EmailPage.tsx (90%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/EmailSection.tsx (94%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/FormButtons.tsx (87%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/LinkButtonWithDescription.tsx (91%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/MfaBackupCodeAccordion.tsx (86%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/MfaBackupCodeCreatePage.tsx (89%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/MfaBackupCodeList.tsx (91%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/MfaBackupCodePage.tsx (89%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/MfaBackupCodeTile.tsx (87%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/MfaPage.tsx (93%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/MfaPhoneCodeAccordion.tsx (88%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/MfaPhoneCodePage.tsx (95%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/MfaSection.tsx (91%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/MfaTOTPAccordion.tsx (89%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/MfaTOTPPage.tsx (89%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/Navbar.tsx (95%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/NavigateToFlowStartButton.tsx (82%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/Page.tsx (81%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/PasswordPage.tsx (88%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/PasswordSection.tsx (86%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/PhonePage.tsx (90%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/PhoneSection.tsx (94%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/ProfilePage.tsx (93%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/RemoveResourcePage.tsx (93%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/RootPage.tsx (89%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/Section.tsx (91%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/SuccessPage.tsx (93%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/UserProfile.tsx (84%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/UserProfileAccordion.tsx (60%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/UserProfileBlockButtons.tsx (80%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/UserProfileSection.tsx (78%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/UsernamePage.tsx (83%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/UsernameSection.tsx (85%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/VerifyTOTP.tsx (85%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/VerifyWithCode.tsx (88%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/VerifyWithLink.tsx (84%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/Web3Page.tsx (92%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/Web3Section.tsx (90%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/index.ts (100%)
 rename packages/clerk-js/src/ui/{ => components}/UserProfile/utils.ts (100%)

diff --git a/packages/clerk-js/src/ui/Components.tsx b/packages/clerk-js/src/ui/Components.tsx
index 7c488a0b868..b1d81282239 100644
--- a/packages/clerk-js/src/ui/Components.tsx
+++ b/packages/clerk-js/src/ui/Components.tsx
@@ -6,6 +6,10 @@ import ReactDOM from 'react-dom';
 
 import { PRESERVED_QUERYSTRING_PARAMS } from '../core/constants';
 import { clerkUIErrorDOMElementNotFound } from '../core/errors';
+import { SignIn, SignInModal } from './components/SignIn';
+import { SignUp, SignUpModal } from './components/SignUp';
+import { UserButton } from './components/UserButton';
+import { UserProfile, UserProfileModal } from './components/UserProfile';
 import { EnvironmentProvider, OptionsProvider } from './contexts';
 import { CoreClerkContextWrapper } from './contexts/CoreClerkContextWrapper';
 import { AppearanceProvider } from './customizables';
@@ -14,13 +18,9 @@ import { useSafeLayoutEffect } from './hooks';
 import { ImpersonationFab } from './ImpersonationFab';
 import Portal from './portal';
 import { VirtualRouter } from './router';
-import { SignIn, SignInModal } from './SignIn';
-import { SignUp, SignUpModal } from './SignUp';
 import { InternalThemeProvider } from './styledSystem';
 import type { AvailableComponentProps } from './types';
 import { AvailableComponentCtx } from './types';
-import { UserButton } from './UserButton';
-import { UserProfile, UserProfileModal } from './UserProfile';
 
 const ROOT_ELEMENT_ID = 'clerk-components';
 
diff --git a/packages/clerk-js/src/ui/SignIn/SignInSSOCallback.tsx b/packages/clerk-js/src/ui/SignIn/SignInSSOCallback.tsx
deleted file mode 100644
index 436921c04a3..00000000000
--- a/packages/clerk-js/src/ui/SignIn/SignInSSOCallback.tsx
+++ /dev/null
@@ -1,4 +0,0 @@
-import { withRedirectToHome } from '../../ui/common/withRedirectToHome';
-import { SSOCallback } from '../common';
-
-export const SignInSSOCallback = withRedirectToHome(SSOCallback);
diff --git a/packages/clerk-js/src/ui/SignUp/SignUpSSOCallback.tsx b/packages/clerk-js/src/ui/SignUp/SignUpSSOCallback.tsx
deleted file mode 100644
index f3c7c019d2a..00000000000
--- a/packages/clerk-js/src/ui/SignUp/SignUpSSOCallback.tsx
+++ /dev/null
@@ -1,4 +0,0 @@
-import { withRedirectToHome } from '../../ui/common/withRedirectToHome';
-import { SSOCallback } from '../common';
-
-export const SignUpSSOCallback = withRedirectToHome(SSOCallback);
diff --git a/packages/clerk-js/src/ui/common/EmailLinkVerify.tsx b/packages/clerk-js/src/ui/common/EmailLinkVerify.tsx
index 6976e0a11e5..875add973b1 100644
--- a/packages/clerk-js/src/ui/common/EmailLinkVerify.tsx
+++ b/packages/clerk-js/src/ui/common/EmailLinkVerify.tsx
@@ -2,9 +2,9 @@ import React from 'react';
 
 import { isMagicLinkError, MagicLinkErrorCode } from '../../core/resources/Error';
 import { VerificationStatus } from '../../utils/getClerkQueryParam';
+import { completeSignUpFlow } from '../components/SignUp/util';
 import { useCoreClerk, useCoreSignUp } from '../contexts';
 import { useNavigate } from '../hooks/useNavigate';
-import { completeSignUpFlow } from '../SignUp/util';
 import { sleep } from '../utils';
 import { EmailLinkStatusCard } from './EmailLinkStatusCard';
 
diff --git a/packages/clerk-js/src/ui/SignIn/AlternativeMethods.tsx b/packages/clerk-js/src/ui/components/SignIn/AlternativeMethods.tsx
similarity index 95%
rename from packages/clerk-js/src/ui/SignIn/AlternativeMethods.tsx
rename to packages/clerk-js/src/ui/components/SignIn/AlternativeMethods.tsx
index 08000b64c95..378b9b9ced4 100644
--- a/packages/clerk-js/src/ui/SignIn/AlternativeMethods.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/AlternativeMethods.tsx
@@ -1,11 +1,11 @@
 import { SignInFactor } from '@clerk/types';
 import React from 'react';
 
-import { useCoreSignIn } from '../../ui/contexts/';
-import { descriptors, Flex, Flow, LocalizationKey, localizationKeys } from '../customizables';
-import { ArrowBlockButton, Card, CardAlert, Footer, Header } from '../elements';
-import { useCardState } from '../elements/contexts';
-import { allStrategiesButtonsComparator, formatSafeIdentifier } from '../utils';
+import { useCoreSignIn } from '../../contexts';
+import { descriptors, Flex, Flow, LocalizationKey, localizationKeys } from '../../customizables';
+import { ArrowBlockButton, Card, CardAlert, Footer, Header } from '../../elements';
+import { useCardState } from '../../elements/contexts';
+import { allStrategiesButtonsComparator, formatSafeIdentifier } from '../../utils';
 import { HavingTrouble } from './HavingTrouble';
 import { SignInSocialButtons } from './SignInSocialButtons';
 import { factorHasLocalStrategy } from './utils';
diff --git a/packages/clerk-js/src/ui/SignIn/HavingTrouble.tsx b/packages/clerk-js/src/ui/components/SignIn/HavingTrouble.tsx
similarity index 66%
rename from packages/clerk-js/src/ui/SignIn/HavingTrouble.tsx
rename to packages/clerk-js/src/ui/components/SignIn/HavingTrouble.tsx
index 251e0339013..eac2ce3eefc 100644
--- a/packages/clerk-js/src/ui/SignIn/HavingTrouble.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/HavingTrouble.tsx
@@ -1,8 +1,8 @@
 import React from 'react';
 
-import { localizationKeys } from '../customizables';
-import { ErrorCard } from '../elements';
-import { PropsOfComponent } from '../styledSystem';
+import { localizationKeys } from '../../customizables';
+import { ErrorCard } from '../../elements';
+import { PropsOfComponent } from '../../styledSystem';
 
 export const HavingTrouble = (props: PropsOfComponent<typeof ErrorCard>) => {
   const { onBackLinkClick } = props;
diff --git a/packages/clerk-js/src/ui/SignIn/SignIn.tsx b/packages/clerk-js/src/ui/components/SignIn/SignIn.tsx
similarity index 90%
rename from packages/clerk-js/src/ui/SignIn/SignIn.tsx
rename to packages/clerk-js/src/ui/components/SignIn/SignIn.tsx
index 6c302890c4c..f65e46c4a1c 100644
--- a/packages/clerk-js/src/ui/SignIn/SignIn.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/SignIn.tsx
@@ -1,10 +1,10 @@
 import { SignInProps } from '@clerk/types';
 import React from 'react';
 
-import { ComponentContext, useCoreClerk, useSignInContext, withCoreSessionSwitchGuard } from '../../ui/contexts';
-import { Route, Switch, VIRTUAL_ROUTER_BASE_PATH } from '../../ui/router';
-import { SignInEmailLinkFlowComplete } from '../common/EmailLinkCompleteFlowCard';
-import { Flow } from '../customizables';
+import { SignInEmailLinkFlowComplete } from '../../common/EmailLinkCompleteFlowCard';
+import { ComponentContext, useCoreClerk, useSignInContext, withCoreSessionSwitchGuard } from '../../contexts';
+import { Flow } from '../../customizables';
+import { Route, Switch, VIRTUAL_ROUTER_BASE_PATH } from '../../router';
 import { SignInAccountSwitcher } from './SignInAccountSwitcher';
 import { SignInFactorOne } from './SignInFactorOne';
 import { SignInFactorTwo } from './SignInFactorTwo';
diff --git a/packages/clerk-js/src/ui/SignIn/SignInAccountSwitcher.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInAccountSwitcher.tsx
similarity index 84%
rename from packages/clerk-js/src/ui/SignIn/SignInAccountSwitcher.tsx
rename to packages/clerk-js/src/ui/components/SignIn/SignInAccountSwitcher.tsx
index eb8ec7e6032..06a15600aed 100644
--- a/packages/clerk-js/src/ui/SignIn/SignInAccountSwitcher.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/SignInAccountSwitcher.tsx
@@ -1,14 +1,14 @@
 import React from 'react';
 
-import { withRedirectToHome } from '../../ui/common/withRedirectToHome';
-import { useEnvironment, useSignInContext } from '../../ui/contexts';
-import { useNavigate } from '../../ui/hooks';
-import { Button, Col, descriptors, Flow, Icon } from '../customizables';
-import { Card, CardAlert, Header, UserPreview, UserPreviewProps, withCardStateProvider } from '../elements';
-import { ArrowBlockButton } from '../elements/ArrowBlockButton';
-import { useCardState } from '../elements/contexts';
-import { Plus, SignOutDouble } from '../icons';
-import { PropsOfComponent } from '../styledSystem';
+import { withRedirectToHome } from '../../common/withRedirectToHome';
+import { useEnvironment, useSignInContext } from '../../contexts';
+import { Button, Col, descriptors, Flow, Icon } from '../../customizables';
+import { Card, CardAlert, Header, UserPreview, UserPreviewProps, withCardStateProvider } from '../../elements';
+import { ArrowBlockButton } from '../../elements/ArrowBlockButton';
+import { useCardState } from '../../elements/contexts';
+import { useNavigate } from '../../hooks';
+import { Plus, SignOutDouble } from '../../icons';
+import { PropsOfComponent } from '../../styledSystem';
 import { useMultisessionActions } from '../UserButton/useMultisessionActions';
 
 const _SignInAccountSwitcher = () => {
diff --git a/packages/clerk-js/src/ui/SignIn/SignInFactorOne.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOne.tsx
similarity index 95%
rename from packages/clerk-js/src/ui/SignIn/SignInFactorOne.tsx
rename to packages/clerk-js/src/ui/components/SignIn/SignInFactorOne.tsx
index ef917f22346..185612065ea 100644
--- a/packages/clerk-js/src/ui/SignIn/SignInFactorOne.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOne.tsx
@@ -1,10 +1,10 @@
 import { SignInFactor } from '@clerk/types';
 import React from 'react';
 
-import { withRedirectToHome } from '../../ui/common/withRedirectToHome';
-import { useCoreSignIn, useEnvironment } from '../../ui/contexts';
-import { useRouter } from '../../ui/router';
-import { ErrorCard, LoadingCard, withCardStateProvider } from '../elements';
+import { withRedirectToHome } from '../../common/withRedirectToHome';
+import { useCoreSignIn, useEnvironment } from '../../contexts';
+import { ErrorCard, LoadingCard, withCardStateProvider } from '../../elements';
+import { useRouter } from '../../router';
 import { AlternativeMethods } from './AlternativeMethods';
 import { SignInFactorOneEmailCodeCard } from './SignInFactorOneEmailCodeCard';
 import { SignInFactorOneEmailLinkCard } from './SignInFactorOneEmailLinkCard';
diff --git a/packages/clerk-js/src/ui/SignIn/SignInFactorOneCodeForm.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneCodeForm.tsx
similarity index 87%
rename from packages/clerk-js/src/ui/SignIn/SignInFactorOneCodeForm.tsx
rename to packages/clerk-js/src/ui/components/SignIn/SignInFactorOneCodeForm.tsx
index 9a04faff362..1c5502d2a26 100644
--- a/packages/clerk-js/src/ui/SignIn/SignInFactorOneCodeForm.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneCodeForm.tsx
@@ -1,14 +1,14 @@
 import { EmailCodeFactor, PhoneCodeFactor } from '@clerk/types';
 import React from 'react';
 
-import { clerkInvalidFAPIResponse } from '../../core/errors';
-import { useCoreClerk, useCoreSignIn, useSignInContext } from '../../ui/contexts';
-import { useSupportEmail } from '../../ui/hooks/useSupportEmail';
-import { useRouter } from '../../ui/router';
-import { LocalizationKey } from '../customizables';
-import { VerificationCodeCard, VerificationCodeCardProps } from '../elements';
-import { useCardState } from '../elements/contexts';
-import { handleError } from '../utils';
+import { clerkInvalidFAPIResponse } from '../../../core/errors';
+import { useCoreClerk, useCoreSignIn, useSignInContext } from '../../contexts';
+import { LocalizationKey } from '../../customizables';
+import { VerificationCodeCard, VerificationCodeCardProps } from '../../elements';
+import { useCardState } from '../../elements/contexts';
+import { useSupportEmail } from '../../hooks/useSupportEmail';
+import { useRouter } from '../../router';
+import { handleError } from '../../utils';
 
 export type SignInFactorOneCodeCard = Pick<VerificationCodeCardProps, 'onShowAlternativeMethodsClicked'> & {
   factor: EmailCodeFactor | PhoneCodeFactor;
diff --git a/packages/clerk-js/src/ui/SignIn/SignInFactorOneEmailCodeCard.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneEmailCodeCard.tsx
similarity index 89%
rename from packages/clerk-js/src/ui/SignIn/SignInFactorOneEmailCodeCard.tsx
rename to packages/clerk-js/src/ui/components/SignIn/SignInFactorOneEmailCodeCard.tsx
index 8f6c4171827..e2314d3ec4f 100644
--- a/packages/clerk-js/src/ui/SignIn/SignInFactorOneEmailCodeCard.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneEmailCodeCard.tsx
@@ -1,8 +1,8 @@
 import { EmailCodeFactor } from '@clerk/types';
 import React from 'react';
 
-import { useEnvironment } from '../../ui/contexts';
-import { Flow, localizationKeys } from '../customizables';
+import { useEnvironment } from '../../contexts';
+import { Flow, localizationKeys } from '../../customizables';
 import { SignInFactorOneCodeCard, SignInFactorOneCodeForm } from './SignInFactorOneCodeForm';
 
 type SignInFactorOneEmailCodeCardProps = SignInFactorOneCodeCard & { factor: EmailCodeFactor };
diff --git a/packages/clerk-js/src/ui/SignIn/SignInFactorOneEmailLinkCard.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneEmailLinkCard.tsx
similarity index 87%
rename from packages/clerk-js/src/ui/SignIn/SignInFactorOneEmailLinkCard.tsx
rename to packages/clerk-js/src/ui/components/SignIn/SignInFactorOneEmailLinkCard.tsx
index c855984e206..e919a7aec20 100644
--- a/packages/clerk-js/src/ui/SignIn/SignInFactorOneEmailLinkCard.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOneEmailLinkCard.tsx
@@ -1,15 +1,15 @@
 import { EmailLinkFactor, SignInResource } from '@clerk/types';
 import React from 'react';
 
-import { buildMagicLinkRedirectUrl } from '../../ui/common/redirects';
-import { useCoreClerk, useCoreSignIn, useEnvironment, useSignInContext } from '../../ui/contexts';
-import { useMagicLink } from '../../ui/hooks/useMagicLink';
-import { useRouter } from '../../ui/router/RouteContext';
-import { EmailLinkStatusCard } from '../common';
-import { Flow, localizationKeys } from '../customizables';
-import { VerificationCodeCardProps, VerificationLinkCard } from '../elements';
-import { useCardState } from '../elements/contexts';
-import { handleError } from '../utils';
+import { EmailLinkStatusCard } from '../../common';
+import { buildMagicLinkRedirectUrl } from '../../common/redirects';
+import { useCoreClerk, useCoreSignIn, useEnvironment, useSignInContext } from '../../contexts';
+import { Flow, localizationKeys } from '../../customizables';
+import { VerificationCodeCardProps, VerificationLinkCard } from '../../elements';
+import { useCardState } from '../../elements/contexts';
+import { useMagicLink } from '../../hooks/useMagicLink';
+import { useRouter } from '../../router/RouteContext';
+import { handleError } from '../../utils';
 
 type SignInFactorOneEmailLinkCardProps = Pick<VerificationCodeCardProps, 'onShowAlternativeMethodsClicked'> & {
   factor: EmailLinkFactor;
diff --git a/packages/clerk-js/src/ui/SignIn/SignInFactorOnePasswordCard.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOnePasswordCard.tsx
similarity index 88%
rename from packages/clerk-js/src/ui/SignIn/SignInFactorOnePasswordCard.tsx
rename to packages/clerk-js/src/ui/components/SignIn/SignInFactorOnePasswordCard.tsx
index 568cf6e2650..03019176d85 100644
--- a/packages/clerk-js/src/ui/SignIn/SignInFactorOnePasswordCard.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOnePasswordCard.tsx
@@ -1,12 +1,12 @@
 import React from 'react';
 
-import { clerkInvalidFAPIResponse } from '../../core/errors';
-import { useCoreClerk, useCoreSignIn, useSignInContext } from '../../ui/contexts';
-import { useSupportEmail } from '../../ui/hooks/useSupportEmail';
-import { useRouter } from '../../ui/router/RouteContext';
-import { descriptors, Flex, Flow, localizationKeys } from '../customizables';
-import { Card, CardAlert, Footer, Form, Header, IdentityPreview, useCardState } from '../elements';
-import { handleError, useFormControl } from '../utils';
+import { clerkInvalidFAPIResponse } from '../../../core/errors';
+import { useCoreClerk, useCoreSignIn, useSignInContext } from '../../contexts';
+import { descriptors, Flex, Flow, localizationKeys } from '../../customizables';
+import { Card, CardAlert, Footer, Form, Header, IdentityPreview, useCardState } from '../../elements';
+import { useSupportEmail } from '../../hooks/useSupportEmail';
+import { useRouter } from '../../router/RouteContext';
+import { handleError, useFormControl } from '../../utils';
 
 type SignInFactorOnePasswordProps = {
   onShowAlternativeMethodsClick: React.MouseEventHandler;
diff --git a/packages/clerk-js/src/ui/SignIn/SignInFactorOnePhoneCodeCard.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOnePhoneCodeCard.tsx
similarity index 89%
rename from packages/clerk-js/src/ui/SignIn/SignInFactorOnePhoneCodeCard.tsx
rename to packages/clerk-js/src/ui/components/SignIn/SignInFactorOnePhoneCodeCard.tsx
index 20d3fb559f8..02104448cb5 100644
--- a/packages/clerk-js/src/ui/SignIn/SignInFactorOnePhoneCodeCard.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorOnePhoneCodeCard.tsx
@@ -1,8 +1,8 @@
 import { PhoneCodeFactor } from '@clerk/types';
 import React from 'react';
 
-import { useEnvironment } from '../contexts';
-import { Flow, localizationKeys } from '../customizables';
+import { useEnvironment } from '../../contexts';
+import { Flow, localizationKeys } from '../../customizables';
 import { SignInFactorOneCodeCard, SignInFactorOneCodeForm } from './SignInFactorOneCodeForm';
 
 type SignInFactorOnePhoneCodeCardProps = SignInFactorOneCodeCard & { factor: PhoneCodeFactor };
diff --git a/packages/clerk-js/src/ui/SignIn/SignInFactorTwo.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorTwo.tsx
similarity index 93%
rename from packages/clerk-js/src/ui/SignIn/SignInFactorTwo.tsx
rename to packages/clerk-js/src/ui/components/SignIn/SignInFactorTwo.tsx
index 7bc0771153b..7fd8a0d5f51 100644
--- a/packages/clerk-js/src/ui/SignIn/SignInFactorTwo.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorTwo.tsx
@@ -1,9 +1,9 @@
 import { SignInFactor } from '@clerk/types';
 import React from 'react';
 
-import { withRedirectToHome } from '../../ui/common/withRedirectToHome';
-import { useCoreSignIn } from '../../ui/contexts';
-import { LoadingCard, withCardStateProvider } from '../elements';
+import { withRedirectToHome } from '../../common/withRedirectToHome';
+import { useCoreSignIn } from '../../contexts';
+import { LoadingCard, withCardStateProvider } from '../../elements';
 import { SignInFactorTwoAlternativeMethods } from './SignInFactorTwoAlternativeMethods';
 import { SignInFactorTwoBackupCodeCard } from './SignInFactorTwoBackupCodeCard';
 import { SignInFactorTwoPhoneCodeCard } from './SignInFactorTwoPhoneCodeCard';
diff --git a/packages/clerk-js/src/ui/SignIn/SignInFactorTwoAlternativeMethods.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorTwoAlternativeMethods.tsx
similarity index 95%
rename from packages/clerk-js/src/ui/SignIn/SignInFactorTwoAlternativeMethods.tsx
rename to packages/clerk-js/src/ui/components/SignIn/SignInFactorTwoAlternativeMethods.tsx
index 1db9710d9bd..b394a338ed2 100644
--- a/packages/clerk-js/src/ui/SignIn/SignInFactorTwoAlternativeMethods.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorTwoAlternativeMethods.tsx
@@ -1,11 +1,11 @@
 import { SignInFactor } from '@clerk/types';
 import React from 'react';
 
-import { useCoreSignIn } from '../../ui/contexts/';
-import { Col, descriptors, Flow, LocalizationKey, localizationKeys } from '../customizables';
-import { ArrowBlockButton, Card, CardAlert, Footer, Header } from '../elements';
-import { useCardState } from '../elements/contexts';
-import { backupCodePrefFactorComparator, formatSafeIdentifier } from '../utils';
+import { useCoreSignIn } from '../../contexts';
+import { Col, descriptors, Flow, LocalizationKey, localizationKeys } from '../../customizables';
+import { ArrowBlockButton, Card, CardAlert, Footer, Header } from '../../elements';
+import { useCardState } from '../../elements/contexts';
+import { backupCodePrefFactorComparator, formatSafeIdentifier } from '../../utils';
 import { HavingTrouble } from './HavingTrouble';
 
 export type AlternativeMethodsProps = {
diff --git a/packages/clerk-js/src/ui/SignIn/SignInFactorTwoBackupCodeCard.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorTwoBackupCodeCard.tsx
similarity index 89%
rename from packages/clerk-js/src/ui/SignIn/SignInFactorTwoBackupCodeCard.tsx
rename to packages/clerk-js/src/ui/components/SignIn/SignInFactorTwoBackupCodeCard.tsx
index 02b6317e79a..eeb6433cb7c 100644
--- a/packages/clerk-js/src/ui/SignIn/SignInFactorTwoBackupCodeCard.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorTwoBackupCodeCard.tsx
@@ -1,11 +1,11 @@
 import React from 'react';
 
-import { clerkInvalidFAPIResponse } from '../../core/errors';
-import { useCoreClerk, useCoreSignIn, useEnvironment, useSignInContext } from '../contexts';
-import { Col, descriptors, localizationKeys } from '../customizables';
-import { Card, CardAlert, Footer, Form, Header, useCardState } from '../elements';
-import { useSupportEmail } from '../hooks/useSupportEmail';
-import { handleError, useFormControl } from '../utils';
+import { clerkInvalidFAPIResponse } from '../../../core/errors';
+import { useCoreClerk, useCoreSignIn, useEnvironment, useSignInContext } from '../../contexts';
+import { Col, descriptors, localizationKeys } from '../../customizables';
+import { Card, CardAlert, Footer, Form, Header, useCardState } from '../../elements';
+import { useSupportEmail } from '../../hooks/useSupportEmail';
+import { handleError, useFormControl } from '../../utils';
 
 type SignInFactorTwoBackupCodeCardProps = {
   onShowAlternativeMethodsClicked: React.MouseEventHandler;
diff --git a/packages/clerk-js/src/ui/SignIn/SignInFactorTwoCodeForm.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorTwoCodeForm.tsx
similarity index 89%
rename from packages/clerk-js/src/ui/SignIn/SignInFactorTwoCodeForm.tsx
rename to packages/clerk-js/src/ui/components/SignIn/SignInFactorTwoCodeForm.tsx
index a665ca98792..31bf5a72a6b 100644
--- a/packages/clerk-js/src/ui/SignIn/SignInFactorTwoCodeForm.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorTwoCodeForm.tsx
@@ -1,12 +1,12 @@
 import { PhoneCodeFactor, SignInResource, TOTPFactor } from '@clerk/types';
 import React from 'react';
 
-import { clerkInvalidFAPIResponse } from '../../core/errors';
-import { useCoreClerk, useCoreSignIn, useSignInContext } from '../../ui/contexts';
-import { useSupportEmail } from '../../ui/hooks/useSupportEmail';
-import { LocalizationKey } from '../customizables';
-import { useCardState, VerificationCodeCard, VerificationCodeCardProps } from '../elements';
-import { handleError } from '../utils';
+import { clerkInvalidFAPIResponse } from '../../../core/errors';
+import { useCoreClerk, useCoreSignIn, useSignInContext } from '../../contexts';
+import { LocalizationKey } from '../../customizables';
+import { useCardState, VerificationCodeCard, VerificationCodeCardProps } from '../../elements';
+import { useSupportEmail } from '../../hooks/useSupportEmail';
+import { handleError } from '../../utils';
 
 export type SignInFactorTwoCodeCard = Pick<VerificationCodeCardProps, 'onShowAlternativeMethodsClicked'> & {
   factor: PhoneCodeFactor | TOTPFactor;
diff --git a/packages/clerk-js/src/ui/SignIn/SignInFactorTwoPhoneCodeCard.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorTwoPhoneCodeCard.tsx
similarity index 91%
rename from packages/clerk-js/src/ui/SignIn/SignInFactorTwoPhoneCodeCard.tsx
rename to packages/clerk-js/src/ui/components/SignIn/SignInFactorTwoPhoneCodeCard.tsx
index 42c121f8e3b..eb89634df2c 100644
--- a/packages/clerk-js/src/ui/SignIn/SignInFactorTwoPhoneCodeCard.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorTwoPhoneCodeCard.tsx
@@ -1,8 +1,8 @@
 import { PhoneCodeFactor } from '@clerk/types';
 import React from 'react';
 
-import { useCoreSignIn } from '../../ui/contexts';
-import { Flow, localizationKeys } from '../customizables';
+import { useCoreSignIn } from '../../contexts';
+import { Flow, localizationKeys } from '../../customizables';
 import { SignInFactorTwoCodeCard, SignInFactorTwoCodeForm } from './SignInFactorTwoCodeForm';
 
 type SignInFactorTwoPhoneCodeCardProps = SignInFactorTwoCodeCard & { factor: PhoneCodeFactor };
diff --git a/packages/clerk-js/src/ui/SignIn/SignInFactorTwoTOTPCard.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInFactorTwoTOTPCard.tsx
similarity index 92%
rename from packages/clerk-js/src/ui/SignIn/SignInFactorTwoTOTPCard.tsx
rename to packages/clerk-js/src/ui/components/SignIn/SignInFactorTwoTOTPCard.tsx
index 745ac2d5f6f..035f1ecbab3 100644
--- a/packages/clerk-js/src/ui/SignIn/SignInFactorTwoTOTPCard.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/SignInFactorTwoTOTPCard.tsx
@@ -1,7 +1,7 @@
 import { TOTPFactor } from '@clerk/types';
 import React from 'react';
 
-import { Flow, localizationKeys } from '../customizables';
+import { Flow, localizationKeys } from '../../customizables';
 import { SignInFactorTwoCodeCard, SignInFactorTwoCodeForm } from './SignInFactorTwoCodeForm';
 
 type SignInFactorTwoTOTPCardProps = SignInFactorTwoCodeCard & { factor: TOTPFactor };
diff --git a/packages/clerk-js/src/ui/components/SignIn/SignInSSOCallback.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInSSOCallback.tsx
new file mode 100644
index 00000000000..9a955c26164
--- /dev/null
+++ b/packages/clerk-js/src/ui/components/SignIn/SignInSSOCallback.tsx
@@ -0,0 +1,4 @@
+import { SSOCallback } from '../../common';
+import { withRedirectToHome } from '../../common/withRedirectToHome';
+
+export const SignInSSOCallback = withRedirectToHome(SSOCallback);
diff --git a/packages/clerk-js/src/ui/SignIn/SignInSocialButtons.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInSocialButtons.tsx
similarity index 75%
rename from packages/clerk-js/src/ui/SignIn/SignInSocialButtons.tsx
rename to packages/clerk-js/src/ui/components/SignIn/SignInSocialButtons.tsx
index 4000c372881..99efcbbbefc 100644
--- a/packages/clerk-js/src/ui/SignIn/SignInSocialButtons.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/SignInSocialButtons.tsx
@@ -1,12 +1,12 @@
 import React from 'react';
 
-import { buildSSOCallbackURL } from '../../ui/common/redirects';
-import { useCoreClerk, useCoreSignIn, useSignInContext } from '../../ui/contexts';
-import { useEnvironment } from '../../ui/contexts/EnvironmentContext';
-import { useNavigate } from '../../ui/hooks';
-import { useCardState } from '../elements/contexts';
-import { SocialButtons, SocialButtonsProps } from '../elements/SocialButtons';
-import { handleError } from '../utils';
+import { buildSSOCallbackURL } from '../../common/redirects';
+import { useCoreClerk, useCoreSignIn, useSignInContext } from '../../contexts';
+import { useEnvironment } from '../../contexts/EnvironmentContext';
+import { useCardState } from '../../elements/contexts';
+import { SocialButtons, SocialButtonsProps } from '../../elements/SocialButtons';
+import { useNavigate } from '../../hooks';
+import { handleError } from '../../utils';
 
 export const SignInSocialButtons = React.memo((props: SocialButtonsProps) => {
   const clerk = useCoreClerk();
diff --git a/packages/clerk-js/src/ui/SignIn/SignInStart.tsx b/packages/clerk-js/src/ui/components/SignIn/SignInStart.tsx
similarity index 92%
rename from packages/clerk-js/src/ui/SignIn/SignInStart.tsx
rename to packages/clerk-js/src/ui/components/SignIn/SignInStart.tsx
index 585f5dee82f..5f24e5bc49c 100644
--- a/packages/clerk-js/src/ui/SignIn/SignInStart.tsx
+++ b/packages/clerk-js/src/ui/components/SignIn/SignInStart.tsx
@@ -1,14 +1,12 @@
 import { ClerkAPIError, SignInCreateParams } from '@clerk/types';
 import React from 'react';
 
-import { clerkInvalidFAPIResponse } from '../../core/errors';
-import { ERROR_CODES, getIdentifierControlDisplayValues } from '../../ui/common/constants';
-import { withRedirectToHome } from '../../ui/common/withRedirectToHome';
-import { useCoreClerk, useCoreSignIn, useEnvironment, useSignInContext } from '../../ui/contexts';
-import { useNavigate } from '../../ui/hooks';
-import { useSupportEmail } from '../../ui/hooks/useSupportEmail';
-import { getClerkQueryParam } from '../../utils/getClerkQueryParam';
-import { Col, descriptors, Flow, localizationKeys } from '../customizables';
+import { clerkInvalidFAPIResponse } from '../../../core/errors';
+import { getClerkQueryParam } from '../../../utils/getClerkQueryParam';
+import { ERROR_CODES, getIdentifierControlDisplayValues } from '../../common/constants';
+import { withRedirectToHome } from '../../common/withRedirectToHome';
+import { useCoreClerk, useCoreSignIn, useEnvironment, useSignInContext } from '../../contexts';
+import { Col, descriptors, Flow, localizationKeys } from '../../customizables';
 import {
   Card,
   CardAlert,
@@ -18,10 +16,12 @@ import {
   LoadingCard,
   SocialButtonsReversibleContainerWithDivider,
   withCardStateProvider,
-} from '../elements';
-import { useCardState } from '../elements/contexts';
-import { useLoadingStatus } from '../hooks';
-import { buildRequest, FormControlState, handleError, isMobileDevice, useFormControl } from '../utils';
+} from '../../elements';
+import { useCardState } from '../../elements/contexts';
+import { useNavigate } from '../../hooks';
+import { useLoadingStatus } from '../../hooks';
+import { useSupportEmail } from '../../hooks/useSupportEmail';
+import { buildRequest, FormControlState, handleError, isMobileDevice, useFormControl } from '../../utils';
 import { SignInSocialButtons } from './SignInSocialButtons';
 
 export function _SignInStart(): JSX.Element {
diff --git a/packages/clerk-js/src/ui/SignIn/index.ts b/packages/clerk-js/src/ui/components/SignIn/index.ts
similarity index 100%
rename from packages/clerk-js/src/ui/SignIn/index.ts
rename to packages/clerk-js/src/ui/components/SignIn/index.ts
diff --git a/packages/clerk-js/src/ui/SignIn/strategies/factorSortingUtils.test.tsx b/packages/clerk-js/src/ui/components/SignIn/strategies/factorSortingUtils.test.tsx
similarity index 100%
rename from packages/clerk-js/src/ui/SignIn/strategies/factorSortingUtils.test.tsx
rename to packages/clerk-js/src/ui/components/SignIn/strategies/factorSortingUtils.test.tsx
diff --git a/packages/clerk-js/src/ui/SignIn/strategies/factorSortingUtils.tsx b/packages/clerk-js/src/ui/components/SignIn/strategies/factorSortingUtils.tsx
similarity index 100%
rename from packages/clerk-js/src/ui/SignIn/strategies/factorSortingUtils.tsx
rename to packages/clerk-js/src/ui/components/SignIn/strategies/factorSortingUtils.tsx
diff --git a/packages/clerk-js/src/ui/SignIn/utils.test.ts b/packages/clerk-js/src/ui/components/SignIn/utils.test.ts
similarity index 100%
rename from packages/clerk-js/src/ui/SignIn/utils.test.ts
rename to packages/clerk-js/src/ui/components/SignIn/utils.test.ts
diff --git a/packages/clerk-js/src/ui/SignIn/utils.ts b/packages/clerk-js/src/ui/components/SignIn/utils.ts
similarity index 97%
rename from packages/clerk-js/src/ui/SignIn/utils.ts
rename to packages/clerk-js/src/ui/components/SignIn/utils.ts
index 07750ec8ce0..d4117dcc0c1 100644
--- a/packages/clerk-js/src/ui/SignIn/utils.ts
+++ b/packages/clerk-js/src/ui/components/SignIn/utils.ts
@@ -1,7 +1,7 @@
 import { PreferredSignInStrategy, SignInFactor, SignInResource, SignInStrategy } from '@clerk/types';
 
-import { PREFERRED_SIGN_IN_STRATEGIES } from '../../ui/common/constants';
-import { titleize } from '../shared';
+import { PREFERRED_SIGN_IN_STRATEGIES } from '../../common/constants';
+import { titleize } from '../../shared';
 import { otpPrefFactorComparator, passwordPrefFactorComparator } from './strategies/factorSortingUtils';
 
 const FONT_SIZE_STEP = 2;
diff --git a/packages/clerk-js/src/ui/SignUp/SignUp.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUp.tsx
similarity index 91%
rename from packages/clerk-js/src/ui/SignUp/SignUp.tsx
rename to packages/clerk-js/src/ui/components/SignUp/SignUp.tsx
index a9d3c6cb242..14525dfe99d 100644
--- a/packages/clerk-js/src/ui/SignUp/SignUp.tsx
+++ b/packages/clerk-js/src/ui/components/SignUp/SignUp.tsx
@@ -1,10 +1,10 @@
 import { SignUpProps } from '@clerk/types';
 import React from 'react';
 
-import { ComponentContext, useCoreClerk, useSignUpContext, withCoreSessionSwitchGuard } from '../../ui/contexts';
-import { Route, Switch, VIRTUAL_ROUTER_BASE_PATH } from '../../ui/router';
-import { SignUpEmailLinkFlowComplete } from '../common/EmailLinkCompleteFlowCard';
-import { Flow } from '../customizables';
+import { SignUpEmailLinkFlowComplete } from '../../common/EmailLinkCompleteFlowCard';
+import { ComponentContext, useCoreClerk, useSignUpContext, withCoreSessionSwitchGuard } from '../../contexts';
+import { Flow } from '../../customizables';
+import { Route, Switch, VIRTUAL_ROUTER_BASE_PATH } from '../../router';
 import { SignUpContinue } from './SignUpContinue';
 import { SignUpSSOCallback } from './SignUpSSOCallback';
 import { SignUpStart } from './SignUpStart';
diff --git a/packages/clerk-js/src/ui/SignUp/SignUpContinue.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpContinue.tsx
similarity index 95%
rename from packages/clerk-js/src/ui/SignUp/SignUpContinue.tsx
rename to packages/clerk-js/src/ui/components/SignUp/SignUpContinue.tsx
index c98dd55e2dd..aae3c5eb17e 100644
--- a/packages/clerk-js/src/ui/SignUp/SignUpContinue.tsx
+++ b/packages/clerk-js/src/ui/components/SignUp/SignUpContinue.tsx
@@ -1,9 +1,8 @@
 import React from 'react';
 
-import { withRedirectToHome } from '../../ui/common/withRedirectToHome';
-import { useCoreClerk, useCoreSignUp, useEnvironment, useSignUpContext } from '../../ui/contexts';
-import { useNavigate } from '../../ui/hooks';
-import { descriptors, Flex, Flow, localizationKeys } from '../customizables';
+import { withRedirectToHome } from '../../common/withRedirectToHome';
+import { useCoreClerk, useCoreSignUp, useEnvironment, useSignUpContext } from '../../contexts';
+import { descriptors, Flex, Flow, localizationKeys } from '../../customizables';
 import {
   Card,
   CardAlert,
@@ -12,9 +11,10 @@ import {
   LoadingCard,
   SocialButtonsReversibleContainerWithDivider,
   withCardStateProvider,
-} from '../elements';
-import { useCardState } from '../elements/contexts';
-import { buildRequest, FormControlState, handleError, useFormControl } from '../utils';
+} from '../../elements';
+import { useCardState } from '../../elements/contexts';
+import { useNavigate } from '../../hooks';
+import { buildRequest, FormControlState, handleError, useFormControl } from '../../utils';
 import { SignUpForm } from './SignUpForm';
 import {
   ActiveIdentifier,
diff --git a/packages/clerk-js/src/ui/SignUp/SignUpEmailCodeCard.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpEmailCodeCard.tsx
similarity index 91%
rename from packages/clerk-js/src/ui/SignUp/SignUpEmailCodeCard.tsx
rename to packages/clerk-js/src/ui/components/SignUp/SignUpEmailCodeCard.tsx
index f497848c8be..34d8f6ac96b 100644
--- a/packages/clerk-js/src/ui/SignUp/SignUpEmailCodeCard.tsx
+++ b/packages/clerk-js/src/ui/components/SignUp/SignUpEmailCodeCard.tsx
@@ -1,7 +1,7 @@
 import React from 'react';
 
-import { useCoreSignUp, useEnvironment } from '../../ui/contexts';
-import { Flow, localizationKeys } from '../customizables';
+import { useCoreSignUp, useEnvironment } from '../../contexts';
+import { Flow, localizationKeys } from '../../customizables';
 import { SignUpVerificationCodeForm } from './SignUpVerificationCodeForm';
 
 export const SignUpEmailCodeCard = () => {
diff --git a/packages/clerk-js/src/ui/SignUp/SignUpEmailLinkCard.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpEmailLinkCard.tsx
similarity index 84%
rename from packages/clerk-js/src/ui/SignUp/SignUpEmailLinkCard.tsx
rename to packages/clerk-js/src/ui/components/SignUp/SignUpEmailLinkCard.tsx
index e7a3eacb53e..578ae1652b7 100644
--- a/packages/clerk-js/src/ui/SignUp/SignUpEmailLinkCard.tsx
+++ b/packages/clerk-js/src/ui/components/SignUp/SignUpEmailLinkCard.tsx
@@ -1,15 +1,15 @@
 import { SignUpResource } from '@clerk/types';
 import React from 'react';
 
-import { buildMagicLinkRedirectUrl } from '../../ui/common/redirects';
-import { useCoreClerk, useCoreSignUp, useEnvironment, useSignUpContext } from '../../ui/contexts';
-import { useNavigate } from '../../ui/hooks';
-import { useMagicLink } from '../../ui/hooks/useMagicLink';
-import { EmailLinkStatusCard } from '../common';
-import { Flow, localizationKeys } from '../customizables';
-import { VerificationLinkCard } from '../elements';
-import { useCardState } from '../elements/contexts';
-import { handleError } from '../utils';
+import { EmailLinkStatusCard } from '../../common';
+import { buildMagicLinkRedirectUrl } from '../../common/redirects';
+import { useCoreClerk, useCoreSignUp, useEnvironment, useSignUpContext } from '../../contexts';
+import { Flow, localizationKeys } from '../../customizables';
+import { VerificationLinkCard } from '../../elements';
+import { useCardState } from '../../elements/contexts';
+import { useNavigate } from '../../hooks';
+import { useMagicLink } from '../../hooks/useMagicLink';
+import { handleError } from '../../utils';
 import { completeSignUpFlow } from './util';
 
 export const SignUpEmailLinkCard = () => {
diff --git a/packages/clerk-js/src/ui/SignUp/SignUpForm.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpForm.tsx
similarity index 96%
rename from packages/clerk-js/src/ui/SignUp/SignUpForm.tsx
rename to packages/clerk-js/src/ui/components/SignUp/SignUpForm.tsx
index 7388b75f278..cb792c6d132 100644
--- a/packages/clerk-js/src/ui/SignUp/SignUpForm.tsx
+++ b/packages/clerk-js/src/ui/components/SignUp/SignUpForm.tsx
@@ -1,8 +1,8 @@
 import React from 'react';
 
-import { useAppearance } from '../customizables';
-import { Form } from '../elements';
-import { FormControlState } from '../utils';
+import { useAppearance } from '../../customizables';
+import { Form } from '../../elements';
+import { FormControlState } from '../../utils';
 import { ActiveIdentifier, Fields } from './signUpFormHelpers';
 
 type SignUpFormProps = {
diff --git a/packages/clerk-js/src/ui/SignUp/SignUpPhoneCodeCard.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpPhoneCodeCard.tsx
similarity index 88%
rename from packages/clerk-js/src/ui/SignUp/SignUpPhoneCodeCard.tsx
rename to packages/clerk-js/src/ui/components/SignUp/SignUpPhoneCodeCard.tsx
index 7959fb1cf2e..6f3a1c6c53e 100644
--- a/packages/clerk-js/src/ui/SignUp/SignUpPhoneCodeCard.tsx
+++ b/packages/clerk-js/src/ui/components/SignUp/SignUpPhoneCodeCard.tsx
@@ -1,8 +1,8 @@
 import React from 'react';
 
-import { useCoreSignUp, useEnvironment } from '../../ui/contexts';
-import { Flow, localizationKeys } from '../customizables';
-import { withCardStateProvider } from '../elements';
+import { useCoreSignUp, useEnvironment } from '../../contexts';
+import { Flow, localizationKeys } from '../../customizables';
+import { withCardStateProvider } from '../../elements';
 import { SignUpVerificationCodeForm } from './SignUpVerificationCodeForm';
 
 export const SignUpPhoneCodeCard = withCardStateProvider(() => {
diff --git a/packages/clerk-js/src/ui/components/SignUp/SignUpSSOCallback.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpSSOCallback.tsx
new file mode 100644
index 00000000000..159edc5204a
--- /dev/null
+++ b/packages/clerk-js/src/ui/components/SignUp/SignUpSSOCallback.tsx
@@ -0,0 +1,4 @@
+import { SSOCallback } from '../../common';
+import { withRedirectToHome } from '../../common/withRedirectToHome';
+
+export const SignUpSSOCallback = withRedirectToHome(SSOCallback);
diff --git a/packages/clerk-js/src/ui/SignUp/SignUpSocialButtons.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpSocialButtons.tsx
similarity index 76%
rename from packages/clerk-js/src/ui/SignUp/SignUpSocialButtons.tsx
rename to packages/clerk-js/src/ui/components/SignUp/SignUpSocialButtons.tsx
index d4c33d2e9f3..1b501fd6e78 100644
--- a/packages/clerk-js/src/ui/SignUp/SignUpSocialButtons.tsx
+++ b/packages/clerk-js/src/ui/components/SignUp/SignUpSocialButtons.tsx
@@ -1,13 +1,13 @@
 import { OAuthStrategy } from '@clerk/types';
 import React from 'react';
 
-import { buildSSOCallbackURL } from '../../ui/common/redirects';
-import { useCoreClerk, useCoreSignUp, useSignUpContext } from '../../ui/contexts';
-import { useEnvironment } from '../../ui/contexts/EnvironmentContext';
-import { useNavigate } from '../../ui/hooks';
-import { useCardState } from '../elements';
-import { SocialButtons, SocialButtonsProps } from '../elements/SocialButtons';
-import { handleError } from '../utils';
+import { buildSSOCallbackURL } from '../../common/redirects';
+import { useCoreClerk, useCoreSignUp, useSignUpContext } from '../../contexts';
+import { useEnvironment } from '../../contexts/EnvironmentContext';
+import { useCardState } from '../../elements';
+import { SocialButtons, SocialButtonsProps } from '../../elements/SocialButtons';
+import { useNavigate } from '../../hooks';
+import { handleError } from '../../utils';
 
 export const SignUpSocialButtons = React.memo((props: SocialButtonsProps) => {
   const clerk = useCoreClerk();
diff --git a/packages/clerk-js/src/ui/SignUp/SignUpStart.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpStart.tsx
similarity index 95%
rename from packages/clerk-js/src/ui/SignUp/SignUpStart.tsx
rename to packages/clerk-js/src/ui/components/SignUp/SignUpStart.tsx
index dc049d0c2f9..4e08742d961 100644
--- a/packages/clerk-js/src/ui/SignUp/SignUpStart.tsx
+++ b/packages/clerk-js/src/ui/components/SignUp/SignUpStart.tsx
@@ -1,11 +1,10 @@
 import React from 'react';
 
-import { ERROR_CODES } from '../../ui/common/constants';
-import { withRedirectToHome } from '../../ui/common/withRedirectToHome';
-import { useCoreClerk, useCoreSignUp, useEnvironment, useSignUpContext } from '../../ui/contexts';
-import { useNavigate } from '../../ui/hooks';
-import { getClerkQueryParam } from '../../utils/getClerkQueryParam';
-import { descriptors, Flex, Flow, localizationKeys, useAppearance } from '../customizables';
+import { getClerkQueryParam } from '../../../utils/getClerkQueryParam';
+import { ERROR_CODES } from '../../common/constants';
+import { withRedirectToHome } from '../../common/withRedirectToHome';
+import { useCoreClerk, useCoreSignUp, useEnvironment, useSignUpContext } from '../../contexts';
+import { descriptors, Flex, Flow, localizationKeys, useAppearance } from '../../customizables';
 import {
   Card,
   CardAlert,
@@ -14,10 +13,11 @@ import {
   LoadingCard,
   SocialButtonsReversibleContainerWithDivider,
   withCardStateProvider,
-} from '../elements';
-import { useCardState } from '../elements/contexts';
-import { useLoadingStatus } from '../hooks';
-import { buildRequest, FormControlState, handleError, useFormControl } from '../utils';
+} from '../../elements';
+import { useCardState } from '../../elements/contexts';
+import { useNavigate } from '../../hooks';
+import { useLoadingStatus } from '../../hooks';
+import { buildRequest, FormControlState, handleError, useFormControl } from '../../utils';
 import { SignUpForm } from './SignUpForm';
 import {
   ActiveIdentifier,
diff --git a/packages/clerk-js/src/ui/SignUp/SignUpVerificationCodeForm.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpVerificationCodeForm.tsx
similarity index 90%
rename from packages/clerk-js/src/ui/SignUp/SignUpVerificationCodeForm.tsx
rename to packages/clerk-js/src/ui/components/SignUp/SignUpVerificationCodeForm.tsx
index 18d524e830b..2c298afadbf 100644
--- a/packages/clerk-js/src/ui/SignUp/SignUpVerificationCodeForm.tsx
+++ b/packages/clerk-js/src/ui/components/SignUp/SignUpVerificationCodeForm.tsx
@@ -1,10 +1,10 @@
 import { SignUpResource } from '@clerk/types';
 import React from 'react';
 
-import { useCoreClerk, useSignUpContext } from '../../ui/contexts';
-import { useNavigate } from '../../ui/hooks/useNavigate';
-import { LocalizationKey } from '../customizables';
-import { VerificationCodeCard, VerificationCodeCardProps } from '../elements';
+import { useCoreClerk, useSignUpContext } from '../../contexts';
+import { LocalizationKey } from '../../customizables';
+import { VerificationCodeCard, VerificationCodeCardProps } from '../../elements';
+import { useNavigate } from '../../hooks/useNavigate';
 import { completeSignUpFlow } from './util';
 
 type SignInFactorOneCodeFormProps = {
diff --git a/packages/clerk-js/src/ui/SignUp/SignUpVerifyEmail.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpVerifyEmail.tsx
similarity index 82%
rename from packages/clerk-js/src/ui/SignUp/SignUpVerifyEmail.tsx
rename to packages/clerk-js/src/ui/components/SignUp/SignUpVerifyEmail.tsx
index f06ec204666..db1d3f4cc89 100644
--- a/packages/clerk-js/src/ui/SignUp/SignUpVerifyEmail.tsx
+++ b/packages/clerk-js/src/ui/components/SignUp/SignUpVerifyEmail.tsx
@@ -1,7 +1,7 @@
 import React from 'react';
 
-import { useEnvironment } from '../../ui/contexts';
-import { withCardStateProvider } from '../elements';
+import { useEnvironment } from '../../contexts';
+import { withCardStateProvider } from '../../elements';
 import { SignUpEmailCodeCard } from './SignUpEmailCodeCard';
 import { SignUpEmailLinkCard } from './SignUpEmailLinkCard';
 
diff --git a/packages/clerk-js/src/ui/SignUp/SignUpVerifyPhone.tsx b/packages/clerk-js/src/ui/components/SignUp/SignUpVerifyPhone.tsx
similarity index 100%
rename from packages/clerk-js/src/ui/SignUp/SignUpVerifyPhone.tsx
rename to packages/clerk-js/src/ui/components/SignUp/SignUpVerifyPhone.tsx
diff --git a/packages/clerk-js/src/ui/SignUp/index.ts b/packages/clerk-js/src/ui/components/SignUp/index.ts
similarity index 100%
rename from packages/clerk-js/src/ui/SignUp/index.ts
rename to packages/clerk-js/src/ui/components/SignUp/index.ts
diff --git a/packages/clerk-js/src/ui/SignUp/signUpFormHelpers.test.ts b/packages/clerk-js/src/ui/components/SignUp/signUpFormHelpers.test.ts
similarity index 100%
rename from packages/clerk-js/src/ui/SignUp/signUpFormHelpers.test.ts
rename to packages/clerk-js/src/ui/components/SignUp/signUpFormHelpers.test.ts
diff --git a/packages/clerk-js/src/ui/SignUp/signUpFormHelpers.ts b/packages/clerk-js/src/ui/components/SignUp/signUpFormHelpers.ts
similarity index 99%
rename from packages/clerk-js/src/ui/SignUp/signUpFormHelpers.ts
rename to packages/clerk-js/src/ui/components/SignUp/signUpFormHelpers.ts
index a1523fc0aa2..56357d842e7 100644
--- a/packages/clerk-js/src/ui/SignUp/signUpFormHelpers.ts
+++ b/packages/clerk-js/src/ui/components/SignUp/signUpFormHelpers.ts
@@ -2,7 +2,7 @@ import { camelToSnake } from '@clerk/shared';
 import type { Attributes, SignUpResource } from '@clerk/types';
 import { UserSettingsResource } from '@clerk/types';
 
-import { FieldState } from '../../ui/common';
+import { FieldState } from '../../common';
 
 /**
  * ActiveIdentifier denotes which one of the email address or phone number takes priority when enabled
diff --git a/packages/clerk-js/src/ui/SignUp/util.test.ts b/packages/clerk-js/src/ui/components/SignUp/util.test.ts
similarity index 100%
rename from packages/clerk-js/src/ui/SignUp/util.test.ts
rename to packages/clerk-js/src/ui/components/SignUp/util.test.ts
diff --git a/packages/clerk-js/src/ui/SignUp/util.ts b/packages/clerk-js/src/ui/components/SignUp/util.ts
similarity index 100%
rename from packages/clerk-js/src/ui/SignUp/util.ts
rename to packages/clerk-js/src/ui/components/SignUp/util.ts
diff --git a/packages/clerk-js/src/ui/UserButton/CurrentAccountActions.tsx b/packages/clerk-js/src/ui/components/UserButton/CurrentAccountActions.tsx
similarity index 89%
rename from packages/clerk-js/src/ui/UserButton/CurrentAccountActions.tsx
rename to packages/clerk-js/src/ui/components/UserButton/CurrentAccountActions.tsx
index 2f2306b2567..08d30ec0eda 100644
--- a/packages/clerk-js/src/ui/UserButton/CurrentAccountActions.tsx
+++ b/packages/clerk-js/src/ui/components/UserButton/CurrentAccountActions.tsx
@@ -1,10 +1,10 @@
 import React from 'react';
 
-import { Button, Col, Flex, Icon, LocalizationKey, Spinner, Text } from '../customizables';
-import { ElementDescriptor, ElementId } from '../customizables/elementDescriptors';
-import { useCardState } from '../elements/contexts';
-import { useLoadingStatus } from '../hooks';
-import { PropsOfComponent } from '../styledSystem';
+import { Button, Col, Flex, Icon, LocalizationKey, Spinner, Text } from '../../customizables';
+import { ElementDescriptor, ElementId } from '../../customizables/elementDescriptors';
+import { useCardState } from '../../elements/contexts';
+import { useLoadingStatus } from '../../hooks';
+import { PropsOfComponent } from '../../styledSystem';
 
 export const Actions = (props: PropsOfComponent<typeof Flex>) => {
   return <Col {...props} />;
diff --git a/packages/clerk-js/src/ui/UserButton/OtherSessionActions.tsx b/packages/clerk-js/src/ui/components/UserButton/OtherSessionActions.tsx
similarity index 84%
rename from packages/clerk-js/src/ui/UserButton/OtherSessionActions.tsx
rename to packages/clerk-js/src/ui/components/UserButton/OtherSessionActions.tsx
index 18c58fa8c5e..5794add6eb9 100644
--- a/packages/clerk-js/src/ui/UserButton/OtherSessionActions.tsx
+++ b/packages/clerk-js/src/ui/components/UserButton/OtherSessionActions.tsx
@@ -1,9 +1,9 @@
 import React from 'react';
 
-import { Button, Flex, Text } from '../customizables';
-import { UserPreview, UserPreviewProps } from '../elements';
-import { useCardState } from '../elements/contexts';
-import { mqu, PropsOfComponent } from '../styledSystem';
+import { Button, Flex, Text } from '../../customizables';
+import { UserPreview, UserPreviewProps } from '../../elements';
+import { useCardState } from '../../elements/contexts';
+import { mqu, PropsOfComponent } from '../../styledSystem';
 import { Actions } from './CurrentAccountActions';
 
 export const SessionActions = (props: PropsOfComponent<typeof Flex>) => {
diff --git a/packages/clerk-js/src/ui/UserButton/UserButton.tsx b/packages/clerk-js/src/ui/components/UserButton/UserButton.tsx
similarity index 81%
rename from packages/clerk-js/src/ui/UserButton/UserButton.tsx
rename to packages/clerk-js/src/ui/components/UserButton/UserButton.tsx
index 5ef3fe7b36b..91affa0b1f2 100644
--- a/packages/clerk-js/src/ui/UserButton/UserButton.tsx
+++ b/packages/clerk-js/src/ui/components/UserButton/UserButton.tsx
@@ -1,11 +1,11 @@
 import React from 'react';
 
-import { useCoreUser, useUserButtonContext, withCoreUserGuard } from '../contexts';
-import { descriptors, Flex, Flow, Text } from '../customizables';
-import { withCardStateProvider } from '../elements';
-import { Portal } from '../elements/Portal';
-import { usePopover } from '../hooks';
-import { getFullName, getIdentifier } from '../utils';
+import { useCoreUser, useUserButtonContext, withCoreUserGuard } from '../../contexts';
+import { descriptors, Flex, Flow, Text } from '../../customizables';
+import { withCardStateProvider } from '../../elements';
+import { Portal } from '../../elements/Portal';
+import { usePopover } from '../../hooks';
+import { getFullName, getIdentifier } from '../../utils';
 import { UserButtonPopover } from './UserButtonPopover';
 import { UserButtonTrigger } from './UserButtonTrigger';
 
diff --git a/packages/clerk-js/src/ui/UserButton/UserButtonPopover.tsx b/packages/clerk-js/src/ui/components/UserButton/UserButtonPopover.tsx
similarity index 95%
rename from packages/clerk-js/src/ui/UserButton/UserButtonPopover.tsx
rename to packages/clerk-js/src/ui/components/UserButton/UserButtonPopover.tsx
index d74fe4b41df..f420117695b 100644
--- a/packages/clerk-js/src/ui/UserButton/UserButtonPopover.tsx
+++ b/packages/clerk-js/src/ui/components/UserButton/UserButtonPopover.tsx
@@ -1,12 +1,12 @@
 import { ActiveSessionResource } from '@clerk/types';
 import React from 'react';
 
-import { useCoreSession, useCoreUser, useEnvironment, useUserButtonContext } from '../contexts';
-import { descriptors, Flex, Flow, Link, localizationKeys, useAppearance } from '../customizables';
-import { BaseCard, PoweredByClerkText, UserPreview } from '../elements';
-import { RootBox } from '../elements/RootBox';
-import { CogFilled, Plus, SignOut, SignOutDouble } from '../icons';
-import { animations, PropsOfComponent } from '../styledSystem';
+import { useCoreSession, useCoreUser, useEnvironment, useUserButtonContext } from '../../contexts';
+import { descriptors, Flex, Flow, Link, localizationKeys, useAppearance } from '../../customizables';
+import { BaseCard, PoweredByClerkText, UserPreview } from '../../elements';
+import { RootBox } from '../../elements/RootBox';
+import { CogFilled, Plus, SignOut, SignOutDouble } from '../../icons';
+import { animations, PropsOfComponent } from '../../styledSystem';
 import { Action, Actions } from './CurrentAccountActions';
 import { SessionActions, UserPreviewButton } from './OtherSessionActions';
 import { useMultisessionActions } from './useMultisessionActions';
diff --git a/packages/clerk-js/src/ui/UserButton/UserButtonTrigger.tsx b/packages/clerk-js/src/ui/components/UserButton/UserButtonTrigger.tsx
similarity index 78%
rename from packages/clerk-js/src/ui/UserButton/UserButtonTrigger.tsx
rename to packages/clerk-js/src/ui/components/UserButton/UserButtonTrigger.tsx
index d85be842c86..7d432d9dd62 100644
--- a/packages/clerk-js/src/ui/UserButton/UserButtonTrigger.tsx
+++ b/packages/clerk-js/src/ui/components/UserButton/UserButtonTrigger.tsx
@@ -1,9 +1,9 @@
 import React from 'react';
 
-import { useCoreUser } from '../contexts';
-import { Button, descriptors } from '../customizables';
-import { Avatar } from '../elements';
-import { PropsOfComponent } from '../styledSystem';
+import { useCoreUser } from '../../contexts';
+import { Button, descriptors } from '../../customizables';
+import { Avatar } from '../../elements';
+import { PropsOfComponent } from '../../styledSystem';
 
 type UserButtonTriggerProps = PropsOfComponent<typeof Button> & { isOpen: boolean };
 
diff --git a/packages/clerk-js/src/ui/UserButton/index.ts b/packages/clerk-js/src/ui/components/UserButton/index.ts
similarity index 100%
rename from packages/clerk-js/src/ui/UserButton/index.ts
rename to packages/clerk-js/src/ui/components/UserButton/index.ts
diff --git a/packages/clerk-js/src/ui/UserButton/useMultisessionActions.tsx b/packages/clerk-js/src/ui/components/UserButton/useMultisessionActions.tsx
similarity index 90%
rename from packages/clerk-js/src/ui/UserButton/useMultisessionActions.tsx
rename to packages/clerk-js/src/ui/components/UserButton/useMultisessionActions.tsx
index 73cbaa7042b..e1f0967c4a8 100644
--- a/packages/clerk-js/src/ui/UserButton/useMultisessionActions.tsx
+++ b/packages/clerk-js/src/ui/components/UserButton/useMultisessionActions.tsx
@@ -1,11 +1,11 @@
 import { ActiveSessionResource, UserButtonProps, UserResource } from '@clerk/types';
 import React from 'react';
 
-import { windowNavigate } from '../../utils/windowNavigate';
-import { useCoreClerk, useCoreSessionList } from '../contexts';
-import { useCardState } from '../elements';
-import { useNavigate } from '../hooks';
-import { sleep } from '../utils';
+import { windowNavigate } from '../../../utils/windowNavigate';
+import { useCoreClerk, useCoreSessionList } from '../../contexts';
+import { useCardState } from '../../elements';
+import { useNavigate } from '../../hooks';
+import { sleep } from '../../utils';
 
 type UseMultisessionActionsParams = {
   user: UserResource | undefined;
diff --git a/packages/clerk-js/src/ui/UserProfile/ActiveDevicesSection.tsx b/packages/clerk-js/src/ui/components/UserProfile/ActiveDevicesSection.tsx
similarity index 95%
rename from packages/clerk-js/src/ui/UserProfile/ActiveDevicesSection.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/ActiveDevicesSection.tsx
index be23f61c040..ea775e999aa 100644
--- a/packages/clerk-js/src/ui/UserProfile/ActiveDevicesSection.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/ActiveDevicesSection.tsx
@@ -2,11 +2,11 @@ import { formatRelative } from '@clerk/shared';
 import { SessionWithActivitiesResource } from '@clerk/types';
 import React from 'react';
 
-import { useCoreSession, useCoreUser } from '../contexts';
-import { Badge, Col, descriptors, Flex, Icon, localizationKeys, Text } from '../customizables';
-import { FullHeightLoader } from '../elements';
-import { DeviceLaptop, DeviceMobile } from '../icons';
-import { mqu } from '../styledSystem';
+import { useCoreSession, useCoreUser } from '../../contexts';
+import { Badge, Col, descriptors, Flex, Icon, localizationKeys, Text } from '../../customizables';
+import { FullHeightLoader } from '../../elements';
+import { DeviceLaptop, DeviceMobile } from '../../icons';
+import { mqu } from '../../styledSystem';
 import { LinkButtonWithDescription } from './LinkButtonWithDescription';
 import { ProfileSection } from './Section';
 import { UserProfileAccordion } from './UserProfileAccordion';
diff --git a/packages/clerk-js/src/ui/UserProfile/AddAuthenticatorApp.tsx b/packages/clerk-js/src/ui/components/UserProfile/AddAuthenticatorApp.tsx
similarity index 94%
rename from packages/clerk-js/src/ui/UserProfile/AddAuthenticatorApp.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/AddAuthenticatorApp.tsx
index c3d67d71ac5..cc1518cb035 100644
--- a/packages/clerk-js/src/ui/UserProfile/AddAuthenticatorApp.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/AddAuthenticatorApp.tsx
@@ -2,10 +2,10 @@ import { TOTPResource } from '@clerk/types';
 import { QRCodeSVG } from 'qrcode.react';
 import React from 'react';
 
-import { useCoreUser } from '../contexts';
-import { Button, Col, Text } from '../customizables';
-import { ClipboardInput, FullHeightLoader, useCardState } from '../elements';
-import { handleError } from '../utils';
+import { useCoreUser } from '../../contexts';
+import { Button, Col, Text } from '../../customizables';
+import { ClipboardInput, FullHeightLoader, useCardState } from '../../elements';
+import { handleError } from '../../utils';
 import { FormButtonContainer } from './FormButtons';
 import { NavigateToFlowStartButton } from './NavigateToFlowStartButton';
 import { ContentPage } from './Page';
diff --git a/packages/clerk-js/src/ui/UserProfile/Breadcrumbs.tsx b/packages/clerk-js/src/ui/components/UserProfile/Breadcrumbs.tsx
similarity index 95%
rename from packages/clerk-js/src/ui/UserProfile/Breadcrumbs.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/Breadcrumbs.tsx
index 3d3a0bf0d19..05879ea345a 100644
--- a/packages/clerk-js/src/ui/UserProfile/Breadcrumbs.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/Breadcrumbs.tsx
@@ -1,8 +1,8 @@
 import React from 'react';
 
-import { descriptors, Flex, Icon, Link, LocalizationKey, Text, useLocalizations } from '../customizables';
-import { useRouter } from '../router';
-import { mqu, PropsOfComponent } from '../styledSystem';
+import { descriptors, Flex, Icon, Link, LocalizationKey, Text, useLocalizations } from '../../customizables';
+import { useRouter } from '../../router';
+import { mqu, PropsOfComponent } from '../../styledSystem';
 import { BaseRoutes } from './Navbar';
 import { useNavigateToFlowStart } from './NavigateToFlowStartButton';
 
diff --git a/packages/clerk-js/src/ui/UserProfile/ConnectedAccountsPage.tsx b/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsPage.tsx
similarity index 91%
rename from packages/clerk-js/src/ui/UserProfile/ConnectedAccountsPage.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsPage.tsx
index 86c10cb3637..3df420831e8 100644
--- a/packages/clerk-js/src/ui/UserProfile/ConnectedAccountsPage.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsPage.tsx
@@ -1,13 +1,13 @@
 import { ExternalAccountResource, OAuthStrategy } from '@clerk/types';
 import React from 'react';
 
-import { useWizard, Wizard } from '../common';
-import { useCoreUser } from '../contexts';
-import { Col, Image, localizationKeys, Text } from '../customizables';
-import { ArrowBlockButton, useCardState, withCardStateProvider } from '../elements';
-import { useEnabledThirdPartyProviders, useNavigate } from '../hooks';
-import { useRouter } from '../router';
-import { handleError, sleep } from '../utils';
+import { useWizard, Wizard } from '../../common';
+import { useCoreUser } from '../../contexts';
+import { Col, Image, localizationKeys, Text } from '../../customizables';
+import { ArrowBlockButton, useCardState, withCardStateProvider } from '../../elements';
+import { useEnabledThirdPartyProviders, useNavigate } from '../../hooks';
+import { useRouter } from '../../router';
+import { handleError, sleep } from '../../utils';
 import { FormButtonContainer } from './FormButtons';
 import { NavigateToFlowStartButton } from './NavigateToFlowStartButton';
 import { ContentPage } from './Page';
diff --git a/packages/clerk-js/src/ui/UserProfile/ConnectedAccountsSection.tsx b/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsSection.tsx
similarity index 92%
rename from packages/clerk-js/src/ui/UserProfile/ConnectedAccountsSection.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsSection.tsx
index a6c36a07663..e4a93ac7bff 100644
--- a/packages/clerk-js/src/ui/UserProfile/ConnectedAccountsSection.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsSection.tsx
@@ -1,12 +1,12 @@
 import { OAuthStrategy } from '@clerk/types';
 import { ExternalAccountResource } from '@clerk/types/src';
 
-import { useCoreUser } from '../contexts';
-import { Badge, Col, descriptors, Flex, Image, localizationKeys } from '../customizables';
-import { useCardState, UserPreview } from '../elements';
-import { useEnabledThirdPartyProviders } from '../hooks';
-import { useNavigate } from '../hooks/useNavigate';
-import { handleError } from '../utils';
+import { useCoreUser } from '../../contexts';
+import { Badge, Col, descriptors, Flex, Image, localizationKeys } from '../../customizables';
+import { useCardState, UserPreview } from '../../elements';
+import { useEnabledThirdPartyProviders } from '../../hooks';
+import { useNavigate } from '../../hooks/useNavigate';
+import { handleError } from '../../utils';
 import { LinkButtonWithDescription } from './LinkButtonWithDescription';
 import { ProfileSection } from './Section';
 import { UserProfileAccordion } from './UserProfileAccordion';
diff --git a/packages/clerk-js/src/ui/UserProfile/Content.tsx b/packages/clerk-js/src/ui/components/UserProfile/Content.tsx
similarity index 96%
rename from packages/clerk-js/src/ui/UserProfile/Content.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/Content.tsx
index c4c8adbe620..66133c6e947 100644
--- a/packages/clerk-js/src/ui/UserProfile/Content.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/Content.tsx
@@ -1,8 +1,8 @@
 import React from 'react';
 
-import { Col, descriptors } from '../customizables';
-import { Route, Switch, useRouter } from '../router';
-import { common, mqu } from '../styledSystem';
+import { Col, descriptors } from '../../customizables';
+import { Route, Switch, useRouter } from '../../router';
+import { common, mqu } from '../../styledSystem';
 import { ConnectedAccountsPage } from './ConnectedAccountsPage';
 import { EmailPage } from './EmailPage';
 import { MfaBackupCodeCreatePage } from './MfaBackupCodeCreatePage';
diff --git a/packages/clerk-js/src/ui/UserProfile/EmailPage.tsx b/packages/clerk-js/src/ui/components/UserProfile/EmailPage.tsx
similarity index 90%
rename from packages/clerk-js/src/ui/UserProfile/EmailPage.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/EmailPage.tsx
index 3e705919f27..7b221f1284b 100644
--- a/packages/clerk-js/src/ui/UserProfile/EmailPage.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/EmailPage.tsx
@@ -1,12 +1,12 @@
 import { EmailAddressResource } from '@clerk/types';
 import React from 'react';
 
-import { useWizard, Wizard } from '../common';
-import { useCoreUser, useEnvironment } from '../contexts';
-import { localizationKeys, Text } from '../customizables';
-import { Form, useCardState, withCardStateProvider } from '../elements';
-import { useRouter } from '../router';
-import { handleError, useFormControl } from '../utils';
+import { useWizard, Wizard } from '../../common';
+import { useCoreUser, useEnvironment } from '../../contexts';
+import { localizationKeys, Text } from '../../customizables';
+import { Form, useCardState, withCardStateProvider } from '../../elements';
+import { useRouter } from '../../router';
+import { handleError, useFormControl } from '../../utils';
 import { FormButtons } from './FormButtons';
 import { ContentPage } from './Page';
 import { SuccessPage } from './SuccessPage';
diff --git a/packages/clerk-js/src/ui/UserProfile/EmailSection.tsx b/packages/clerk-js/src/ui/components/UserProfile/EmailSection.tsx
similarity index 94%
rename from packages/clerk-js/src/ui/UserProfile/EmailSection.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/EmailSection.tsx
index 8e103fd21a4..e0aae9daf98 100644
--- a/packages/clerk-js/src/ui/UserProfile/EmailSection.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/EmailSection.tsx
@@ -1,11 +1,11 @@
 import { EmailAddressResource } from '@clerk/types';
 import React from 'react';
 
-import { useCoreUser } from '../contexts';
-import { Badge, Col, localizationKeys } from '../customizables';
-import { useCardState } from '../elements';
-import { useNavigate } from '../hooks/useNavigate';
-import { handleError } from '../utils';
+import { useCoreUser } from '../../contexts';
+import { Badge, Col, localizationKeys } from '../../customizables';
+import { useCardState } from '../../elements';
+import { useNavigate } from '../../hooks/useNavigate';
+import { handleError } from '../../utils';
 import { LinkButtonWithDescription } from './LinkButtonWithDescription';
 import { ProfileSection } from './Section';
 import { UserProfileAccordion } from './UserProfileAccordion';
diff --git a/packages/clerk-js/src/ui/UserProfile/FormButtons.tsx b/packages/clerk-js/src/ui/components/UserProfile/FormButtons.tsx
similarity index 87%
rename from packages/clerk-js/src/ui/UserProfile/FormButtons.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/FormButtons.tsx
index f2b9cad60ed..8da5575cd51 100644
--- a/packages/clerk-js/src/ui/UserProfile/FormButtons.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/FormButtons.tsx
@@ -1,8 +1,8 @@
 import React from 'react';
 
-import { Flex, localizationKeys } from '../customizables';
-import { Form } from '../elements';
-import { PropsOfComponent } from '../styledSystem';
+import { Flex, localizationKeys } from '../../customizables';
+import { Form } from '../../elements';
+import { PropsOfComponent } from '../../styledSystem';
 import { useNavigateToFlowStart } from './NavigateToFlowStartButton';
 
 type FormButtonsProps = PropsOfComponent<typeof Form.SubmitButton> & {
diff --git a/packages/clerk-js/src/ui/UserProfile/LinkButtonWithDescription.tsx b/packages/clerk-js/src/ui/components/UserProfile/LinkButtonWithDescription.tsx
similarity index 91%
rename from packages/clerk-js/src/ui/UserProfile/LinkButtonWithDescription.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/LinkButtonWithDescription.tsx
index 5a0a808c602..13729fbf960 100644
--- a/packages/clerk-js/src/ui/UserProfile/LinkButtonWithDescription.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/LinkButtonWithDescription.tsx
@@ -1,6 +1,6 @@
-import { Button, Col, Flex, LocalizationKey, Text, useLocalizations } from '../customizables';
-import { useLoadingStatus } from '../hooks';
-import { PropsOfComponent } from '../styledSystem';
+import { Button, Col, Flex, LocalizationKey, Text, useLocalizations } from '../../customizables';
+import { useLoadingStatus } from '../../hooks';
+import { PropsOfComponent } from '../../styledSystem';
 
 type LinkButtonWithTextDescriptionProps = Omit<PropsOfComponent<typeof Button>, 'title'> & {
   title: LocalizationKey;
diff --git a/packages/clerk-js/src/ui/UserProfile/MfaBackupCodeAccordion.tsx b/packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeAccordion.tsx
similarity index 86%
rename from packages/clerk-js/src/ui/UserProfile/MfaBackupCodeAccordion.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeAccordion.tsx
index 79c52aa8b4c..9d525bcda11 100644
--- a/packages/clerk-js/src/ui/UserProfile/MfaBackupCodeAccordion.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeAccordion.tsx
@@ -1,8 +1,8 @@
 import React from 'react';
 
-import { Col, Icon } from '../customizables';
-import { useNavigate } from '../hooks';
-import { DotCircle } from '../icons';
+import { Col, Icon } from '../../customizables';
+import { useNavigate } from '../../hooks';
+import { DotCircle } from '../../icons';
 import { LinkButtonWithDescription } from './LinkButtonWithDescription';
 import { UserProfileAccordion } from './UserProfileAccordion';
 
diff --git a/packages/clerk-js/src/ui/UserProfile/MfaBackupCodeCreatePage.tsx b/packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeCreatePage.tsx
similarity index 89%
rename from packages/clerk-js/src/ui/UserProfile/MfaBackupCodeCreatePage.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeCreatePage.tsx
index c4f5b59ce07..dcbfc20b5d8 100644
--- a/packages/clerk-js/src/ui/UserProfile/MfaBackupCodeCreatePage.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeCreatePage.tsx
@@ -1,10 +1,10 @@
 import { BackupCodeResource } from '@clerk/types';
 import React from 'react';
 
-import { useCoreUser } from '../contexts';
-import { localizationKeys, Text } from '../customizables';
-import { FullHeightLoader, useCardState } from '../elements';
-import { handleError } from '../utils';
+import { useCoreUser } from '../../contexts';
+import { localizationKeys, Text } from '../../customizables';
+import { FullHeightLoader, useCardState } from '../../elements';
+import { handleError } from '../../utils';
 import { FormButtonContainer } from './FormButtons';
 import { MfaBackupCodeList } from './MfaBackupCodeList';
 import { NavigateToFlowStartButton } from './NavigateToFlowStartButton';
diff --git a/packages/clerk-js/src/ui/UserProfile/MfaBackupCodeList.tsx b/packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeList.tsx
similarity index 91%
rename from packages/clerk-js/src/ui/UserProfile/MfaBackupCodeList.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeList.tsx
index 05fa84a2a70..98300cf678d 100644
--- a/packages/clerk-js/src/ui/UserProfile/MfaBackupCodeList.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeList.tsx
@@ -1,11 +1,11 @@
 import React from 'react';
 
-import { PrintableComponent, usePrintable } from '../common';
-import { useCoreUser, useEnvironment } from '../contexts';
-import { Button, Col, Flex, Grid, Heading, LocalizationKey, Text } from '../customizables';
-import { useClipboard } from '../hooks';
-import { mqu } from '../styledSystem';
-import { getIdentifier } from '../utils';
+import { PrintableComponent, usePrintable } from '../../common';
+import { useCoreUser, useEnvironment } from '../../contexts';
+import { Button, Col, Flex, Grid, Heading, LocalizationKey, Text } from '../../customizables';
+import { useClipboard } from '../../hooks';
+import { mqu } from '../../styledSystem';
+import { getIdentifier } from '../../utils';
 import { MfaBackupCodeTile } from './MfaBackupCodeTile';
 
 type MfaBackupCodeListProps = {
diff --git a/packages/clerk-js/src/ui/UserProfile/MfaBackupCodePage.tsx b/packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodePage.tsx
similarity index 89%
rename from packages/clerk-js/src/ui/UserProfile/MfaBackupCodePage.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodePage.tsx
index 85c414059e6..377dfaaa0b4 100644
--- a/packages/clerk-js/src/ui/UserProfile/MfaBackupCodePage.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodePage.tsx
@@ -1,8 +1,8 @@
 import React from 'react';
 
-import { useWizard, Wizard } from '../common';
-import { Button, Text } from '../customizables';
-import { withCardStateProvider } from '../elements';
+import { useWizard, Wizard } from '../../common';
+import { Button, Text } from '../../customizables';
+import { withCardStateProvider } from '../../elements';
 import { FormButtonContainer } from './FormButtons';
 import { MfaBackupCodeCreatePage } from './MfaBackupCodeCreatePage';
 import { NavigateToFlowStartButton } from './NavigateToFlowStartButton';
diff --git a/packages/clerk-js/src/ui/UserProfile/MfaBackupCodeTile.tsx b/packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeTile.tsx
similarity index 87%
rename from packages/clerk-js/src/ui/UserProfile/MfaBackupCodeTile.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeTile.tsx
index edf42d48f5e..ab77fa785f1 100644
--- a/packages/clerk-js/src/ui/UserProfile/MfaBackupCodeTile.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeTile.tsx
@@ -1,6 +1,6 @@
 import React from 'react';
 
-import { Flex, Text } from '../customizables';
+import { Flex, Text } from '../../customizables';
 
 export const MfaBackupCodeTile = (props: { code: string }) => {
   const { code } = props;
diff --git a/packages/clerk-js/src/ui/UserProfile/MfaPage.tsx b/packages/clerk-js/src/ui/components/UserProfile/MfaPage.tsx
similarity index 93%
rename from packages/clerk-js/src/ui/UserProfile/MfaPage.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/MfaPage.tsx
index e6004f528e2..eb42a725c04 100644
--- a/packages/clerk-js/src/ui/UserProfile/MfaPage.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/MfaPage.tsx
@@ -1,11 +1,11 @@
 import { VerificationStrategy } from '@clerk/types';
 import React from 'react';
 
-import { useCoreUser, useEnvironment } from '../contexts';
-import { Col, Grid, localizationKeys, Text } from '../customizables';
-import { TileButton, useCardState, withCardStateProvider } from '../elements';
-import { AuthApp, DotCircle, Mobile } from '../icons';
-import { mqu } from '../styledSystem';
+import { useCoreUser, useEnvironment } from '../../contexts';
+import { Col, Grid, localizationKeys, Text } from '../../customizables';
+import { TileButton, useCardState, withCardStateProvider } from '../../elements';
+import { AuthApp, DotCircle, Mobile } from '../../icons';
+import { mqu } from '../../styledSystem';
 import { FormButtonContainer } from './FormButtons';
 import { MfaBackupCodePage } from './MfaBackupCodePage';
 import { MfaPhoneCodePage } from './MfaPhoneCodePage';
diff --git a/packages/clerk-js/src/ui/UserProfile/MfaPhoneCodeAccordion.tsx b/packages/clerk-js/src/ui/components/UserProfile/MfaPhoneCodeAccordion.tsx
similarity index 88%
rename from packages/clerk-js/src/ui/UserProfile/MfaPhoneCodeAccordion.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/MfaPhoneCodeAccordion.tsx
index 9a00d0aedb3..03f55198c54 100644
--- a/packages/clerk-js/src/ui/UserProfile/MfaPhoneCodeAccordion.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/MfaPhoneCodeAccordion.tsx
@@ -1,11 +1,11 @@
 import { PhoneNumberResource } from '@clerk/types';
 import React from 'react';
 
-import { Badge, Col, Icon } from '../customizables';
-import { FormattedPhoneNumberText, useCardState } from '../elements';
-import { useNavigate } from '../hooks';
-import { Mobile } from '../icons';
-import { handleError } from '../utils';
+import { Badge, Col, Icon } from '../../customizables';
+import { FormattedPhoneNumberText, useCardState } from '../../elements';
+import { useNavigate } from '../../hooks';
+import { Mobile } from '../../icons';
+import { handleError } from '../../utils';
 import { LinkButtonWithDescription } from './LinkButtonWithDescription';
 import { UserProfileAccordion } from './UserProfileAccordion';
 
diff --git a/packages/clerk-js/src/ui/UserProfile/MfaPhoneCodePage.tsx b/packages/clerk-js/src/ui/components/UserProfile/MfaPhoneCodePage.tsx
similarity index 95%
rename from packages/clerk-js/src/ui/UserProfile/MfaPhoneCodePage.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/MfaPhoneCodePage.tsx
index 905f4061691..9e3775a3d93 100644
--- a/packages/clerk-js/src/ui/UserProfile/MfaPhoneCodePage.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/MfaPhoneCodePage.tsx
@@ -1,11 +1,11 @@
 import { PhoneNumberResource } from '@clerk/types';
 import React from 'react';
 
-import { useWizard, Wizard } from '../common';
-import { useCoreUser } from '../contexts';
-import { Col, Text } from '../customizables';
-import { ArrowBlockButton, useCardState, withCardStateProvider } from '../elements';
-import { getFlagEmojiFromCountryIso, handleError, parsePhoneString, stringToFormattedPhoneString } from '../utils';
+import { useWizard, Wizard } from '../../common';
+import { useCoreUser } from '../../contexts';
+import { Col, Text } from '../../customizables';
+import { ArrowBlockButton, useCardState, withCardStateProvider } from '../../elements';
+import { getFlagEmojiFromCountryIso, handleError, parsePhoneString, stringToFormattedPhoneString } from '../../utils';
 import { FormButtonContainer } from './FormButtons';
 import { NavigateToFlowStartButton } from './NavigateToFlowStartButton';
 import { ContentPage } from './Page';
diff --git a/packages/clerk-js/src/ui/UserProfile/MfaSection.tsx b/packages/clerk-js/src/ui/components/UserProfile/MfaSection.tsx
similarity index 91%
rename from packages/clerk-js/src/ui/UserProfile/MfaSection.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/MfaSection.tsx
index 394ad538e1f..fc271f28e06 100644
--- a/packages/clerk-js/src/ui/UserProfile/MfaSection.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/MfaSection.tsx
@@ -1,8 +1,8 @@
 import React from 'react';
 
-import { useCoreUser, useEnvironment } from '../contexts';
-import { localizationKeys } from '../customizables';
-import { useNavigate } from '../hooks';
+import { useCoreUser, useEnvironment } from '../../contexts';
+import { localizationKeys } from '../../customizables';
+import { useNavigate } from '../../hooks';
 import { MfaBackupCodeAccordion } from './MfaBackupCodeAccordion';
 import { MfaPhoneCodeAccordion } from './MfaPhoneCodeAccordion';
 import { MfaTOTPAccordion } from './MfaTOTPAccordion';
diff --git a/packages/clerk-js/src/ui/UserProfile/MfaTOTPAccordion.tsx b/packages/clerk-js/src/ui/components/UserProfile/MfaTOTPAccordion.tsx
similarity index 89%
rename from packages/clerk-js/src/ui/UserProfile/MfaTOTPAccordion.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/MfaTOTPAccordion.tsx
index c15812f03ae..7c569ba7d60 100644
--- a/packages/clerk-js/src/ui/UserProfile/MfaTOTPAccordion.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/MfaTOTPAccordion.tsx
@@ -1,8 +1,8 @@
 import React from 'react';
 
-import { useNavigate } from '../hooks';
-import { Badge, Col, Icon } from '../customizables';
-import { AuthApp } from '../icons';
+import { Badge, Col, Icon } from '../../customizables';
+import { useNavigate } from '../../hooks';
+import { AuthApp } from '../../icons';
 import { LinkButtonWithDescription } from './LinkButtonWithDescription';
 import { UserProfileAccordion } from './UserProfileAccordion';
 
diff --git a/packages/clerk-js/src/ui/UserProfile/MfaTOTPPage.tsx b/packages/clerk-js/src/ui/components/UserProfile/MfaTOTPPage.tsx
similarity index 89%
rename from packages/clerk-js/src/ui/UserProfile/MfaTOTPPage.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/MfaTOTPPage.tsx
index 6082801ee5b..74d367d9b8f 100644
--- a/packages/clerk-js/src/ui/UserProfile/MfaTOTPPage.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/MfaTOTPPage.tsx
@@ -1,8 +1,8 @@
 import { TOTPResource } from '@clerk/types';
 import React from 'react';
 
-import { useWizard, Wizard } from '../common';
-import { withCardStateProvider } from '../elements';
+import { useWizard, Wizard } from '../../common';
+import { withCardStateProvider } from '../../elements';
 import { AddAuthenticatorApp } from './AddAuthenticatorApp';
 import { SuccessPage } from './SuccessPage';
 import { VerifyTOTP } from './VerifyTOTP';
diff --git a/packages/clerk-js/src/ui/UserProfile/Navbar.tsx b/packages/clerk-js/src/ui/components/UserProfile/Navbar.tsx
similarity index 95%
rename from packages/clerk-js/src/ui/UserProfile/Navbar.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/Navbar.tsx
index 4593d9cd5ab..63c6d65a9fb 100644
--- a/packages/clerk-js/src/ui/UserProfile/Navbar.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/Navbar.tsx
@@ -1,11 +1,11 @@
 import React from 'react';
 
-import { Button, Col, descriptors, Flex, Icon, localizationKeys, useLocalizations } from '../customizables';
-import { ElementDescriptor, ElementId } from '../customizables/elementDescriptors';
-import { usePopover, useSafeLayoutEffect } from '../hooks';
-import { Menu, TickShield, User } from '../icons';
-import { animations, mqu, PropsOfComponent } from '../styledSystem';
-import { colors, createContextAndHook } from '../utils';
+import { Button, Col, descriptors, Flex, Icon, localizationKeys, useLocalizations } from '../../customizables';
+import { ElementDescriptor, ElementId } from '../../customizables/elementDescriptors';
+import { usePopover, useSafeLayoutEffect } from '../../hooks';
+import { Menu, TickShield, User } from '../../icons';
+import { animations, mqu, PropsOfComponent } from '../../styledSystem';
+import { colors, createContextAndHook } from '../../utils';
 import { useNavigateToFlowStart } from './NavigateToFlowStartButton';
 
 type NavbarContextValue = { isOpen: boolean; open: () => void; close: () => void };
diff --git a/packages/clerk-js/src/ui/UserProfile/NavigateToFlowStartButton.tsx b/packages/clerk-js/src/ui/components/UserProfile/NavigateToFlowStartButton.tsx
similarity index 82%
rename from packages/clerk-js/src/ui/UserProfile/NavigateToFlowStartButton.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/NavigateToFlowStartButton.tsx
index 8aa24904d6d..ef631707bab 100644
--- a/packages/clerk-js/src/ui/UserProfile/NavigateToFlowStartButton.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/NavigateToFlowStartButton.tsx
@@ -1,8 +1,8 @@
 import React from 'react';
 
-import { useRouter } from '../router';
-import { Button } from '../customizables';
-import { PropsOfComponent } from '../styledSystem';
+import { Button } from '../../customizables';
+import { useRouter } from '../../router';
+import { PropsOfComponent } from '../../styledSystem';
 
 type NavigateToFlowStartButtonProps = PropsOfComponent<typeof Button>;
 
diff --git a/packages/clerk-js/src/ui/UserProfile/Page.tsx b/packages/clerk-js/src/ui/components/UserProfile/Page.tsx
similarity index 81%
rename from packages/clerk-js/src/ui/UserProfile/Page.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/Page.tsx
index ba5d3203315..ee4d45c8991 100644
--- a/packages/clerk-js/src/ui/UserProfile/Page.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/Page.tsx
@@ -1,8 +1,8 @@
 import React from 'react';
 
-import { Col, descriptors, LocalizationKey } from '../customizables';
-import { CardAlert, Header, useCardState } from '../elements';
-import { PropsOfComponent } from '../styledSystem';
+import { Col, descriptors, LocalizationKey } from '../../customizables';
+import { CardAlert, Header, useCardState } from '../../elements';
+import { PropsOfComponent } from '../../styledSystem';
 import { Breadcrumbs } from './Breadcrumbs';
 import { NavbarMenuButtonRow } from './Navbar';
 
diff --git a/packages/clerk-js/src/ui/UserProfile/PasswordPage.tsx b/packages/clerk-js/src/ui/components/UserProfile/PasswordPage.tsx
similarity index 88%
rename from packages/clerk-js/src/ui/UserProfile/PasswordPage.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/PasswordPage.tsx
index b0e47637f0c..5452c6de995 100644
--- a/packages/clerk-js/src/ui/UserProfile/PasswordPage.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/PasswordPage.tsx
@@ -1,10 +1,10 @@
 import React from 'react';
 
-import { useWizard, Wizard } from '../common';
-import { useCoreUser } from '../contexts';
-import { localizationKeys } from '../customizables';
-import { Form, useCardState, withCardStateProvider } from '../elements';
-import { handleError, useFormControl } from '../utils';
+import { useWizard, Wizard } from '../../common';
+import { useCoreUser } from '../../contexts';
+import { localizationKeys } from '../../customizables';
+import { Form, useCardState, withCardStateProvider } from '../../elements';
+import { handleError, useFormControl } from '../../utils';
 import { FormButtons } from './FormButtons';
 import { ContentPage } from './Page';
 import { SuccessPage } from './SuccessPage';
diff --git a/packages/clerk-js/src/ui/UserProfile/PasswordSection.tsx b/packages/clerk-js/src/ui/components/UserProfile/PasswordSection.tsx
similarity index 86%
rename from packages/clerk-js/src/ui/UserProfile/PasswordSection.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/PasswordSection.tsx
index 984b3330ee9..e72cdba9f11 100644
--- a/packages/clerk-js/src/ui/UserProfile/PasswordSection.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/PasswordSection.tsx
@@ -1,6 +1,6 @@
-import { useCoreUser } from '../contexts';
-import { localizationKeys, Text } from '../customizables';
-import { useNavigate } from '../hooks/useNavigate';
+import { useCoreUser } from '../../contexts';
+import { localizationKeys, Text } from '../../customizables';
+import { useNavigate } from '../../hooks/useNavigate';
 import { ProfileSection } from './Section';
 import { AddBlockButton } from './UserProfileBlockButtons';
 
diff --git a/packages/clerk-js/src/ui/UserProfile/PhonePage.tsx b/packages/clerk-js/src/ui/components/UserProfile/PhonePage.tsx
similarity index 90%
rename from packages/clerk-js/src/ui/UserProfile/PhonePage.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/PhonePage.tsx
index 1d6162070bb..d4a493de614 100644
--- a/packages/clerk-js/src/ui/UserProfile/PhonePage.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/PhonePage.tsx
@@ -1,12 +1,12 @@
 import { PhoneNumberResource } from '@clerk/types';
 import React from 'react';
 
-import { useWizard, Wizard } from '../common';
-import { useCoreUser } from '../contexts';
-import { Text } from '../customizables';
-import { Form, useCardState, withCardStateProvider } from '../elements';
-import { useRouter } from '../router';
-import { handleError, useFormControl } from '../utils';
+import { useWizard, Wizard } from '../../common';
+import { useCoreUser } from '../../contexts';
+import { Text } from '../../customizables';
+import { Form, useCardState, withCardStateProvider } from '../../elements';
+import { useRouter } from '../../router';
+import { handleError, useFormControl } from '../../utils';
 import { FormButtons } from './FormButtons';
 import { ContentPage } from './Page';
 import { SuccessPage } from './SuccessPage';
diff --git a/packages/clerk-js/src/ui/UserProfile/PhoneSection.tsx b/packages/clerk-js/src/ui/components/UserProfile/PhoneSection.tsx
similarity index 94%
rename from packages/clerk-js/src/ui/UserProfile/PhoneSection.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/PhoneSection.tsx
index 6bda8d525e5..4adc22c86a2 100644
--- a/packages/clerk-js/src/ui/UserProfile/PhoneSection.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/PhoneSection.tsx
@@ -1,11 +1,11 @@
 import { PhoneNumberResource } from '@clerk/types';
 import React from 'react';
 
-import { useCoreUser } from '../contexts';
-import { Badge, Col, localizationKeys, Text } from '../customizables';
-import { useCardState } from '../elements';
-import { useNavigate } from '../hooks';
-import { getFlagEmojiFromCountryIso, handleError, parsePhoneString, stringToFormattedPhoneString } from '../utils';
+import { useCoreUser } from '../../contexts';
+import { Badge, Col, localizationKeys, Text } from '../../customizables';
+import { useCardState } from '../../elements';
+import { useNavigate } from '../../hooks';
+import { getFlagEmojiFromCountryIso, handleError, parsePhoneString, stringToFormattedPhoneString } from '../../utils';
 import { LinkButtonWithDescription } from './LinkButtonWithDescription';
 import { ProfileSection } from './Section';
 import { UserProfileAccordion } from './UserProfileAccordion';
diff --git a/packages/clerk-js/src/ui/UserProfile/ProfilePage.tsx b/packages/clerk-js/src/ui/components/UserProfile/ProfilePage.tsx
similarity index 93%
rename from packages/clerk-js/src/ui/UserProfile/ProfilePage.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/ProfilePage.tsx
index 1d61d007774..871e837f1d1 100644
--- a/packages/clerk-js/src/ui/UserProfile/ProfilePage.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/ProfilePage.tsx
@@ -1,10 +1,10 @@
 import React from 'react';
 
-import { useWizard, Wizard } from '../common';
-import { useCoreUser, useEnvironment } from '../contexts';
-import { Button, Col, Flex, localizationKeys, Text } from '../customizables';
-import { Avatar, FileDropArea, Form, useCardState, withCardStateProvider } from '../elements';
-import { handleError, useFormControl } from '../utils';
+import { useWizard, Wizard } from '../../common';
+import { useCoreUser, useEnvironment } from '../../contexts';
+import { Button, Col, Flex, localizationKeys, Text } from '../../customizables';
+import { Avatar, FileDropArea, Form, useCardState, withCardStateProvider } from '../../elements';
+import { handleError, useFormControl } from '../../utils';
 import { FormButtons } from './FormButtons';
 import { ContentPage } from './Page';
 import { SuccessPage } from './SuccessPage';
diff --git a/packages/clerk-js/src/ui/UserProfile/RemoveResourcePage.tsx b/packages/clerk-js/src/ui/components/UserProfile/RemoveResourcePage.tsx
similarity index 93%
rename from packages/clerk-js/src/ui/UserProfile/RemoveResourcePage.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/RemoveResourcePage.tsx
index f4027674256..fadd42260de 100644
--- a/packages/clerk-js/src/ui/UserProfile/RemoveResourcePage.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/RemoveResourcePage.tsx
@@ -1,12 +1,12 @@
 import React from 'react';
 
-import { useWizard, Wizard } from '../common';
-import { useCoreUser } from '../contexts';
-import { Text } from '../customizables';
-import { Form, useCardState, withCardStateProvider } from '../elements';
-import { useEnabledThirdPartyProviders } from '../hooks';
-import { useRouter } from '../router';
-import { handleError } from '../utils';
+import { useWizard, Wizard } from '../../common';
+import { useCoreUser } from '../../contexts';
+import { Text } from '../../customizables';
+import { Form, useCardState, withCardStateProvider } from '../../elements';
+import { useEnabledThirdPartyProviders } from '../../hooks';
+import { useRouter } from '../../router';
+import { handleError } from '../../utils';
 import { FormButtons } from './FormButtons';
 import { ContentPage } from './Page';
 import { SuccessPage } from './SuccessPage';
diff --git a/packages/clerk-js/src/ui/UserProfile/RootPage.tsx b/packages/clerk-js/src/ui/components/UserProfile/RootPage.tsx
similarity index 89%
rename from packages/clerk-js/src/ui/UserProfile/RootPage.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/RootPage.tsx
index 71a1823f5d0..45307e54de8 100644
--- a/packages/clerk-js/src/ui/UserProfile/RootPage.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/RootPage.tsx
@@ -1,8 +1,8 @@
 import React from 'react';
 
-import { useEnvironment } from '../contexts';
-import { Col, descriptors, localizationKeys } from '../customizables';
-import { Header } from '../elements';
+import { useEnvironment } from '../../contexts';
+import { Col, descriptors, localizationKeys } from '../../customizables';
+import { Header } from '../../elements';
 import { ActiveDevicesSection } from './ActiveDevicesSection';
 import { ConnectedAccountsSection } from './ConnectedAccountsSection';
 import { EmailsSection } from './EmailSection';
@@ -16,13 +16,13 @@ import { getSecondFactors } from './utils';
 import { Web3Section } from './Web3Section';
 
 export const RootPage = () => {
-  const { attributes, social } = useEnvironment().userSettings;
+  const { attributes, social, instanceIsPasswordBased } = useEnvironment().userSettings;
   const showUsername = attributes.username.enabled;
   const showEmail = attributes.email_address.enabled;
   const showPhone = attributes.phone_number.enabled;
   const showConnectedAccounts = social && Object.values(social).filter(p => p.enabled).length > 0;
   const showWeb3 = attributes.web3_wallet.enabled;
-  const showPassword = attributes.password.enabled && attributes.password.required;
+  const showPassword = instanceIsPasswordBased;
   const showMfa = getSecondFactors(attributes).length > 0;
 
   return (
diff --git a/packages/clerk-js/src/ui/UserProfile/Section.tsx b/packages/clerk-js/src/ui/components/UserProfile/Section.tsx
similarity index 91%
rename from packages/clerk-js/src/ui/UserProfile/Section.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/Section.tsx
index 7a0a3d6d64b..831ab659aa1 100644
--- a/packages/clerk-js/src/ui/UserProfile/Section.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/Section.tsx
@@ -1,8 +1,8 @@
 import { ProfileSectionId } from '@clerk/types';
 
-import { Col, descriptors, Flex, LocalizationKey, Text } from '../customizables';
-import { ElementDescriptor, ElementId } from '../customizables/elementDescriptors';
-import { PropsOfComponent } from '../styledSystem';
+import { Col, descriptors, Flex, LocalizationKey, Text } from '../../customizables';
+import { ElementDescriptor, ElementId } from '../../customizables/elementDescriptors';
+import { PropsOfComponent } from '../../styledSystem';
 
 type ProfileSectionProps = Omit<PropsOfComponent<typeof Flex>, 'title'> & {
   title: LocalizationKey;
diff --git a/packages/clerk-js/src/ui/UserProfile/SuccessPage.tsx b/packages/clerk-js/src/ui/components/UserProfile/SuccessPage.tsx
similarity index 93%
rename from packages/clerk-js/src/ui/UserProfile/SuccessPage.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/SuccessPage.tsx
index 1aee4281959..033b7e9db7e 100644
--- a/packages/clerk-js/src/ui/UserProfile/SuccessPage.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/SuccessPage.tsx
@@ -1,6 +1,6 @@
 import React from 'react';
 
-import { LocalizationKey, localizationKeys, Text } from '../customizables';
+import { LocalizationKey, localizationKeys, Text } from '../../customizables';
 import { FormButtonContainer } from './FormButtons';
 import { MfaBackupCodeList } from './MfaBackupCodeList';
 import { NavigateToFlowStartButton } from './NavigateToFlowStartButton';
diff --git a/packages/clerk-js/src/ui/UserProfile/UserProfile.tsx b/packages/clerk-js/src/ui/components/UserProfile/UserProfile.tsx
similarity index 84%
rename from packages/clerk-js/src/ui/UserProfile/UserProfile.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/UserProfile.tsx
index e267dbf9513..be863a7a5b2 100644
--- a/packages/clerk-js/src/ui/UserProfile/UserProfile.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/UserProfile.tsx
@@ -1,11 +1,11 @@
 import { UserProfileProps } from '@clerk/types/src';
 import React from 'react';
 
-import { ComponentContext, withCoreUserGuard } from '../contexts';
-import { Route, Switch } from '../router';
-import { UserProfileCtx } from '../types';
-import { Flow } from '../customizables';
-import { UserProfileCard, withCardStateProvider } from '../elements';
+import { ComponentContext, withCoreUserGuard } from '../../contexts';
+import { Flow } from '../../customizables';
+import { UserProfileCard, withCardStateProvider } from '../../elements';
+import { Route, Switch } from '../../router';
+import { UserProfileCtx } from '../../types';
 import { Content } from './Content';
 import { NavBar, NavbarContextProvider } from './Navbar';
 import { VerificationSuccessPage } from './VerifyWithLink';
diff --git a/packages/clerk-js/src/ui/UserProfile/UserProfileAccordion.tsx b/packages/clerk-js/src/ui/components/UserProfile/UserProfileAccordion.tsx
similarity index 60%
rename from packages/clerk-js/src/ui/UserProfile/UserProfileAccordion.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/UserProfileAccordion.tsx
index eb84d73a089..eee7bd25cde 100644
--- a/packages/clerk-js/src/ui/UserProfile/UserProfileAccordion.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/UserProfileAccordion.tsx
@@ -1,6 +1,6 @@
-import { useUserProfileContext } from '../contexts';
-import { AccordionItem } from '../elements';
-import { PropsOfComponent } from '../styledSystem';
+import { useUserProfileContext } from '../../contexts';
+import { AccordionItem } from '../../elements';
+import { PropsOfComponent } from '../../styledSystem';
 
 export const UserProfileAccordion = (props: PropsOfComponent<typeof AccordionItem>) => {
   const isModal = useUserProfileContext().mode === 'modal';
diff --git a/packages/clerk-js/src/ui/UserProfile/UserProfileBlockButtons.tsx b/packages/clerk-js/src/ui/components/UserProfile/UserProfileBlockButtons.tsx
similarity index 80%
rename from packages/clerk-js/src/ui/UserProfile/UserProfileBlockButtons.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/UserProfileBlockButtons.tsx
index a361145a0ff..76b414ca723 100644
--- a/packages/clerk-js/src/ui/UserProfile/UserProfileBlockButtons.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/UserProfileBlockButtons.tsx
@@ -1,7 +1,7 @@
-import { descriptors, Icon } from '../customizables';
-import { ArrowBlockButton } from '../elements';
-import { Plus } from '../icons';
-import { PropsOfComponent } from '../styledSystem';
+import { descriptors, Icon } from '../../customizables';
+import { ArrowBlockButton } from '../../elements';
+import { Plus } from '../../icons';
+import { PropsOfComponent } from '../../styledSystem';
 
 type BlockButtonProps = PropsOfComponent<typeof ArrowBlockButton>;
 
diff --git a/packages/clerk-js/src/ui/UserProfile/UserProfileSection.tsx b/packages/clerk-js/src/ui/components/UserProfile/UserProfileSection.tsx
similarity index 78%
rename from packages/clerk-js/src/ui/UserProfile/UserProfileSection.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/UserProfileSection.tsx
index ff7d8b1c5e2..16d134dc1a1 100644
--- a/packages/clerk-js/src/ui/UserProfile/UserProfileSection.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/UserProfileSection.tsx
@@ -1,10 +1,10 @@
 import { UserResource } from '@clerk/types';
 import React from 'react';
 
-import { useCoreUser } from '../contexts';
-import { localizationKeys } from '../customizables';
-import { UserPreview } from '../elements';
-import { useNavigate } from '../hooks';
+import { useCoreUser } from '../../contexts';
+import { localizationKeys } from '../../customizables';
+import { UserPreview } from '../../elements';
+import { useNavigate } from '../../hooks';
 import { ProfileSection } from './Section';
 import { BlockButton } from './UserProfileBlockButtons';
 
diff --git a/packages/clerk-js/src/ui/UserProfile/UsernamePage.tsx b/packages/clerk-js/src/ui/components/UserProfile/UsernamePage.tsx
similarity index 83%
rename from packages/clerk-js/src/ui/UserProfile/UsernamePage.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/UsernamePage.tsx
index a94308eafca..0293e1617ef 100644
--- a/packages/clerk-js/src/ui/UserProfile/UsernamePage.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/UsernamePage.tsx
@@ -1,10 +1,10 @@
 import React from 'react';
 
-import { useWizard, Wizard } from '../common';
-import { useCoreUser } from '../contexts';
-import { localizationKeys } from '../customizables';
-import { Form, useCardState, withCardStateProvider } from '../elements';
-import { handleError, useFormControl } from '../utils';
+import { useWizard, Wizard } from '../../common';
+import { useCoreUser } from '../../contexts';
+import { localizationKeys } from '../../customizables';
+import { Form, useCardState, withCardStateProvider } from '../../elements';
+import { handleError, useFormControl } from '../../utils';
 import { FormButtons } from './FormButtons';
 import { ContentPage } from './Page';
 import { SuccessPage } from './SuccessPage';
diff --git a/packages/clerk-js/src/ui/UserProfile/UsernameSection.tsx b/packages/clerk-js/src/ui/components/UserProfile/UsernameSection.tsx
similarity index 85%
rename from packages/clerk-js/src/ui/UserProfile/UsernameSection.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/UsernameSection.tsx
index 86819722879..0da866ec351 100644
--- a/packages/clerk-js/src/ui/UserProfile/UsernameSection.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/UsernameSection.tsx
@@ -1,8 +1,8 @@
 import React from 'react';
 
-import { useCoreUser } from '../contexts';
-import { localizationKeys, Text } from '../customizables';
-import { useNavigate } from '../hooks/useNavigate';
+import { useCoreUser } from '../../contexts';
+import { localizationKeys, Text } from '../../customizables';
+import { useNavigate } from '../../hooks/useNavigate';
 import { ProfileSection } from './Section';
 import { AddBlockButton } from './UserProfileBlockButtons';
 
diff --git a/packages/clerk-js/src/ui/UserProfile/VerifyTOTP.tsx b/packages/clerk-js/src/ui/components/UserProfile/VerifyTOTP.tsx
similarity index 85%
rename from packages/clerk-js/src/ui/UserProfile/VerifyTOTP.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/VerifyTOTP.tsx
index a653f0734d3..b0f9e7f64e2 100644
--- a/packages/clerk-js/src/ui/UserProfile/VerifyTOTP.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/VerifyTOTP.tsx
@@ -1,12 +1,12 @@
 import { TOTPResource } from '@clerk/types';
 import React from 'react';
 
-import { useCoreUser } from '../contexts';
-import { Col } from '../customizables';
-import { useCardState, useCodeControl } from '../elements';
-import { CodeForm } from '../elements/CodeForm';
-import { useLoadingStatus } from '../hooks';
-import { handleError, sleep, useFormControl } from '../utils';
+import { useCoreUser } from '../../contexts';
+import { Col } from '../../customizables';
+import { useCardState, useCodeControl } from '../../elements';
+import { CodeForm } from '../../elements/CodeForm';
+import { useLoadingStatus } from '../../hooks';
+import { handleError, sleep, useFormControl } from '../../utils';
 import { FormButtonContainer } from './FormButtons';
 import { NavigateToFlowStartButton } from './NavigateToFlowStartButton';
 import { ContentPage } from './Page';
diff --git a/packages/clerk-js/src/ui/UserProfile/VerifyWithCode.tsx b/packages/clerk-js/src/ui/components/UserProfile/VerifyWithCode.tsx
similarity index 88%
rename from packages/clerk-js/src/ui/UserProfile/VerifyWithCode.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/VerifyWithCode.tsx
index c139263d9f4..da80b05a3e8 100644
--- a/packages/clerk-js/src/ui/UserProfile/VerifyWithCode.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/VerifyWithCode.tsx
@@ -1,11 +1,11 @@
 import { EmailAddressResource, PhoneNumberResource } from '@clerk/types';
 import React from 'react';
 
-import { localizationKeys } from '../customizables';
-import { useCardState, useCodeControl } from '../elements';
-import { CodeForm } from '../elements/CodeForm';
-import { useLoadingStatus } from '../hooks';
-import { handleError, sleep, useFormControl } from '../utils';
+import { localizationKeys } from '../../customizables';
+import { useCardState, useCodeControl } from '../../elements';
+import { CodeForm } from '../../elements/CodeForm';
+import { useLoadingStatus } from '../../hooks';
+import { handleError, sleep, useFormControl } from '../../utils';
 import { FormButtonContainer } from './FormButtons';
 import { NavigateToFlowStartButton } from './NavigateToFlowStartButton';
 
diff --git a/packages/clerk-js/src/ui/UserProfile/VerifyWithLink.tsx b/packages/clerk-js/src/ui/components/UserProfile/VerifyWithLink.tsx
similarity index 84%
rename from packages/clerk-js/src/ui/UserProfile/VerifyWithLink.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/VerifyWithLink.tsx
index 9c81432dbd1..f616bcf8f4d 100644
--- a/packages/clerk-js/src/ui/UserProfile/VerifyWithLink.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/VerifyWithLink.tsx
@@ -1,13 +1,13 @@
 import { EmailAddressResource } from '@clerk/types';
 import React from 'react';
 
-import { EmailLinkStatusCard } from '../common';
-import { buildMagicLinkRedirectUrl } from '../common/redirects';
-import { useEnvironment, useUserProfileContext } from '../contexts';
-import { localizationKeys } from '../customizables';
-import { useCardState, VerificationLink } from '../elements';
-import { useMagicLink } from '../hooks';
-import { handleError } from '../utils';
+import { EmailLinkStatusCard } from '../../common';
+import { buildMagicLinkRedirectUrl } from '../../common/redirects';
+import { useEnvironment, useUserProfileContext } from '../../contexts';
+import { localizationKeys } from '../../customizables';
+import { useCardState, VerificationLink } from '../../elements';
+import { useMagicLink } from '../../hooks';
+import { handleError } from '../../utils';
 import { FormButtonContainer } from './FormButtons';
 import { NavigateToFlowStartButton } from './NavigateToFlowStartButton';
 
diff --git a/packages/clerk-js/src/ui/UserProfile/Web3Page.tsx b/packages/clerk-js/src/ui/components/UserProfile/Web3Page.tsx
similarity index 92%
rename from packages/clerk-js/src/ui/UserProfile/Web3Page.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/Web3Page.tsx
index ba6ce6f26b7..52798313fec 100644
--- a/packages/clerk-js/src/ui/UserProfile/Web3Page.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/Web3Page.tsx
@@ -1,14 +1,14 @@
 import { Web3Strategy, Web3WalletResource } from '@clerk/types';
 import React from 'react';
 
-import { generateSignatureWithMetamask, getMetamaskIdentifier } from '../../utils/web3';
-import { useWizard, Wizard } from '../common';
-import { useCoreUser } from '../contexts';
-import { Col, descriptors, Image, Text } from '../customizables';
-import { ArrowBlockButton, useCardState, withCardStateProvider } from '../elements';
-import { useEnabledThirdPartyProviders } from '../hooks';
-import { useRouter } from '../router';
-import { getFieldError, handleError } from '../utils';
+import { generateSignatureWithMetamask, getMetamaskIdentifier } from '../../../utils/web3';
+import { useWizard, Wizard } from '../../common';
+import { useCoreUser } from '../../contexts';
+import { Col, descriptors, Image, Text } from '../../customizables';
+import { ArrowBlockButton, useCardState, withCardStateProvider } from '../../elements';
+import { useEnabledThirdPartyProviders } from '../../hooks';
+import { useRouter } from '../../router';
+import { getFieldError, handleError } from '../../utils';
 import { FormButtonContainer } from './FormButtons';
 import { NavigateToFlowStartButton } from './NavigateToFlowStartButton';
 import { ContentPage } from './Page';
diff --git a/packages/clerk-js/src/ui/UserProfile/Web3Section.tsx b/packages/clerk-js/src/ui/components/UserProfile/Web3Section.tsx
similarity index 90%
rename from packages/clerk-js/src/ui/UserProfile/Web3Section.tsx
rename to packages/clerk-js/src/ui/components/UserProfile/Web3Section.tsx
index f190912caa9..02bb7b74173 100644
--- a/packages/clerk-js/src/ui/UserProfile/Web3Section.tsx
+++ b/packages/clerk-js/src/ui/components/UserProfile/Web3Section.tsx
@@ -1,9 +1,9 @@
 import { Web3WalletResource } from '@clerk/types';
 
-import { useCoreUser } from '../contexts';
-import { Col, Flex, Image, localizationKeys } from '../customizables';
-import { useEnabledThirdPartyProviders } from '../hooks';
-import { useNavigate } from '../hooks/useNavigate';
+import { useCoreUser } from '../../contexts';
+import { Col, Flex, Image, localizationKeys } from '../../customizables';
+import { useEnabledThirdPartyProviders } from '../../hooks';
+import { useNavigate } from '../../hooks/useNavigate';
 import { LinkButtonWithDescription } from './LinkButtonWithDescription';
 import { ProfileSection } from './Section';
 import { UserProfileAccordion } from './UserProfileAccordion';
diff --git a/packages/clerk-js/src/ui/UserProfile/index.ts b/packages/clerk-js/src/ui/components/UserProfile/index.ts
similarity index 100%
rename from packages/clerk-js/src/ui/UserProfile/index.ts
rename to packages/clerk-js/src/ui/components/UserProfile/index.ts
diff --git a/packages/clerk-js/src/ui/UserProfile/utils.ts b/packages/clerk-js/src/ui/components/UserProfile/utils.ts
similarity index 100%
rename from packages/clerk-js/src/ui/UserProfile/utils.ts
rename to packages/clerk-js/src/ui/components/UserProfile/utils.ts

From 722658f223405150e69c094f6f0c73f1d09f1a05 Mon Sep 17 00:00:00 2001
From: Nikos Douvlis <nikosdouvlis@gmail.com>
Date: Mon, 10 Oct 2022 22:19:02 +0300
Subject: [PATCH 21/41] chore(clerk-js): Introduce OrganizationSwitcher file
 structure

---
 packages/clerk-js/src/ui/Components.tsx       |  3 +-
 .../OrganizationSwitcher.tsx                  | 46 +++++++++++++++++++
 .../components/OrganizationSwitcher/index.ts  |  1 +
 3 files changed, 49 insertions(+), 1 deletion(-)
 create mode 100644 packages/clerk-js/src/ui/components/OrganizationSwitcher/OrganizationSwitcher.tsx
 create mode 100644 packages/clerk-js/src/ui/components/OrganizationSwitcher/index.ts

diff --git a/packages/clerk-js/src/ui/Components.tsx b/packages/clerk-js/src/ui/Components.tsx
index b1d81282239..97a6f2cc97f 100644
--- a/packages/clerk-js/src/ui/Components.tsx
+++ b/packages/clerk-js/src/ui/Components.tsx
@@ -6,6 +6,7 @@ import ReactDOM from 'react-dom';
 
 import { PRESERVED_QUERYSTRING_PARAMS } from '../core/constants';
 import { clerkUIErrorDOMElementNotFound } from '../core/errors';
+import { OrganizationSwitcher } from './components/OrganizationSwitcher';
 import { SignIn, SignInModal } from './components/SignIn';
 import { SignUp, SignUpModal } from './components/SignUp';
 import { UserButton } from './components/UserButton';
@@ -56,8 +57,8 @@ const AvailableComponents = {
   SignUp,
   UserButton,
   UserProfile,
+  OrganizationSwitcher,
   OrganizationProfile: () => <div>hello from org profile</div>,
-  OrganizationSwitcher: () => <div>hello from org switcher</div>,
 };
 
 type AvailableComponentNames = keyof typeof AvailableComponents;
diff --git a/packages/clerk-js/src/ui/components/OrganizationSwitcher/OrganizationSwitcher.tsx b/packages/clerk-js/src/ui/components/OrganizationSwitcher/OrganizationSwitcher.tsx
new file mode 100644
index 00000000000..861d5d19666
--- /dev/null
+++ b/packages/clerk-js/src/ui/components/OrganizationSwitcher/OrganizationSwitcher.tsx
@@ -0,0 +1,46 @@
+import React from 'react';
+
+import { withCoreUserGuard } from '../../contexts';
+import { Flex, Flow } from '../../customizables';
+import { withCardStateProvider } from '../../elements';
+// import {Portal} from '../../elements/Portal';
+import { usePopover } from '../../hooks';
+// import {getFullName, getIdentifier} from '../../utils';
+
+const _OrganizationSwitcher = () => {
+  // const { defaultOpen } = useUserButtonContext();
+  const { floating, reference, styles, toggle, isOpen } = usePopover({
+    placement: 'bottom-end',
+    offset: 8,
+  });
+
+  return (
+    <Flow.Root flow='organizationSwitcher'>
+      <Flex
+        // elementDescriptor={descriptors.userButtonBox}
+        isOpen={isOpen}
+        align='center'
+        gap={2}
+      >
+        {/*<UserButtonTopLevelIdentifier />*/}
+        {/*<button*/}
+        {/*  ref={reference}*/}
+        {/*  onClick={toggle}>*/}
+        {/*  // isOpen={isOpen}>*/}
+        {/*  open me*/}
+        {/*</button>*/}
+        {/*<Portal>*/}
+        {/*  <div*/}
+        {/*    isOpen={isOpen}*/}
+        {/*    close={toggle}*/}
+        {/*    ref={floating}*/}
+        {/*    style={{ ...styles }}>*/}
+        {/*    hello*/}
+        {/*  </div>*/}
+        {/*</Portal>*/}
+      </Flex>
+    </Flow.Root>
+  );
+};
+
+export const OrganizationSwitcher = withCoreUserGuard(withCardStateProvider(_OrganizationSwitcher));
diff --git a/packages/clerk-js/src/ui/components/OrganizationSwitcher/index.ts b/packages/clerk-js/src/ui/components/OrganizationSwitcher/index.ts
new file mode 100644
index 00000000000..d2ce931b01c
--- /dev/null
+++ b/packages/clerk-js/src/ui/components/OrganizationSwitcher/index.ts
@@ -0,0 +1 @@
+export * from './OrganizationSwitcher';

From e7498c82a7539da20ccc84679b9d5cc8a97fe56f Mon Sep 17 00:00:00 2001
From: Nikos Douvlis <nikosdouvlis@gmail.com>
Date: Mon, 10 Oct 2022 22:21:39 +0300
Subject: [PATCH 22/41] chore(clerk-js): Introduce OrganizationProfile file
 structure

---
 packages/clerk-js/src/ui/Components.tsx       |  3 +-
 .../OrganizationProfile.tsx                   | 54 +++++++++++++++++++
 .../components/OrganizationProfile/index.ts   |  1 +
 3 files changed, 57 insertions(+), 1 deletion(-)
 create mode 100644 packages/clerk-js/src/ui/components/OrganizationProfile/OrganizationProfile.tsx
 create mode 100644 packages/clerk-js/src/ui/components/OrganizationProfile/index.ts

diff --git a/packages/clerk-js/src/ui/Components.tsx b/packages/clerk-js/src/ui/Components.tsx
index 97a6f2cc97f..6f1cdafcba5 100644
--- a/packages/clerk-js/src/ui/Components.tsx
+++ b/packages/clerk-js/src/ui/Components.tsx
@@ -6,6 +6,7 @@ import ReactDOM from 'react-dom';
 
 import { PRESERVED_QUERYSTRING_PARAMS } from '../core/constants';
 import { clerkUIErrorDOMElementNotFound } from '../core/errors';
+import { OrganizationProfile } from './components/OrganizationProfile';
 import { OrganizationSwitcher } from './components/OrganizationSwitcher';
 import { SignIn, SignInModal } from './components/SignIn';
 import { SignUp, SignUpModal } from './components/SignUp';
@@ -58,7 +59,7 @@ const AvailableComponents = {
   UserButton,
   UserProfile,
   OrganizationSwitcher,
-  OrganizationProfile: () => <div>hello from org profile</div>,
+  OrganizationProfile,
 };
 
 type AvailableComponentNames = keyof typeof AvailableComponents;
diff --git a/packages/clerk-js/src/ui/components/OrganizationProfile/OrganizationProfile.tsx b/packages/clerk-js/src/ui/components/OrganizationProfile/OrganizationProfile.tsx
new file mode 100644
index 00000000000..1c9df5e9a73
--- /dev/null
+++ b/packages/clerk-js/src/ui/components/OrganizationProfile/OrganizationProfile.tsx
@@ -0,0 +1,54 @@
+import { UserProfileProps } from '@clerk/types/src';
+import React from 'react';
+
+import { Flow } from '../../customizables';
+import { withCardStateProvider } from '../../elements';
+import { Route, Switch } from '../../router';
+
+const _OrganizationProfile = (_: UserProfileProps) => {
+  return (
+    <Flow.Root flow='organizationProfile'>
+      <Flow.Part>
+        <Switch>
+          {/* PublicRoutes */}
+          <Route path='verify'>{/*<VerificationSuccessPage />*/}</Route>
+          <Route>{/*<AuthenticatedRoutes />*/}</Route>
+        </Switch>
+      </Flow.Part>
+    </Flow.Root>
+  );
+};
+
+// const AuthenticatedRoutes = withCoreUserGuard(() => {
+//   const contentRef = React.useRef<HTMLDivElement>(null);
+//   return (
+//     <UserProfileCard sx={{ height: '100%' }}>
+//       <NavbarContextProvider>
+//         <NavBar contentRef={contentRef} />
+//         <Content ref={contentRef} />
+//       </NavbarContextProvider>
+//     </UserProfileCard>
+//   );
+// });
+
+export const OrganizationProfile = withCardStateProvider(_OrganizationProfile);
+//
+// export const UserProfileModal = (props: UserProfileProps): JSX.Element => {
+//   const userProfileProps: UserProfileCtx = {
+//     ...props,
+//     routing: 'virtual',
+//     componentName: 'OrganizationProfile',
+//     mode: 'modal',
+//   };
+//
+//   return (
+//     <Route path='user'>
+//       <ComponentContext.Provider value={userProfileProps}>
+//         {/*TODO: Used by InvisibleRootBox, can we simplify? */}
+//         <div>
+//           <OrganizationProfile {...userProfileProps} />
+//         </div>
+//       </ComponentContext.Provider>
+//     </Route>
+//   );
+// };
diff --git a/packages/clerk-js/src/ui/components/OrganizationProfile/index.ts b/packages/clerk-js/src/ui/components/OrganizationProfile/index.ts
new file mode 100644
index 00000000000..98a8862a2e4
--- /dev/null
+++ b/packages/clerk-js/src/ui/components/OrganizationProfile/index.ts
@@ -0,0 +1 @@
+export * from './OrganizationProfile';

From 1262f1bfacd10df0a292fe0250b8843729aa1162 Mon Sep 17 00:00:00 2001
From: George Desipris <73396808+desiprisg@users.noreply.github.com>
Date: Wed, 12 Oct 2022 13:30:25 +0300
Subject: [PATCH 23/41] feat(clerk-js): Replace Switch Account text with icon

---
 .../UserButton/OtherSessionActions.tsx        | 24 +++++++++----------
 1 file changed, 11 insertions(+), 13 deletions(-)

diff --git a/packages/clerk-js/src/ui/components/UserButton/OtherSessionActions.tsx b/packages/clerk-js/src/ui/components/UserButton/OtherSessionActions.tsx
index 5794add6eb9..0e2f2f6196a 100644
--- a/packages/clerk-js/src/ui/components/UserButton/OtherSessionActions.tsx
+++ b/packages/clerk-js/src/ui/components/UserButton/OtherSessionActions.tsx
@@ -1,9 +1,10 @@
 import React from 'react';
 
-import { Button, Flex, Text } from '../../customizables';
+import { Button, Flex, Icon } from '../../customizables';
 import { UserPreview, UserPreviewProps } from '../../elements';
 import { useCardState } from '../../elements/contexts';
-import { mqu, PropsOfComponent } from '../../styledSystem';
+import { SwitchArrows } from '../../icons';
+import { PropsOfComponent } from '../../styledSystem';
 import { Actions } from './CurrentAccountActions';
 
 export const SessionActions = (props: PropsOfComponent<typeof Flex>) => {
@@ -38,6 +39,9 @@ export const UserPreviewButton = (props: UserPreviewButtonProps) => {
           borderRadius: 0,
           justifyContent: 'space-between',
           padding: `${theme.space.$3} ${theme.space.$6}`,
+          ':hover > svg': {
+            visibility: 'initial',
+          },
         }),
         rest.sx,
       ]}
@@ -46,17 +50,11 @@ export const UserPreviewButton = (props: UserPreviewButtonProps) => {
         user={user}
         size='sm'
       />
-      <Text
-        variant='smallRegular'
-        sx={t => ({
-          [mqu.xs]: {
-            display: 'none',
-          },
-          color: t.colors.$blackAlpha500,
-        })}
-      >
-        Switch account
-      </Text>
+
+      <Icon
+        icon={SwitchArrows}
+        sx={t => ({ color: t.colors.$blackAlpha500, marginLeft: t.space.$2, visibility: 'hidden' })}
+      />
     </Button>
   );
 };

From cb56f5c0313ba6f1fce50eae6fc3e3d596cf1b16 Mon Sep 17 00:00:00 2001
From: George Desipris <73396808+desiprisg@users.noreply.github.com>
Date: Wed, 12 Oct 2022 14:00:44 +0300
Subject: [PATCH 24/41] feat(clerk-js): Add table and pagination elements

* feat(clerk-js): Add first table primitives

* fix(clerk-js): Fix the row spacing in the Table primitive

* feat(clerk-js): First iteration of Pagination component

* feat(clerk-js): Add usePagination hook

* chore(clerk-js): Change names of Thead and Tbody components

* feat(clerk-js,types): Add localization to Pagination component

* refactor(clerk-js): Clean up the Table and Pagination components

* refactor(clerk-js): Small code cleanup in Pagination component

* fix(clerk-js): Fix by-one error in sibling calculations for Pagination
---
 .../clerk-js/src/ui/customizables/index.ts    |   8 +
 .../clerk-js/src/ui/elements/Pagination.tsx   | 170 ++++++++++++++++++
 packages/clerk-js/src/ui/elements/index.ts    |   1 +
 .../ui/localization/defaultEnglishResource.ts |   4 +
 packages/clerk-js/src/ui/primitives/Table.tsx |  36 ++++
 packages/clerk-js/src/ui/primitives/Tbody.tsx |  16 ++
 packages/clerk-js/src/ui/primitives/Td.tsx    |  16 ++
 packages/clerk-js/src/ui/primitives/Th.tsx    |  27 +++
 packages/clerk-js/src/ui/primitives/Thead.tsx |  16 ++
 packages/clerk-js/src/ui/primitives/Tr.tsx    |  16 ++
 packages/clerk-js/src/ui/primitives/index.ts  |   6 +
 .../clerk-js/src/ui/styledSystem/types.ts     |   6 +
 packages/clerk-js/src/ui/utils/index.ts       |   1 +
 packages/clerk-js/src/ui/utils/range.ts       |   1 +
 packages/types/src/localization.ts            |   4 +
 15 files changed, 328 insertions(+)
 create mode 100644 packages/clerk-js/src/ui/elements/Pagination.tsx
 create mode 100644 packages/clerk-js/src/ui/primitives/Table.tsx
 create mode 100644 packages/clerk-js/src/ui/primitives/Tbody.tsx
 create mode 100644 packages/clerk-js/src/ui/primitives/Td.tsx
 create mode 100644 packages/clerk-js/src/ui/primitives/Th.tsx
 create mode 100644 packages/clerk-js/src/ui/primitives/Thead.tsx
 create mode 100644 packages/clerk-js/src/ui/primitives/Tr.tsx
 create mode 100644 packages/clerk-js/src/ui/utils/range.ts

diff --git a/packages/clerk-js/src/ui/customizables/index.ts b/packages/clerk-js/src/ui/customizables/index.ts
index e5f91aa05a4..c8d49466ca5 100644
--- a/packages/clerk-js/src/ui/customizables/index.ts
+++ b/packages/clerk-js/src/ui/customizables/index.ts
@@ -11,6 +11,7 @@ export { localizationKeys, useLocalizations } from '../localization';
 export type { LocalizationKey } from '../localization';
 export { generateFlowPartClassname } from './classGeneration';
 
+export const Box = makeCustomizable(sanitizeDomProps(Primitives.Box));
 export const Flex = makeCustomizable(sanitizeDomProps(Primitives.Flex));
 export const Col = makeCustomizable(sanitizeDomProps(Primitives.Col));
 export const Grid = makeCustomizable(sanitizeDomProps(Primitives.Grid));
@@ -36,3 +37,10 @@ export const Spinner = makeCustomizable(sanitizeDomProps(Primitives.Spinner));
 export const Badge = makeCustomizable(makeLocalizable(sanitizeDomProps(Primitives.Badge)), {
   defaultDescriptor: descriptors.badge,
 });
+
+export const Table = makeCustomizable(sanitizeDomProps(Primitives.Table));
+export const Thead = makeCustomizable(sanitizeDomProps(Primitives.Thead));
+export const Tbody = makeCustomizable(sanitizeDomProps(Primitives.Tbody));
+export const Tr = makeCustomizable(sanitizeDomProps(Primitives.Tr));
+export const Th = makeCustomizable(sanitizeDomProps(Primitives.Th));
+export const Td = makeCustomizable(sanitizeDomProps(Primitives.Td));
diff --git a/packages/clerk-js/src/ui/elements/Pagination.tsx b/packages/clerk-js/src/ui/elements/Pagination.tsx
new file mode 100644
index 00000000000..3539a4cbea4
--- /dev/null
+++ b/packages/clerk-js/src/ui/elements/Pagination.tsx
@@ -0,0 +1,170 @@
+import React, { useState } from 'react';
+
+import { Button, Flex, localizationKeys, Text } from '../customizables';
+import { PropsOfComponent } from '../styledSystem';
+import { range } from '../utils';
+
+type UsePaginationProps = {
+  defaultPage?: number;
+};
+
+export const usePagination = (props?: UsePaginationProps) => {
+  const { defaultPage = 1 } = props || {};
+  const [page, setPage] = useState(defaultPage);
+
+  return { page, changePage: setPage };
+};
+
+const PageButton = (props: PropsOfComponent<typeof Button> & { isActive?: boolean }) => {
+  const { sx, isActive, ...rest } = props;
+
+  return (
+    <Button
+      size='xs'
+      variant='ghost'
+      colorScheme='neutral'
+      sx={t => [
+        {
+          color: isActive ? t.colors.$black : t.colors.$blackAlpha700,
+        },
+        sx,
+      ]}
+      {...rest}
+    />
+  );
+};
+
+type RowInfo = {
+  startingRow: number;
+  endingRow: number;
+  allRowsCount: number;
+};
+
+type RowInfoProps = {
+  rowInfo: RowInfo;
+};
+
+const RowInformation = (props: RowInfoProps) => {
+  const {
+    rowInfo: { startingRow, endingRow, allRowsCount },
+  } = props;
+
+  return (
+    <Text>
+      <Text
+        as='span'
+        sx={t => ({
+          color: t.colors.$blackAlpha700,
+        })}
+        localizationKey={localizationKeys('paginationRowText__displaying')}
+      />{' '}
+      <Text as='span'>
+        {startingRow} - {endingRow}
+      </Text>{' '}
+      <Text
+        as='span'
+        sx={t => ({
+          color: t.colors.$blackAlpha700,
+        })}
+        localizationKey={localizationKeys('paginationRowText__of')}
+      />{' '}
+      <Text
+        as='span'
+        sx={t => ({
+          color: t.colors.$blackAlpha700,
+        })}
+      >
+        {allRowsCount}
+      </Text>
+    </Text>
+  );
+};
+
+const shouldShowPageButton = (currentPage: number, pageToShow: number, siblingCount: number, pageCount: number) => {
+  return Math.abs(currentPage - pageToShow) <= siblingCount || pageToShow === pageCount || pageToShow === 1;
+};
+
+const shouldShowDots = (currentPage: number, pageToShow: number, siblingCount: number) => {
+  return Math.abs(currentPage - pageToShow) === siblingCount + 1;
+};
+
+const ThreeDots = () => (
+  <Flex center>
+    <Text
+      sx={t => ({
+        color: t.colors.$blackAlpha500,
+      })}
+    >
+      ...
+    </Text>
+  </Flex>
+);
+
+type PaginationProps = {
+  page: number;
+  count: number;
+  rowInfo?: {
+    startingRow: number;
+    endingRow: number;
+    allRowsCount: number;
+  };
+  siblingCount?: number;
+  onChange?: (page: number) => void;
+};
+
+export const Pagination = (props: PaginationProps) => {
+  const { page, count, rowInfo, siblingCount = 1, onChange } = props;
+
+  return (
+    <Flex
+      justify={rowInfo ? 'between' : 'center'}
+      align='center'
+      sx={t => ({
+        fontSize: t.fontSizes.$xs,
+        '*': {
+          fontSize: 'inherit',
+        },
+      })}
+    >
+      {rowInfo && <RowInformation rowInfo={rowInfo} />}
+
+      <Flex gap={2}>
+        <PageButton
+          isDisabled={page === 1}
+          localizationKey={localizationKeys('paginationButton__previous')}
+          onClick={() => {
+            onChange?.(page - 1);
+          }}
+        />
+        {range(1, count).map(p => {
+          if (shouldShowPageButton(page, p, siblingCount, count)) {
+            return (
+              <PageButton
+                key={p}
+                isActive={p === page}
+                onClick={() => {
+                  onChange?.(p);
+                }}
+              >
+                {p}
+              </PageButton>
+            );
+          }
+
+          if (shouldShowDots(page, p, siblingCount)) {
+            return <ThreeDots key={p} />;
+          }
+
+          return null;
+        })}
+        <PageButton
+          isDisabled={page === count}
+          localizationKey={localizationKeys('paginationButton__next')}
+          onClick={() => {
+            onChange?.(page + 1);
+          }}
+        />
+      </Flex>
+    </Flex>
+  );
+};
diff --git a/packages/clerk-js/src/ui/elements/index.ts b/packages/clerk-js/src/ui/elements/index.ts
index 171b2bb169f..1ff6778edf4 100644
--- a/packages/clerk-js/src/ui/elements/index.ts
+++ b/packages/clerk-js/src/ui/elements/index.ts
@@ -27,5 +27,6 @@ export * from './RootBox';
 export * from './InvisibleRootBox';
 export * from './ClipboardInput';
 export * from './TileButton';
+export * from './Pagination';
 export * from './FullHeightLoader';
 export * from './Tabs';
diff --git a/packages/clerk-js/src/ui/localization/defaultEnglishResource.ts b/packages/clerk-js/src/ui/localization/defaultEnglishResource.ts
index 2ef5c018b93..0a93a1dd1e2 100644
--- a/packages/clerk-js/src/ui/localization/defaultEnglishResource.ts
+++ b/packages/clerk-js/src/ui/localization/defaultEnglishResource.ts
@@ -55,6 +55,10 @@ export const defaultResource: DeepRequired<LocalizationResource> = {
   footerPageLink__help: 'Help',
   footerPageLink__privacy: 'Privacy',
   footerPageLink__terms: 'Terms',
+  paginationButton__previous: 'Previous',
+  paginationButton__next: 'Next',
+  paginationRowText__displaying: 'Displaying',
+  paginationRowText__of: 'of',
   signUp: {
     start: {
       title: 'Create your account',
diff --git a/packages/clerk-js/src/ui/primitives/Table.tsx b/packages/clerk-js/src/ui/primitives/Table.tsx
new file mode 100644
index 00000000000..a53950aced6
--- /dev/null
+++ b/packages/clerk-js/src/ui/primitives/Table.tsx
@@ -0,0 +1,36 @@
+import React from 'react';
+
+import { createVariants, PrimitiveProps, StyleVariants } from '../styledSystem';
+import { Box, BoxProps } from './Box';
+
+const { applyVariants, filterProps } = createVariants(theme => {
+  return {
+    base: {
+      borderCollapse: 'collapse',
+      'td:not(:first-of-type)': {
+        paddingLeft: theme.sizes.$2,
+      },
+      'th:not(:first-of-type)': {
+        paddingLeft: theme.sizes.$2,
+      },
+      'tr:not(:last-of-type)>td': {
+        paddingBottom: theme.sizes.$2,
+      },
+      width: '100%',
+    },
+    variants: {},
+  };
+});
+
+export type TableProps = PrimitiveProps<'table'> & Omit<BoxProps, 'as'> & StyleVariants<typeof applyVariants>;
+
+export const Table = React.forwardRef<HTMLTableCellElement, TableProps>((props, ref) => {
+  return (
+    <Box
+      as='table'
+      {...filterProps(props)}
+      css={applyVariants(props)}
+      ref={ref}
+    />
+  );
+});
diff --git a/packages/clerk-js/src/ui/primitives/Tbody.tsx b/packages/clerk-js/src/ui/primitives/Tbody.tsx
new file mode 100644
index 00000000000..f47f6107708
--- /dev/null
+++ b/packages/clerk-js/src/ui/primitives/Tbody.tsx
@@ -0,0 +1,16 @@
+import React from 'react';
+
+import { PrimitiveProps } from '../styledSystem';
+import { Box, BoxProps } from './Box';
+
+export type TbodyProps = PrimitiveProps<'tbody'> & Omit<BoxProps, 'as'>;
+
+export const Tbody = React.forwardRef<HTMLTableSectionElement, TbodyProps>((props, ref) => {
+  return (
+    <Box
+      as='tbody'
+      {...props}
+      ref={ref}
+    />
+  );
+});
diff --git a/packages/clerk-js/src/ui/primitives/Td.tsx b/packages/clerk-js/src/ui/primitives/Td.tsx
new file mode 100644
index 00000000000..5dd1233afbe
--- /dev/null
+++ b/packages/clerk-js/src/ui/primitives/Td.tsx
@@ -0,0 +1,16 @@
+import React from 'react';
+
+import { PrimitiveProps } from '../styledSystem';
+import { Box, BoxProps } from './Box';
+
+export type TdProps = PrimitiveProps<'td'> & Omit<BoxProps, 'as'>;
+
+export const Td = React.forwardRef<HTMLTableCellElement, TdProps>((props, ref) => {
+  return (
+    <Box
+      as='td'
+      {...props}
+      ref={ref}
+    />
+  );
+});
diff --git a/packages/clerk-js/src/ui/primitives/Th.tsx b/packages/clerk-js/src/ui/primitives/Th.tsx
new file mode 100644
index 00000000000..95a00f698c4
--- /dev/null
+++ b/packages/clerk-js/src/ui/primitives/Th.tsx
@@ -0,0 +1,27 @@
+import React from 'react';
+
+import { createVariants, PrimitiveProps, StyleVariants } from '../styledSystem';
+import { Box, BoxProps } from './Box';
+
+const { applyVariants, filterProps } = createVariants(theme => ({
+  base: {
+    textAlign: 'left',
+    fontWeight: theme.fontWeights.$medium,
+    borderBottom: theme.borders.$normal,
+    borderColor: theme.colors.$blackAlpha300,
+  },
+  variants: {},
+}));
+
+export type ThProps = PrimitiveProps<'th'> & Omit<BoxProps, 'as'> & StyleVariants<typeof applyVariants>;
+
+export const Th = React.forwardRef<HTMLTableCellElement, ThProps>((props, ref) => {
+  return (
+    <Box
+      as='th'
+      {...filterProps(props)}
+      css={applyVariants(props)}
+      ref={ref}
+    />
+  );
+});
diff --git a/packages/clerk-js/src/ui/primitives/Thead.tsx b/packages/clerk-js/src/ui/primitives/Thead.tsx
new file mode 100644
index 00000000000..e7500957807
--- /dev/null
+++ b/packages/clerk-js/src/ui/primitives/Thead.tsx
@@ -0,0 +1,16 @@
+import React from 'react';
+
+import { PrimitiveProps } from '../styledSystem';
+import { Box, BoxProps } from './Box';
+
+export type TheadProps = PrimitiveProps<'thead'> & Omit<BoxProps, 'as'>;
+
+export const Thead = React.forwardRef<HTMLTableSectionElement, TheadProps>((props, ref) => {
+  return (
+    <Box
+      as='thead'
+      {...props}
+      ref={ref}
+    />
+  );
+});
diff --git a/packages/clerk-js/src/ui/primitives/Tr.tsx b/packages/clerk-js/src/ui/primitives/Tr.tsx
new file mode 100644
index 00000000000..f715653e5ff
--- /dev/null
+++ b/packages/clerk-js/src/ui/primitives/Tr.tsx
@@ -0,0 +1,16 @@
+import React from 'react';
+
+import { PrimitiveProps } from '../styledSystem';
+import { Box, BoxProps } from './Box';
+
+export type TrProps = PrimitiveProps<'tr'> & Omit<BoxProps, 'as'>;
+
+export const Tr = React.forwardRef<HTMLTableCellElement, TrProps>((props, ref) => {
+  return (
+    <Box
+      as='tr'
+      {...props}
+      ref={ref}
+    />
+  );
+});
diff --git a/packages/clerk-js/src/ui/primitives/index.ts b/packages/clerk-js/src/ui/primitives/index.ts
index 36b01bf78e8..ef56c1ae2b3 100644
--- a/packages/clerk-js/src/ui/primitives/index.ts
+++ b/packages/clerk-js/src/ui/primitives/index.ts
@@ -17,3 +17,9 @@ export * from './FormLabel';
 export * from './Form';
 export * from './Icon';
 export * from './Badge';
+export * from './Table';
+export * from './Thead';
+export * from './Tbody';
+export * from './Tr';
+export * from './Th';
+export * from './Td';
diff --git a/packages/clerk-js/src/ui/styledSystem/types.ts b/packages/clerk-js/src/ui/styledSystem/types.ts
index 0b1c2321b07..2ee2d962a13 100644
--- a/packages/clerk-js/src/ui/styledSystem/types.ts
+++ b/packages/clerk-js/src/ui/styledSystem/types.ts
@@ -25,6 +25,12 @@ type ElementProps = {
   label: JSX.IntrinsicElements['label'];
   img: JSX.IntrinsicElements['img'];
   form: JSX.IntrinsicElements['form'];
+  table: JSX.IntrinsicElements['table'];
+  thead: JSX.IntrinsicElements['thead'];
+  tbody: JSX.IntrinsicElements['tbody'];
+  th: JSX.IntrinsicElements['th'];
+  tr: JSX.IntrinsicElements['tr'];
+  td: JSX.IntrinsicElements['td'];
 };
 
 /**
diff --git a/packages/clerk-js/src/ui/utils/index.ts b/packages/clerk-js/src/ui/utils/index.ts
index 0095a568534..6f39f3c52eb 100644
--- a/packages/clerk-js/src/ui/utils/index.ts
+++ b/packages/clerk-js/src/ui/utils/index.ts
@@ -15,4 +15,5 @@ export * from './getIdentifier';
 export * from './readObjectPath';
 export * from './useFormControl';
 export * from './errorHandler';
+export * from './range';
 export * from './getValidReactChildren';
diff --git a/packages/clerk-js/src/ui/utils/range.ts b/packages/clerk-js/src/ui/utils/range.ts
new file mode 100644
index 00000000000..5ef7ae1c5e6
--- /dev/null
+++ b/packages/clerk-js/src/ui/utils/range.ts
@@ -0,0 +1 @@
+export const range = (min: number, max: number) => Array.from({ length: max - min + 1 }, (_, i) => min + i);
diff --git a/packages/types/src/localization.ts b/packages/types/src/localization.ts
index 50e0fe85bdf..06df00b5d46 100644
--- a/packages/types/src/localization.ts
+++ b/packages/types/src/localization.ts
@@ -55,6 +55,10 @@ type _LocalizationResource = {
   footerPageLink__help: LocalizationValue;
   footerPageLink__privacy: LocalizationValue;
   footerPageLink__terms: LocalizationValue;
+  paginationButton__previous: LocalizationValue;
+  paginationButton__next: LocalizationValue;
+  paginationRowText__displaying: LocalizationValue;
+  paginationRowText__of: LocalizationValue;
   signUp: {
     start: {
       title: LocalizationValue;

From f4b4586816734a97a06bc7a9ee1c12f728973daa Mon Sep 17 00:00:00 2001
From: George Desipris <73396808+desiprisg@users.noreply.github.com>
Date: Wed, 12 Oct 2022 15:56:45 +0300
Subject: [PATCH 25/41] feat(clerk-js): Introduce Menu element

* feat(clerk-js): Introduce Menu element

* fix(clerk-js): Prevent default on key down in Menu component

* refactor(clerk-js): Replace MenuButton with MenuTrigger

* fix(clerk-js): Compose onClick handlers in MenuTrigger
---
 packages/clerk-js/src/ui/elements/Menu.tsx    | 181 ++++++++++++++++++
 packages/clerk-js/src/ui/elements/index.ts    |   1 +
 .../clerk-js/src/ui/foundations/zIndices.ts   |   1 +
 packages/clerk-js/src/ui/hooks/usePopover.ts  |   2 +
 4 files changed, 185 insertions(+)
 create mode 100644 packages/clerk-js/src/ui/elements/Menu.tsx

diff --git a/packages/clerk-js/src/ui/elements/Menu.tsx b/packages/clerk-js/src/ui/elements/Menu.tsx
new file mode 100644
index 00000000000..03851628c6a
--- /dev/null
+++ b/packages/clerk-js/src/ui/elements/Menu.tsx
@@ -0,0 +1,181 @@
+import React, { cloneElement, isValidElement, PropsWithChildren, useEffect, useRef } from 'react';
+
+import { createContextAndHook } from '../../ui/utils';
+import { Button, Col } from '../customizables';
+import { usePopover, UsePopoverReturn } from '../hooks';
+import { animations, PropsOfComponent } from '../styledSystem';
+import { colors } from '../utils/colors';
+import { Portal } from './Portal';
+
+type MenuState = {
+  popoverCtx: UsePopoverReturn;
+};
+
+const [MenuStateCtx, useMenuState] = createContextAndHook<MenuState>('MenuState');
+
+type MenuProps = PropsWithChildren<Record<never, never>>;
+
+export const Menu = (props: MenuProps) => {
+  const popoverCtx = usePopover({
+    placement: 'right-start',
+    offset: 8,
+  });
+
+  const value = React.useMemo(() => ({ value: { popoverCtx } }), [{ ...popoverCtx }]);
+
+  return (
+    <MenuStateCtx.Provider
+      value={value}
+      {...props}
+    />
+  );
+};
+
+type MenuTriggerProps = React.PropsWithChildren<Record<never, never>>;
+
+export const MenuTrigger = (props: MenuTriggerProps) => {
+  const { children } = props;
+  const { popoverCtx } = useMenuState();
+  const { reference, toggle } = popoverCtx;
+
+  if (!isValidElement(children)) {
+    return null;
+  }
+
+  return cloneElement(children, {
+    ref: reference,
+    onClick: (e: React.MouseEvent) => {
+      children.props?.onClick?.(e);
+      toggle();
+    },
+  });
+};
+
+const findMenuItem = (el: Element, siblingType: 'prev' | 'next', options?: { countSelf?: boolean }) => {
+  let tagName = options?.countSelf ? el.tagName : '';
+  let sibling: Element | null = el;
+  while (sibling && tagName.toUpperCase() !== 'BUTTON') {
+    sibling = sibling[siblingType === 'prev' ? 'previousElementSibling' : 'nextElementSibling'];
+    tagName = sibling?.tagName ?? '';
+  }
+  return sibling;
+};
+
+type MenuListProps = PropsOfComponent<typeof Col>;
+
+export const MenuList = (props: MenuListProps) => {
+  const { sx, ...rest } = props;
+  const { popoverCtx } = useMenuState();
+  const { floating, styles, isOpen } = popoverCtx;
+  const containerRef = useRef<HTMLDivElement>(null);
+
+  useEffect(() => {
+    const current = containerRef.current;
+    floating(current);
+    current?.focus();
+  }, [isOpen]);
+
+  const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {
+    const current = containerRef.current;
+    if (!current) {
+      return;
+    }
+
+    if (current !== document.activeElement) {
+      return;
+    }
+
+    if (e.key === 'ArrowDown') {
+      e.preventDefault();
+      return (findMenuItem(current.children[0], 'next', { countSelf: true }) as HTMLElement)?.focus();
+    }
+  };
+
+  if (!isOpen) {
+    return null;
+  }
+
+  return (
+    <Portal>
+      <Col
+        ref={containerRef}
+        role='menu'
+        onKeyDown={onKeyDown}
+        tabIndex={0}
+        sx={[
+          theme => ({
+            backgroundColor: colors.makeSolid(theme.colors.$colorBackground),
+            border: theme.borders.$normal,
+            outline: 'none',
+            borderRadius: theme.radii.$lg,
+            borderColor: theme.colors.$blackAlpha200,
+            paddingTop: theme.space.$2,
+            paddingBottom: theme.space.$2,
+            overflow: 'hidden',
+            top: `calc(100% + ${theme.space.$2})`,
+            animation: `${animations.dropdownSlideInScaleAndFade} ${theme.transitionDuration.$slower} ${theme.transitionTiming.$slowBezier}`,
+            transformOrigin: 'top center',
+            boxShadow: theme.shadows.$boxShadow1,
+            zIndex: theme.zIndices.$dropdown,
+          }),
+          sx,
+        ]}
+        style={styles}
+        {...rest}
+      />
+    </Portal>
+  );
+};
+
+type MenuItemProps = PropsOfComponent<typeof Button>;
+
+export const MenuItem = (props: MenuItemProps) => {
+  const { sx, onClick, ...rest } = props;
+  const { popoverCtx } = useMenuState();
+  const { toggle } = popoverCtx;
+  const buttonRef = useRef<HTMLButtonElement>(null);
+
+  const onKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {
+    const current = buttonRef.current;
+    if (!current) {
+      return;
+    }
+
+    const key = e.key;
+    if (key !== 'ArrowUp' && key !== 'ArrowDown') {
+      return;
+    }
+
+    e.preventDefault();
+    const sibling = findMenuItem(current, key === 'ArrowUp' ? 'prev' : 'next');
+    (sibling as HTMLElement)?.focus();
+  };
+
+  return (
+    <Button
+      ref={buttonRef}
+      focusRing={false}
+      variant='ghost'
+      colorScheme='neutral'
+      role='menuitem'
+      onKeyDown={onKeyDown}
+      onClick={e => {
+        onClick?.(e);
+        toggle();
+      }}
+      sx={[
+        theme => ({
+          justifyContent: 'start',
+          borderRadius: theme.radii.$none,
+          paddingLeft: theme.space.$4,
+          paddingRight: theme.space.$4,
+          ':focus': {
+            backgroundColor: theme.colors.$blackAlpha200,
+          },
+        }),
+        sx,
+      ]}
+      {...rest}
+    />
+  );
+};
diff --git a/packages/clerk-js/src/ui/elements/index.ts b/packages/clerk-js/src/ui/elements/index.ts
index 1ff6778edf4..b8b6157be69 100644
--- a/packages/clerk-js/src/ui/elements/index.ts
+++ b/packages/clerk-js/src/ui/elements/index.ts
@@ -27,6 +27,7 @@ export * from './RootBox';
 export * from './InvisibleRootBox';
 export * from './ClipboardInput';
 export * from './TileButton';
+export * from './Menu';
 export * from './Pagination';
 export * from './FullHeightLoader';
 export * from './Tabs';
diff --git a/packages/clerk-js/src/ui/foundations/zIndices.ts b/packages/clerk-js/src/ui/foundations/zIndices.ts
index ca05553413f..f4f81f5a699 100644
--- a/packages/clerk-js/src/ui/foundations/zIndices.ts
+++ b/packages/clerk-js/src/ui/foundations/zIndices.ts
@@ -2,4 +2,5 @@ export const zIndices = Object.freeze({
   navbar: '100',
   fab: '9000',
   modal: '10000',
+  dropdown: '11000',
 } as const);
diff --git a/packages/clerk-js/src/ui/hooks/usePopover.ts b/packages/clerk-js/src/ui/hooks/usePopover.ts
index 367a14ca43e..8728e400a50 100644
--- a/packages/clerk-js/src/ui/hooks/usePopover.ts
+++ b/packages/clerk-js/src/ui/hooks/usePopover.ts
@@ -16,6 +16,8 @@ type UsePopoverProps = {
   autoUpdate?: boolean;
 };
 
+export type UsePopoverReturn = ReturnType<typeof usePopover>;
+
 export const usePopover = (props: UsePopoverProps = {}) => {
   const [isOpen, setIsOpen] = React.useState(props.defaultOpen || false);
   const { update, reference, floating, strategy, x, y, context } = useFloating({

From 088fbfacce234d57706a1f4a9fdd1e086455a63b Mon Sep 17 00:00:00 2001
From: Nikos Douvlis <nikosdouvlis@gmail.com>
Date: Thu, 13 Oct 2022 11:07:50 +0300
Subject: [PATCH 26/41] chore(clerk-js): Increase bundlewatch limit to 157kb

---
 packages/clerk-js/package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index 1e762786d5e..aaea1705cf2 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -118,7 +118,7 @@
     "files": [
       {
         "path": "./dist/clerk.browser.js",
-        "maxSize": "155kB"
+        "maxSize": "157kB"
       },
       {
         "path": "./dist/clerk.headless.js",

From 9619bfe6da4fb876f2ba6279f2c08d6a8c2d263c Mon Sep 17 00:00:00 2001
From: George Desipris <george.desipris.56@gmail.com>
Date: Wed, 5 Oct 2022 20:05:02 +0300
Subject: [PATCH 27/41] feat(clerk-js): Introduce Select element and use it in
 PhoneInput

---
 packages/clerk-js/src/ui/elements/Menu.tsx    |   1 +
 .../src/ui/elements/PhoneInput/PhoneInput.tsx | 215 +++--------
 packages/clerk-js/src/ui/elements/Select.tsx  | 342 ++++++++++++++++++
 packages/clerk-js/src/ui/elements/index.ts    |   2 +
 4 files changed, 404 insertions(+), 156 deletions(-)
 create mode 100644 packages/clerk-js/src/ui/elements/Select.tsx

diff --git a/packages/clerk-js/src/ui/elements/Menu.tsx b/packages/clerk-js/src/ui/elements/Menu.tsx
index 03851628c6a..4d8d44c770e 100644
--- a/packages/clerk-js/src/ui/elements/Menu.tsx
+++ b/packages/clerk-js/src/ui/elements/Menu.tsx
@@ -43,6 +43,7 @@ export const MenuTrigger = (props: MenuTriggerProps) => {
   }
 
   return cloneElement(children, {
+    // @ts-expect-error
     ref: reference,
     onClick: (e: React.MouseEvent) => {
       children.props?.onClick?.(e);
diff --git a/packages/clerk-js/src/ui/elements/PhoneInput/PhoneInput.tsx b/packages/clerk-js/src/ui/elements/PhoneInput/PhoneInput.tsx
index c78358a4f38..805b0fa1e19 100644
--- a/packages/clerk-js/src/ui/elements/PhoneInput/PhoneInput.tsx
+++ b/packages/clerk-js/src/ui/elements/PhoneInput/PhoneInput.tsx
@@ -1,15 +1,13 @@
 import React from 'react';
 
-import { Button, Flex, Icon, Input, Text } from '../../customizables';
-import { usePopover, useSearchInput } from '../../hooks';
-import { Caret } from '../../icons';
+import { Flex, Input, Text } from '../../customizables';
+import { Select, SelectButton, SelectOptionList } from '../../elements';
 import { PropsOfComponent } from '../../styledSystem';
 import { getFlagEmojiFromCountryIso } from '../../utils';
 import { CountryEntry, CountryIso, IsoToCountryMap } from './countryCodeData';
-import { DropdownBox, DropdownItemContainer, DropdownSearchbar } from './Dropdown';
 import { useFormattedPhoneNumber } from './useFormattedPhoneNumber';
 
-const createDropdownOption = (country: CountryEntry) => {
+const createSelectOption = (country: CountryEntry) => {
   return {
     searchTerm: `${country.iso} ${country.name} ${country.code}`,
     country,
@@ -17,30 +15,17 @@ const createDropdownOption = (country: CountryEntry) => {
   };
 };
 
-const countryOptions = [...IsoToCountryMap.values()].map(createDropdownOption);
+const countryOptions = [...IsoToCountryMap.values()].map(createSelectOption);
 
 type PhoneInputProps = PropsOfComponent<typeof Input>;
 
 export const PhoneInput = (props: PhoneInputProps) => {
   const { onChange: onChangeProp, value, ...rest } = props;
   const phoneInputRef = React.useRef<HTMLInputElement>(null);
-  const selectedItemRef = React.useRef<HTMLDivElement>(null);
-  const [selectedIndex, setSelectedIndex] = React.useState(0);
-  const { floating, reference, styles, toggle: togglePopover, isOpen } = usePopover({ autoUpdate: false });
-  const { selectedIso, setPhoneNumber, cleanPhoneNumber, formattedPhoneNumber, setSelectedIso } =
-    useFormattedPhoneNumber({ defaultPhone: value as string });
-  const { filteredItems, searchInputProps } = useSearchInput({
-    items: countryOptions,
-    comparator: (term, item) => item.searchTerm.toLowerCase().includes(term.toLowerCase()),
-  });
-
-  const scrollToItemOnSelectedIndexChange = () => {
-    if (!isOpen) {
-      setSelectedIndex(0);
-      return;
-    }
-    selectedItemRef.current?.scrollIntoView({ block: 'nearest' });
-  };
+  const { setPhoneNumber, cleanPhoneNumber, formattedPhoneNumber, selectedIso, setSelectedIso } =
+    useFormattedPhoneNumber({
+      defaultPhone: value as string,
+    });
 
   const callOnChangeProp = () => {
     // Quick and dirty way to match this component's public API
@@ -49,40 +34,11 @@ export const PhoneInput = (props: PhoneInputProps) => {
     onChangeProp?.({ target: { value: cleanPhoneNumber } } as any);
   };
 
-  React.useEffect(callOnChangeProp, [cleanPhoneNumber]);
-  React.useEffect(scrollToItemOnSelectedIndexChange, [selectedIndex, isOpen]);
-
-  const selectIso = React.useCallback(
-    (iso: CountryIso) => {
-      setSelectedIso(iso);
-      togglePopover();
-      phoneInputRef.current?.focus();
-    },
-    [togglePopover, setSelectedIso],
-  );
-
-  const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {
-    if (e.key === 'ArrowUp') {
-      e.preventDefault();
-      if (isOpen) {
-        return setSelectedIndex((i = 0) => Math.max(i - 1, 0));
-      }
-      return togglePopover();
-    }
-
-    if (e.key === 'ArrowDown') {
-      e.preventDefault();
-      if (isOpen) {
-        return setSelectedIndex((i = 0) => Math.min(i + 1, filteredItems.length - 1));
-      }
-      return togglePopover();
-    }
+  const selectedCountryOption = React.useMemo(() => {
+    return countryOptions.find(o => o.country.iso === selectedIso) || countryOptions[0];
+  }, [selectedIso]);
 
-    if (e.key === 'Enter') {
-      e.preventDefault();
-      return selectIso(filteredItems[selectedIndex].country.iso);
-    }
-  };
+  React.useEffect(callOnChangeProp, [cleanPhoneNumber]);
 
   return (
     <Flex
@@ -90,130 +46,77 @@ export const PhoneInput = (props: PhoneInputProps) => {
       justify='center'
       sx={theme => ({ position: 'relative', borderRadius: theme.radii.$md })}
     >
-      <DropdownTrigger
-        selectedIso={selectedIso}
-        ref={reference}
-        isOpen={isOpen}
-        onClick={togglePopover}
-        isDisabled={rest.isDisabled}
-      />
+      <Select
+        value={selectedCountryOption}
+        options={countryOptions}
+        optionBuilder={(option, _index, isSelected) => (
+          <CountryCodeListItem
+            sx={theme => ({
+              ...(isSelected && { backgroundColor: theme.colors.$blackAlpha200 }),
+              '&:hover': {
+                backgroundColor: theme.colors.$blackAlpha200,
+              },
+            })}
+            country={option.country}
+          />
+        )}
+        onChange={option => {
+          setSelectedIso(option.country.iso);
+          phoneInputRef.current?.focus();
+        }}
+        noResultsMessage='No countries found'
+        placeholder='Search country or code'
+        comparator={(term, option) => option.searchTerm.toLowerCase().includes(term.toLowerCase())}
+      >
+        <Flex
+          sx={{
+            position: 'absolute',
+            height: `calc(100% - 2px)`,
+            marginLeft: '1px',
+          }}
+        >
+          <SelectButton>
+            <Flag iso={selectedIso} />
+          </SelectButton>
+        </Flex>
+        <SelectOptionList />
+      </Select>
       <Input
         value={formattedPhoneNumber}
         onChange={el => setPhoneNumber(el.target.value)}
         maxLength={25}
         type='tel'
         sx={theme => ({ paddingLeft: theme.space.$20 })}
-        {...rest}
         ref={phoneInputRef}
+        {...rest}
       />
-      <DropdownBox
-        isOpen={isOpen}
-        ref={floating}
-        style={{ ...styles, left: styles.left - 1 }}
-        onKeyDown={onKeyDown}
-      >
-        <DropdownSearchbar
-          placeholder='Search country or code'
-          {...searchInputProps}
-        />
-        <DropdownItemContainer>
-          {filteredItems.map((item, i) => (
-            <CountryCodeListItem
-              key={i}
-              country={item.country}
-              selectIso={selectIso}
-              isSelected={i === selectedIndex}
-              innerRef={i === selectedIndex ? selectedItemRef : undefined}
-            />
-          ))}
-          {filteredItems.length === 0 && <NoResults />}
-        </DropdownItemContainer>
-      </DropdownBox>
     </Flex>
   );
 };
 
-const DropdownTrigger = React.forwardRef<
-  HTMLButtonElement,
-  PropsOfComponent<typeof Button> & { selectedIso: CountryIso; isOpen: boolean }
->((props, ref) => {
-  return (
-    <Button
-      ref={ref}
-      onClick={props.onClick}
-      colorScheme='neutral'
-      variant='ghost'
-      textVariant='smallMedium'
-      isDisabled={props.isDisabled}
-      sx={theme => ({
-        paddingLeft: theme.space.$3x5,
-        paddingRight: theme.space.$3x5,
-        backgroundColor: theme.colors.$blackAlpha50,
-        position: 'absolute',
-        height: 'calc(100% - 2px)',
-        marginLeft: '1px',
-        width: theme.space.$16,
-        borderRadius: theme.radii.$md,
-        borderBottomRightRadius: '0',
-        borderTopRightRadius: '0',
-      })}
-    >
-      <Flag iso={props.selectedIso} />
-      <Icon
-        icon={Caret}
-        sx={theme => ({
-          width: theme.sizes.$3x5,
-          marginLeft: theme.space.$1,
-          transitionProperty: theme.transitionProperty.$common,
-          transitionDuration: theme.transitionDuration.$controls,
-          transform: `rotate(${props.isOpen ? '180' : '0'}deg)`,
-        })}
-      />
-    </Button>
-  );
-});
-
-type CountryCodeListItem = React.PropsWithChildren<{
+type CountryCodeListItem = PropsOfComponent<typeof Flex> & {
   country: CountryEntry;
-  selectIso: (iso: CountryIso) => void;
-  isSelected: boolean;
-  innerRef: any;
-}>;
-
-const NoResults = () => {
-  return (
-    <Text
-      as='div'
-      variant='smallRegular'
-      sx={theme => ({ width: '100%', padding: `${theme.space.$2} 0 0 ${theme.space.$4}` })}
-    >
-      No countries found
-    </Text>
-  );
 };
 
 const CountryCodeListItem = React.memo((props: CountryCodeListItem) => {
-  const { country, selectIso, isSelected, innerRef, ...rest } = props;
+  const { country, sx, ...rest } = props;
   return (
     <Flex
-      ref={innerRef}
-      onClick={() => selectIso(country.iso)}
       center
-      sx={theme => ({
-        userSelect: 'none',
-        gap: theme.space.$2,
-        padding: `${theme.space.$0x5} ${theme.space.$4}`,
-        ...(isSelected && { backgroundColor: theme.colors.$blackAlpha200 }),
-        '&:hover': {
-          backgroundColor: theme.colors.$blackAlpha200,
-        },
-      })}
+      sx={[
+        theme => ({
+          width: '100%',
+          gap: theme.space.$2,
+          padding: `${theme.space.$0x5} ${theme.space.$4}`,
+        }),
+        sx,
+      ]}
+      {...rest}
     >
       <Flag iso={country.iso} />
       <Text
         as='div'
         variant='smallRegular'
-        {...rest}
         sx={{ width: '100%' }}
       >
         {country.name}
diff --git a/packages/clerk-js/src/ui/elements/Select.tsx b/packages/clerk-js/src/ui/elements/Select.tsx
new file mode 100644
index 00000000000..7eb98c7610f
--- /dev/null
+++ b/packages/clerk-js/src/ui/elements/Select.tsx
@@ -0,0 +1,342 @@
+import React, { isValidElement, PropsWithChildren, useState } from 'react';
+
+import { usePopover, useSearchInput } from '../../ui/hooks';
+import { Button, Flex, Icon, Text } from '../customizables';
+import { Caret, MagnifyingGlass } from '../icons';
+import { animations, PropsOfComponent } from '../styledSystem';
+import { colors, createContextAndHook } from '../utils';
+import { InputWithIcon } from './InputWithIcon';
+
+type UsePopoverReturn = ReturnType<typeof usePopover>;
+type UseSearchInputReturn = ReturnType<typeof useSearchInput>;
+
+type OptionBuilder<O> = (option: O, index?: number, isSelected?: boolean) => JSX.Element;
+
+type SelectProps<O> = {
+  options: O[];
+  value: O;
+  onChange: (option: O) => void;
+  placeholder?: string;
+  comparator?: (term: string, option: O) => boolean;
+  noResultsMessage?: string;
+  optionBuilder?: OptionBuilder<O>;
+};
+
+type SelectState<O = any> = Pick<SelectProps<O>, 'placeholder' | 'comparator' | 'noResultsMessage'> & {
+  popoverCtx: UsePopoverReturn;
+  searchInputCtx: UseSearchInputReturn;
+  optionBuilder: OptionBuilder<O>;
+  selectedOption: O;
+  select: (option: O) => void;
+  selectedItemRef: React.RefObject<HTMLDivElement>;
+  onTriggerClick: () => void;
+};
+
+const [SelectStateCtx, useSelectState] = createContextAndHook<SelectState>('SelectState');
+
+const defaultOptionBuilder = <O,>(option: O, _index?: number, isSelected?: boolean) => {
+  if (typeof option !== 'string' && typeof option !== 'number') {
+    throw new Error('Provide an optionBuilder function');
+  }
+
+  return (
+    <Flex
+      sx={theme => ({
+        width: '100%',
+        paddingLeft: theme.space.$2,
+        paddingRight: theme.space.$2,
+        ...(isSelected && { backgroundColor: theme.colors.$blackAlpha200 }),
+        '&:hover': {
+          backgroundColor: theme.colors.$blackAlpha200,
+        },
+      })}
+    >
+      <Text>{option}</Text>
+    </Flex>
+  );
+};
+
+export const Select = <O,>(props: PropsWithChildren<SelectProps<O>>) => {
+  const {
+    value,
+    options,
+    onChange,
+    optionBuilder = defaultOptionBuilder,
+    noResultsMessage,
+    comparator,
+    placeholder,
+    ...rest
+  } = props;
+  const popoverCtx = usePopover({ autoUpdate: false });
+  const togglePopover = popoverCtx.toggle;
+  const selectedItemRef = React.useRef<HTMLDivElement>(null);
+  const searchInputCtx = useSearchInput({
+    items: options,
+    comparator: comparator || (() => true),
+  });
+
+  const select = React.useCallback(
+    option => {
+      onChange?.(option);
+      togglePopover();
+    },
+    [togglePopover, onChange],
+  );
+
+  return (
+    <SelectStateCtx.Provider
+      value={{
+        value: {
+          popoverCtx,
+          searchInputCtx,
+          selectedOption: value,
+          noResultsMessage,
+          selectedItemRef,
+          optionBuilder,
+          placeholder,
+          comparator,
+          select,
+          onTriggerClick: togglePopover,
+        },
+      }}
+      {...rest}
+    />
+  );
+};
+
+type SelectOptionBuilderProps<O = unknown> = {
+  option: O;
+  index: number;
+  optionBuilder: OptionBuilder<O>;
+  handleSelect: (option: O) => void;
+  isSelected: boolean;
+};
+
+const _SelectOptionBuilder = (props: SelectOptionBuilderProps, ref?: React.ForwardedRef<HTMLDivElement>) => {
+  const { option, optionBuilder, index, handleSelect, isSelected } = props;
+  return (
+    <Flex
+      ref={ref}
+      sx={{
+        userSelect: 'none',
+      }}
+      onClick={() => {
+        handleSelect(option);
+      }}
+    >
+      {optionBuilder(option, index, isSelected)}
+    </Flex>
+  );
+};
+
+const SelectOptionBuilder = React.memo(React.forwardRef(_SelectOptionBuilder));
+
+const SelectSearchbar = (props: PropsOfComponent<typeof InputWithIcon>) => {
+  const { sx, ...rest } = props;
+  React.useEffect(() => {
+    // @ts-expect-error
+    return () => props.onChange({ target: { value: '' } });
+  }, []);
+
+  return (
+    <Flex sx={theme => ({ borderBottom: theme.borders.$normal, borderColor: theme.colors.$blackAlpha200 })}>
+      <InputWithIcon
+        focusRing={false}
+        autoFocus
+        leftIcon={
+          <Icon
+            colorScheme='neutral'
+            icon={MagnifyingGlass}
+          />
+        }
+        sx={[{ border: 'none', borderRadius: '0' }, sx]}
+        {...rest}
+      />
+    </Flex>
+  );
+};
+
+export const SelectNoResults = (props: PropsOfComponent<typeof Text>) => {
+  const { sx, ...rest } = props;
+  return (
+    <Text
+      as='div'
+      variant='smallRegular'
+      sx={[theme => ({ width: '100%', padding: `${theme.space.$2} 0 0 ${theme.space.$4}` }), sx]}
+      {...rest}
+    />
+  );
+};
+
+type SelectOptionListProps = PropsOfComponent<typeof Flex>;
+
+export const SelectOptionList = (props: SelectOptionListProps) => {
+  const { sx, ...rest } = props;
+  const {
+    popoverCtx,
+    searchInputCtx,
+    optionBuilder,
+    placeholder,
+    comparator,
+    selectedItemRef,
+    noResultsMessage,
+    select,
+    onTriggerClick,
+  } = useSelectState();
+  const { filteredItems: options, searchInputProps } = searchInputCtx;
+  const [selectedIndex, setSelectedIndex] = useState(0);
+  const { isOpen, floating, styles } = popoverCtx;
+  const containerRef = React.useRef<HTMLDivElement>(null);
+
+  const scrollToItemOnSelectedIndexChange = () => {
+    if (!isOpen) {
+      setSelectedIndex(0);
+      return;
+    }
+    selectedItemRef.current?.scrollIntoView({ block: 'nearest' });
+  };
+
+  React.useEffect(scrollToItemOnSelectedIndexChange, [selectedIndex, isOpen]);
+  React.useEffect(() => {
+    if (!comparator) {
+      containerRef?.current?.focus();
+    }
+  }, [isOpen]);
+
+  const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {
+    if (e.key === 'ArrowUp') {
+      e.preventDefault();
+      if (isOpen) {
+        return setSelectedIndex((i = 0) => Math.max(i - 1, 0));
+      }
+      return onTriggerClick();
+    }
+
+    if (e.key === 'ArrowDown') {
+      e.preventDefault();
+      if (isOpen) {
+        return setSelectedIndex((i = 0) => Math.min(i + 1, options.length - 1));
+      }
+      return onTriggerClick();
+    }
+
+    if (e.key === 'Enter') {
+      e.preventDefault();
+      return select(options[selectedIndex]);
+    }
+  };
+
+  if (!isOpen) {
+    return null;
+  }
+
+  return (
+    <Flex
+      ref={floating}
+      onKeyDown={onKeyDown}
+      direction='col'
+      justify='start'
+      sx={[
+        theme => ({
+          backgroundColor: colors.makeSolid(theme.colors.$colorBackground),
+          border: theme.borders.$normal,
+          borderRadius: theme.radii.$lg,
+          borderColor: theme.colors.$blackAlpha200,
+          overflow: 'hidden',
+          width: '100%',
+          animation: `${animations.dropdownSlideInScaleAndFade} ${theme.transitionDuration.$slower} ${theme.transitionTiming.$slowBezier}`,
+          transformOrigin: 'top center',
+          boxShadow: theme.shadows.$cardDropShadow,
+          zIndex: theme.zIndices.$dropdown,
+        }),
+        sx,
+      ]}
+      style={{ ...styles, left: styles.left - 1 }}
+      {...rest}
+    >
+      {comparator && (
+        <SelectSearchbar
+          placeholder={placeholder}
+          {...searchInputProps}
+        />
+      )}
+      <Flex
+        ref={containerRef}
+        direction='col'
+        tabIndex={comparator ? undefined : 0}
+        sx={[
+          theme => ({
+            outline: 'none',
+            overflowY: 'scroll',
+            maxHeight: '18vh',
+            paddingBottom: theme.space.$2,
+          }),
+          sx,
+        ]}
+        {...rest}
+      >
+        {options.map((option, index) => {
+          const isSelected = index === selectedIndex;
+          return (
+            <SelectOptionBuilder
+              key={index}
+              index={index}
+              ref={isSelected ? selectedItemRef : undefined}
+              option={option}
+              optionBuilder={optionBuilder}
+              isSelected={isSelected}
+              handleSelect={select}
+            />
+          );
+        })}
+        {noResultsMessage && options.length === 0 && <SelectNoResults>{noResultsMessage}</SelectNoResults>}
+      </Flex>
+    </Flex>
+  );
+};
+
+export const SelectButton = (props: PropsOfComponent<typeof Button>) => {
+  const { sx, children, ...rest } = props;
+  const { popoverCtx, onTriggerClick, optionBuilder, selectedOption } = useSelectState();
+  const { isOpen, reference } = popoverCtx;
+
+  let show: React.ReactNode = children;
+  if (!isValidElement(children)) {
+    show = optionBuilder(selectedOption);
+  }
+
+  return (
+    <Button
+      ref={reference}
+      colorScheme='neutral'
+      variant='ghost'
+      textVariant='smallMedium'
+      onClick={onTriggerClick}
+      sx={[
+        theme => ({
+          paddingLeft: theme.space.$3x5,
+          paddingRight: theme.space.$3x5,
+          backgroundColor: theme.colors.$blackAlpha50,
+          borderRadius: theme.radii.$md,
+          borderBottomRightRadius: '0',
+          borderTopRightRadius: '0',
+          '> *': { pointerEvents: 'none' },
+        }),
+        sx,
+      ]}
+      {...rest}
+    >
+      {show}
+      <Icon
+        icon={Caret}
+        sx={theme => ({
+          width: theme.sizes.$3x5,
+          marginLeft: theme.space.$1,
+          transitionProperty: theme.transitionProperty.$common,
+          transitionDuration: theme.transitionDuration.$controls,
+          transform: `rotate(${isOpen ? '180' : '0'}deg)`,
+        })}
+      />
+    </Button>
+  );
+};
diff --git a/packages/clerk-js/src/ui/elements/index.ts b/packages/clerk-js/src/ui/elements/index.ts
index b8b6157be69..8fe211334d4 100644
--- a/packages/clerk-js/src/ui/elements/index.ts
+++ b/packages/clerk-js/src/ui/elements/index.ts
@@ -27,7 +27,9 @@ export * from './RootBox';
 export * from './InvisibleRootBox';
 export * from './ClipboardInput';
 export * from './TileButton';
+export * from './Select';
 export * from './Menu';
 export * from './Pagination';
 export * from './FullHeightLoader';
 export * from './Tabs';
+export * from './InputWithIcon';

From ac8df241c620afc2eb11c0b97b219c7daef0d414 Mon Sep 17 00:00:00 2001
From: George Desipris <george.desipris.56@gmail.com>
Date: Thu, 13 Oct 2022 19:12:11 +0300
Subject: [PATCH 28/41] refactor(clerk-js): Remove Dropdown element

---
 .../src/ui/elements/PhoneInput/Dropdown.tsx   | 76 -------------------
 1 file changed, 76 deletions(-)
 delete mode 100644 packages/clerk-js/src/ui/elements/PhoneInput/Dropdown.tsx

diff --git a/packages/clerk-js/src/ui/elements/PhoneInput/Dropdown.tsx b/packages/clerk-js/src/ui/elements/PhoneInput/Dropdown.tsx
deleted file mode 100644
index 89c10b12015..00000000000
--- a/packages/clerk-js/src/ui/elements/PhoneInput/Dropdown.tsx
+++ /dev/null
@@ -1,76 +0,0 @@
-import React from 'react';
-
-import { Flex, Icon } from '../../customizables';
-import { MagnifyingGlass } from '../../icons';
-import { animations, PropsOfComponent } from '../../styledSystem';
-import { colors } from '../../utils';
-import { InputWithIcon } from '../InputWithIcon';
-
-type DropdownBoxProps = PropsOfComponent<typeof Flex> & { isOpen: boolean };
-
-export const DropdownBox = React.forwardRef<HTMLDivElement, DropdownBoxProps>((props, ref) => {
-  const { isOpen, ...rest } = props;
-  if (!isOpen) {
-    return null;
-  }
-
-  return (
-    <Flex
-      ref={ref}
-      direction='col'
-      justify='start'
-      sx={theme => ({
-        backgroundColor: colors.makeSolid(theme.colors.$colorBackground),
-        border: theme.borders.$normal,
-        borderRadius: theme.radii.$lg,
-        borderColor: theme.colors.$blackAlpha200,
-        overflow: 'hidden',
-        width: '100%',
-        top: `calc(100% + ${theme.space.$2})`,
-        animation: `${animations.dropdownSlideInScaleAndFade} 250ms ${theme.transitionTiming.$slowBezier}`,
-        transformOrigin: 'top center',
-        boxShadow: theme.shadows.$cardDropShadow,
-        zIndex: 10,
-      })}
-      {...rest}
-    />
-  );
-});
-
-export const DropdownSearchbar = (props: PropsOfComponent<typeof InputWithIcon>) => {
-  React.useEffect(() => {
-    // @ts-expect-error
-    return () => props.onChange({ target: { value: '' } });
-  }, []);
-
-  return (
-    <Flex sx={theme => ({ borderBottom: theme.borders.$normal, borderColor: theme.colors.$blackAlpha200 })}>
-      <InputWithIcon
-        focusRing={false}
-        autoFocus
-        leftIcon={
-          <Icon
-            colorScheme='neutral'
-            icon={MagnifyingGlass}
-          />
-        }
-        sx={{ border: 'none', borderRadius: '0' }}
-        {...props}
-      />
-    </Flex>
-  );
-};
-
-export const DropdownItemContainer = (props: React.PropsWithChildren<any>) => {
-  return (
-    <Flex
-      direction='col'
-      sx={theme => ({
-        overflowY: 'scroll',
-        maxHeight: '18vh',
-        paddingBottom: theme.space.$2,
-      })}
-      {...props}
-    />
-  );
-};

From 96cde45b4f1db5ff074289b57ff58c40bf80f6e1 Mon Sep 17 00:00:00 2001
From: John Raptis <johnsitpar@gmail.com>
Date: Thu, 13 Oct 2022 19:41:34 +0300
Subject: [PATCH 29/41] fix(clerk-js): Add appearance customization support 
 for avatar gradient

* fix(clerk-js): Add customization for avatar gradient from appearance provider

* fix(clerk-js): Refactor types

* fix(clerk-js): Refactor some props in boring avatar

* fix(clerk-js): Eliminate warnings regarding svg attributes

* fix(clerk-js): Prevent deep-merging of arrays in fastDeepMerge

* fix(clerk-js): Fix type issues

* fix(clerk-js): Fix issue with avatar initials color font

* feat(clerk-js): Replace `avatar` with `avatarBox` descriptor

Co-authored-by: Nikos Douvlis <nikosdouvlis@gmail.com>
---
 .../clerk-js/src/ui/common/BoringAvatar.tsx    | 14 +++++++++++---
 .../src/ui/customizables/elementDescriptors.ts |  2 +-
 .../src/ui/customizables/parseVariables.ts     |  2 ++
 packages/clerk-js/src/ui/elements/Avatar.tsx   | 18 ++++++++++--------
 packages/clerk-js/src/ui/foundations/colors.ts |  1 +
 .../src/ui/utils/fastDeepMerge.test.ts         | 14 ++++++++++++++
 .../clerk-js/src/ui/utils/fastDeepMerge.ts     |  6 ++++--
 packages/types/src/appearance.ts               |  9 ++++++++-
 8 files changed, 51 insertions(+), 15 deletions(-)

diff --git a/packages/clerk-js/src/ui/common/BoringAvatar.tsx b/packages/clerk-js/src/ui/common/BoringAvatar.tsx
index cbc4f7473e0..d1d124b1e15 100644
--- a/packages/clerk-js/src/ui/common/BoringAvatar.tsx
+++ b/packages/clerk-js/src/ui/common/BoringAvatar.tsx
@@ -49,7 +49,15 @@ function generateColors(name: string, colors: string[]) {
   return elementsProperties;
 }
 
-const AvatarMarble = props => {
+type AvatarProps = {
+  colors: string[];
+  name: string;
+  square: boolean;
+  title: boolean;
+  size: string;
+};
+
+const AvatarMarble = (props: AvatarProps) => {
   const properties = generateColors(props.name, props.colors);
 
   return (
@@ -130,10 +138,10 @@ const AvatarMarble = props => {
 
 export const BoringAvatar = ({
   colors = ['#92A1C6', '#146A7C', '#F0AB3D', '#C271B4', '#C20D90'],
-  name = 'Clara Barton',
+  name = '',
   square = false,
   title = false,
-  size = 40,
+  size = '40px',
   ...props
 }) => {
   const avatarProps = { colors, name, title, size, square, ...props };
diff --git a/packages/clerk-js/src/ui/customizables/elementDescriptors.ts b/packages/clerk-js/src/ui/customizables/elementDescriptors.ts
index 5eec620fad9..f2a4aad15ed 100644
--- a/packages/clerk-js/src/ui/customizables/elementDescriptors.ts
+++ b/packages/clerk-js/src/ui/customizables/elementDescriptors.ts
@@ -89,7 +89,7 @@ export const APPEARANCE_KEYS = containsAllElementsConfigKeys([
   'formFieldInputCopyToClipboardButton',
   'formFieldInputCopyToClipboardIcon',
 
-  'avatar',
+  'avatarBox',
   'avatarImage',
 
   'userButtonBox',
diff --git a/packages/clerk-js/src/ui/customizables/parseVariables.ts b/packages/clerk-js/src/ui/customizables/parseVariables.ts
index 1aa8eb2a564..e3320482859 100644
--- a/packages/clerk-js/src/ui/customizables/parseVariables.ts
+++ b/packages/clerk-js/src/ui/customizables/parseVariables.ts
@@ -7,6 +7,7 @@ import { colorOptionToHslaAlphaScale, colorOptionToHslaLightnessScale } from './
 
 export const createColorScales = (theme: Theme) => {
   const variables = theme.variables || {};
+
   return removeUndefinedProps({
     ...colorOptionToHslaLightnessScale(variables.colorPrimary, 'primary'),
     ...colorOptionToHslaLightnessScale(variables.colorDanger, 'danger'),
@@ -19,6 +20,7 @@ export const createColorScales = (theme: Theme) => {
     colorInputText: toHSLA(variables.colorInputText),
     colorBackground: toHSLA(variables.colorBackground),
     colorInputBackground: toHSLA(variables.colorInputBackground),
+    colorAvatarGradient: variables.colorAvatarGradient?.length ? variables.colorAvatarGradient.map(toHSLA) : undefined,
   });
 };
 
diff --git a/packages/clerk-js/src/ui/elements/Avatar.tsx b/packages/clerk-js/src/ui/elements/Avatar.tsx
index 323828c42c0..f63de239ae4 100644
--- a/packages/clerk-js/src/ui/elements/Avatar.tsx
+++ b/packages/clerk-js/src/ui/elements/Avatar.tsx
@@ -53,7 +53,7 @@ export const Avatar = (props: AvatarProps) => {
       <InitialsAvatarFallback {...props} />
     ) : (
       <Image
-        elementDescriptor={imageElementDescriptor || descriptors.avatarImage}
+        elementDescriptor={[imageElementDescriptor, descriptors.avatarImage]}
         alt={fullName}
         title={fullName}
         src={src || ''}
@@ -66,7 +66,7 @@ export const Avatar = (props: AvatarProps) => {
   // TODO: Revise size handling. Do we need to be this dynamic or should we use the theme instead?
   return (
     <Flex
-      elementDescriptor={boxElementDescriptor || descriptors.avatar}
+      elementDescriptor={[boxElementDescriptor, descriptors.avatarBox]}
       sx={[
         theme => ({
           flexShrink: 0,
@@ -89,8 +89,6 @@ export const Avatar = (props: AvatarProps) => {
   );
 };
 
-const avatarColors = ['#6C47FF', '#5BC5EF', '#FBD486', '#BEF972', '#FF8F8F'];
-
 function InitialsAvatarFallback(props: AvatarProps) {
   const initials = getInitials(props);
   const { parsedInternalTheme } = useAppearance();
@@ -102,14 +100,18 @@ function InitialsAvatarFallback(props: AvatarProps) {
       align='center'
     >
       <BoringAvatar
-        size={Number(props.size?.(parsedInternalTheme))}
-        name={`${props.firstName} ${props.lastName}`}
-        colors={avatarColors}
+        size={`${props.size?.(parsedInternalTheme)}`}
+        colors={[...parsedInternalTheme.colors.$colorAvatarGradient]}
       />
       {initials && (
         <Text
           as='span'
-          sx={{ ...common.centeredFlex('inline-flex'), width: '100%', position: 'absolute' }}
+          colorScheme='inherit'
+          sx={{
+            ...common.centeredFlex('inline-flex'),
+            width: '100%',
+            position: 'absolute',
+          }}
         >
           {initials}
         </Text>
diff --git a/packages/clerk-js/src/ui/foundations/colors.ts b/packages/clerk-js/src/ui/foundations/colors.ts
index 27ca096b8e2..4e2b5941f6e 100644
--- a/packages/clerk-js/src/ui/foundations/colors.ts
+++ b/packages/clerk-js/src/ui/foundations/colors.ts
@@ -37,6 +37,7 @@ export const colors = Object.freeze({
   ...whiteAlpha,
   colorBackground: 'white',
   colorInputBackground: 'white',
+  colorAvatarGradient: ['#6C47FF', '#5BC5EF', '#FBD486', '#BEF972', '#FF8F8F'],
   colorText: 'black',
   colorTextOnPrimaryBackground: 'white',
   colorTextSecondary: 'rgba(0,0,0,0.65)',
diff --git a/packages/clerk-js/src/ui/utils/fastDeepMerge.test.ts b/packages/clerk-js/src/ui/utils/fastDeepMerge.test.ts
index a8c541918b0..c7086783e72 100644
--- a/packages/clerk-js/src/ui/utils/fastDeepMerge.test.ts
+++ b/packages/clerk-js/src/ui/utils/fastDeepMerge.test.ts
@@ -28,6 +28,13 @@ describe('fastDeepMergeReplace', () => {
     fastDeepMergeAndReplace(source, target);
     expect(target).toEqual({ a: '1', b: '2', c: '3', obj: { a: '1', b: '2' } });
   });
+
+  it('does not deep-merge arrays', () => {
+    const source = { obj: { a: 1 }, arr: [1, 2, 3] };
+    const target = { obj: { b: 2 }, arr: [1, 2, 3, 4, 5, 6] };
+    fastDeepMergeAndReplace(source, target);
+    expect(target).toEqual({ obj: { a: 1, b: 2 }, arr: [1, 2, 3] });
+  });
 });
 
 describe('fastDeepMergeKeep', () => {
@@ -58,4 +65,11 @@ describe('fastDeepMergeKeep', () => {
     fastDeepMergeAndKeep(source, target);
     expect(target).toEqual({ a: '10', b: '2', c: '3', obj: { a: '10', b: '20' } });
   });
+
+  it('does not deep-merge arrays', () => {
+    const source = { obj: { a: 1 }, arr: [1, 2, 3] };
+    const target = { obj: { b: 2 }, arr: [1, 2, 3, 4, 5, 6] };
+    fastDeepMergeAndKeep(source, target);
+    expect(target).toEqual({ obj: { a: 1, b: 2 }, arr: [1, 2, 3, 4, 5, 6] });
+  });
 });
diff --git a/packages/clerk-js/src/ui/utils/fastDeepMerge.ts b/packages/clerk-js/src/ui/utils/fastDeepMerge.ts
index 007eb4cc495..7cec1c3b7fa 100644
--- a/packages/clerk-js/src/ui/utils/fastDeepMerge.ts
+++ b/packages/clerk-js/src/ui/utils/fastDeepMerge.ts
@@ -12,7 +12,8 @@ export const fastDeepMergeAndReplace = (
   }
 
   for (const key in source) {
-    if (source[key] !== null && typeof source[key] === `object`) {
+    // Deep merge objects but shallow-copy arrays
+    if (source[key] !== null && typeof source[key] === `object` && !Array.isArray(source[key])) {
       if (target[key] === undefined) {
         target[key] = new (Object.getPrototypeOf(source[key]).constructor)();
       }
@@ -32,7 +33,8 @@ export const fastDeepMergeAndKeep = (
   }
 
   for (const key in source) {
-    if (source[key] !== null && typeof source[key] === `object`) {
+    // Deep merge objects but shallow-copy arrays
+    if (source[key] !== null && typeof source[key] === `object` && !Array.isArray(source[key])) {
       if (target[key] === undefined) {
         target[key] = new (Object.getPrototypeOf(source[key]).constructor)();
       }
diff --git a/packages/types/src/appearance.ts b/packages/types/src/appearance.ts
index f36c7b196dd..53bc964844e 100644
--- a/packages/types/src/appearance.ts
+++ b/packages/types/src/appearance.ts
@@ -206,7 +206,7 @@ export type ElementsConfig = {
   formFieldInputCopyToClipboardButton: WithOptions<never, never, never>;
   formFieldInputCopyToClipboardIcon: WithOptions<never, never, never>;
 
-  avatar: WithOptions<never, never, never>;
+  avatarBox: WithOptions<never, never, never>;
   avatarImage: WithOptions<never, never, never>;
 
   // TODO: We can remove "Popover" from these:
@@ -361,6 +361,13 @@ export type Variables = {
    * The background color for the card container.
    */
   colorBackground?: CssColor;
+
+  /*
+   * If a user hasn't provided an avatar image, a colorful gradient avatar will be shown as fallback.
+   * To customise the gradient,pass an array of CSS colors.
+   * @default ['#6C47FF', '#5BC5EF', '#FBD486', '#BEF972', '#FF8F8F'];
+   */
+  colorAvatarGradient?: CssColor[];
   /**
    * The default text color inside input elements. To customise the input background color instead, use {@link Variables.colorInputBackground}.
    * @default The value of {@link Variables.colorText}

From e674272bfe61d8eae24db3c10436f92eaf98a5da Mon Sep 17 00:00:00 2001
From: Sokratis Vidros <sokratis.vidros@gmail.com>
Date: Thu, 13 Oct 2022 21:05:01 +0300
Subject: [PATCH 30/41] fix(clerk-js): Make global errors localizable

When calling setGlobalError pass the full error object so that its code can be used by the internal translateError function.
---
 .../src/ui/elements/contexts/CardStateContext.tsx         | 3 ++-
 packages/clerk-js/src/ui/localization/makeLocalizable.tsx | 2 +-
 packages/clerk-js/src/ui/utils/errorHandler.ts            | 8 ++++++--
 3 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/packages/clerk-js/src/ui/elements/contexts/CardStateContext.tsx b/packages/clerk-js/src/ui/elements/contexts/CardStateContext.tsx
index b358ea9ef40..fd7d87e8295 100644
--- a/packages/clerk-js/src/ui/elements/contexts/CardStateContext.tsx
+++ b/packages/clerk-js/src/ui/elements/contexts/CardStateContext.tsx
@@ -1,3 +1,4 @@
+import { ClerkAPIError } from '@clerk/types';
 import React from 'react';
 
 import { useLocalizations } from '../../customizables';
@@ -31,7 +32,7 @@ const useCardState = () => {
 
   return {
     setIdle: (metadata?: Metadata) => setState(s => ({ ...s, status: 'idle', metadata })),
-    setError: (metadata: Metadata) =>
+    setError: (metadata: ClerkAPIError | Metadata) =>
       setState(s => {
         return { ...s, error: translateError(metadata) };
       }),
diff --git a/packages/clerk-js/src/ui/localization/makeLocalizable.tsx b/packages/clerk-js/src/ui/localization/makeLocalizable.tsx
index 87c584cc44c..a6c559aa0cb 100644
--- a/packages/clerk-js/src/ui/localization/makeLocalizable.tsx
+++ b/packages/clerk-js/src/ui/localization/makeLocalizable.tsx
@@ -65,7 +65,7 @@ export const useLocalizations = () => {
     return localizedStringFromKey(localizationKey, parsedResource, globalTokens);
   };
 
-  const translateError = (error: string | ClerkAPIError | undefined) => {
+  const translateError = (error: ClerkAPIError | string | undefined) => {
     if (!error || typeof error === 'string') {
       return t(error);
     }
diff --git a/packages/clerk-js/src/ui/utils/errorHandler.ts b/packages/clerk-js/src/ui/utils/errorHandler.ts
index f659e41e43d..38739ede2d6 100644
--- a/packages/clerk-js/src/ui/utils/errorHandler.ts
+++ b/packages/clerk-js/src/ui/utils/errorHandler.ts
@@ -43,7 +43,11 @@ function parseErrors(errors: ClerkAPIError[]): ParserErrors {
 }
 
 type HandleError = {
-  (err: Error, fieldStates: Array<FormControlState<string>>, setGlobalError?: (err: string | undefined) => void): void;
+  (
+    err: Error,
+    fieldStates: Array<FormControlState<string>>,
+    setGlobalError?: (err: ClerkAPIError | string | undefined) => void,
+  ): void;
 };
 
 export const handleError: HandleError = (err, fieldStates, setGlobalError) => {
@@ -107,7 +111,7 @@ const handleClerkApiError: HandleError = (err, fieldStates, setGlobalError) => {
     // TODO: Make global errors localizable
     const firstGlobalError = globalErrors[0];
     if (firstGlobalError) {
-      setGlobalError(firstGlobalError.longMessage || firstGlobalError.message || undefined);
+      setGlobalError(firstGlobalError);
     }
   }
 };

From 0313fe5ce4e0afca20865ad1b6d0503502ea6e4d Mon Sep 17 00:00:00 2001
From: Sokratis Vidros <sokratis.vidros@gmail.com>
Date: Thu, 13 Oct 2022 21:05:44 +0300
Subject: [PATCH 31/41] fix(clerk-js): Add global not_allowed_access error to
 localization prop

---
 packages/clerk-js/src/ui/localization/defaultEnglishResource.ts | 1 +
 packages/types/src/localization.ts                              | 1 +
 2 files changed, 2 insertions(+)

diff --git a/packages/clerk-js/src/ui/localization/defaultEnglishResource.ts b/packages/clerk-js/src/ui/localization/defaultEnglishResource.ts
index 0a93a1dd1e2..6c85c55c1d1 100644
--- a/packages/clerk-js/src/ui/localization/defaultEnglishResource.ts
+++ b/packages/clerk-js/src/ui/localization/defaultEnglishResource.ts
@@ -298,5 +298,6 @@ export const defaultResource: DeepRequired<LocalizationResource> = {
     form_param_nil: '',
     form_code_incorrect: '',
     form_password_incorrect: '',
+    not_allowed_access: '',
   },
 } as const;
diff --git a/packages/types/src/localization.ts b/packages/types/src/localization.ts
index 06df00b5d46..a48cf8dad7e 100644
--- a/packages/types/src/localization.ts
+++ b/packages/types/src/localization.ts
@@ -308,5 +308,6 @@ type _LocalizationResource = {
     form_param_nil: LocalizationValue;
     form_code_incorrect: LocalizationValue;
     form_password_incorrect: LocalizationValue;
+    not_allowed_access: LocalizationValue;
   };
 };

From 78627ca84f96627c3b5ccd77e4fbbcb52f5df784 Mon Sep 17 00:00:00 2001
From: Nikos Douvlis <nikosdouvlis@gmail.com>
Date: Thu, 13 Oct 2022 21:12:57 +0300
Subject: [PATCH 32/41] fix(clerk-js): Make translateError fallback to
 longMessage first

---
 packages/clerk-js/src/ui/localization/makeLocalizable.tsx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/packages/clerk-js/src/ui/localization/makeLocalizable.tsx b/packages/clerk-js/src/ui/localization/makeLocalizable.tsx
index a6c559aa0cb..aa0018e228c 100644
--- a/packages/clerk-js/src/ui/localization/makeLocalizable.tsx
+++ b/packages/clerk-js/src/ui/localization/makeLocalizable.tsx
@@ -69,11 +69,11 @@ export const useLocalizations = () => {
     if (!error || typeof error === 'string') {
       return t(error);
     }
-    const { code, message } = error || {};
+    const { code, message, longMessage } = error || {};
     if (!code) {
       return '';
     }
-    return t(localizationKeys(`unstable__errors.${code}` as any)) || message;
+    return t(localizationKeys(`unstable__errors.${code}` as any)) || longMessage || message;
   };
 
   return { t, translateError };

From 85d65f8ae962cb16b14ddf9b77b4bf42cb1423da Mon Sep 17 00:00:00 2001
From: George Desipris <george.desipris.56@gmail.com>
Date: Thu, 13 Oct 2022 10:54:02 +0300
Subject: [PATCH 33/41] feat(clerk-js): Make the whole ImpersonationFab
 draggable

---
 .../src/ui/ImpersonationFab/ImpersonationFab.tsx     | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/packages/clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx b/packages/clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx
index d66232e22d8..0cbd104750a 100644
--- a/packages/clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx
+++ b/packages/clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx
@@ -1,4 +1,4 @@
-import React, { PointerEventHandler, useEffect, useRef } from 'react';
+import React, { PointerEventHandler, TransitionEventHandler, useEffect, useRef, useState } from 'react';
 
 import { mqu, PropsOfComponent } from '../../ui/styledSystem';
 import { getFullName, getIdentifier } from '../../ui/utils';
@@ -174,6 +174,7 @@ export const ImpersonationFab = () => {
       <Flex
         ref={containerRef}
         elementDescriptor={descriptors.impersonationFab}
+        onPointerDown={onPointerDown}
         align='center'
         sx={t => ({
           position: 'fixed',
@@ -185,6 +186,9 @@ export const ImpersonationFab = () => {
           borderRadius: t.radii.$halfHeight, //to match the circular eye perfectly
           backgroundColor: t.colors.$white,
           fontFamily: t.fonts.$main,
+          ':hover': {
+            cursor: 'grab',
+          },
           ':hover #cl-impersonationText': {
             maxWidth: `min(calc(50vw - ${eyeWidth} - 2 * ${defaultRight}px), ${titleLength}ch)`,
             [mqu.md]: {
@@ -197,12 +201,6 @@ export const ImpersonationFab = () => {
         })}
       >
         <EyeCircle
-          onPointerDown={onPointerDown}
-          sx={{
-            ':hover': {
-              cursor: 'grab',
-            },
-          }}
           width={eyeWidth}
           height={eyeHeight}
         />

From 25c24b29564ea14e933ca6bfeb108b5fbeee0405 Mon Sep 17 00:00:00 2001
From: George Desipris <george.desipris.56@gmail.com>
Date: Thu, 13 Oct 2022 12:29:19 +0300
Subject: [PATCH 34/41] feat(clerk-js): Fade in text for ImpersonationFab

---
 .../clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx  | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/packages/clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx b/packages/clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx
index 0cbd104750a..866f9687fdf 100644
--- a/packages/clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx
+++ b/packages/clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx
@@ -1,4 +1,4 @@
-import React, { PointerEventHandler, TransitionEventHandler, useEffect, useRef, useState } from 'react';
+import React, { PointerEventHandler, useEffect, useRef } from 'react';
 
 import { mqu, PropsOfComponent } from '../../ui/styledSystem';
 import { getFullName, getIdentifier } from '../../ui/utils';
@@ -190,10 +190,12 @@ export const ImpersonationFab = () => {
             cursor: 'grab',
           },
           ':hover #cl-impersonationText': {
+            transition: `max-width ${t.transitionDuration.$slowest} ease, opacity ${t.transitionDuration.$slower} ease ${t.transitionDuration.$slowest}`,
             maxWidth: `min(calc(50vw - ${eyeWidth} - 2 * ${defaultRight}px), ${titleLength}ch)`,
             [mqu.md]: {
               maxWidth: `min(calc(100vw - ${eyeWidth} - 2 * ${defaultRight}px), ${titleLength}ch)`,
             },
+            opacity: 1,
           },
           ':hover #cl-impersonationEye': {
             transform: 'rotate(-180deg)',
@@ -208,8 +210,9 @@ export const ImpersonationFab = () => {
         <Flex
           id='cl-impersonationText'
           sx={t => ({
+            transition: `max-width ${t.transitionDuration.$slowest} ease, opacity ${t.transitionDuration.$fast} ease`,
             maxWidth: '0px',
-            transition: `max-width ${t.transitionDuration.$slowest} ease`,
+            opacity: 0,
           })}
         >
           <FabContent

From 49f4182d939fca922e6c190b3642a80d9b2f8b6a Mon Sep 17 00:00:00 2001
From: George Desipris <george.desipris.56@gmail.com>
Date: Thu, 13 Oct 2022 13:52:13 +0300
Subject: [PATCH 35/41] refactor(clerk-js): Code cleanup in ImpersonationFab

---
 .../clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx   | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/packages/clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx b/packages/clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx
index 866f9687fdf..dfcc1b4aede 100644
--- a/packages/clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx
+++ b/packages/clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx
@@ -27,14 +27,12 @@ const EyeCircle = ({ width, height, ...props }: EyeCircleProps) => {
   const { sx, ...rest } = props;
   return (
     <Col
-      id='cl-impersonationEye'
       elementDescriptor={descriptors.impersonationFabIconContainer}
       center
       sx={[
         t => ({
           width,
           height,
-          transition: `transform ${t.transitionDuration.$slowest} ease`,
           backgroundColor: t.colors.$danger500,
           borderRadius: t.radii.$circle,
         }),
@@ -203,8 +201,12 @@ export const ImpersonationFab = () => {
         })}
       >
         <EyeCircle
+          id='cl-impersonationEye'
           width={eyeWidth}
           height={eyeHeight}
+          sx={t => ({
+            transition: `transform ${t.transitionDuration.$slowest} ease`,
+          })}
         />
 
         <Flex

From b53d0a88b898e9aa8161906b671e0cd70c5ba2e9 Mon Sep 17 00:00:00 2001
From: George Desipris <george.desipris.56@gmail.com>
Date: Thu, 13 Oct 2022 14:06:07 +0300
Subject: [PATCH 36/41] fix(clerk-js): Consistent ImpersonationFab drag
 behaviour in mobile

---
 packages/clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx | 1 +
 1 file changed, 1 insertion(+)

diff --git a/packages/clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx b/packages/clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx
index dfcc1b4aede..6b5c7c03654 100644
--- a/packages/clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx
+++ b/packages/clerk-js/src/ui/ImpersonationFab/ImpersonationFab.tsx
@@ -175,6 +175,7 @@ export const ImpersonationFab = () => {
         onPointerDown={onPointerDown}
         align='center'
         sx={t => ({
+          touchAction: 'none', //for drag to work on mobile consistently
           position: 'fixed',
           overflow: 'hidden',
           top: `var(${topProperty}, ${defaultTop}px)`,

From 250a47daf561928e7d09b48873b19be4de28a581 Mon Sep 17 00:00:00 2001
From: Haris Chaniotakis <chanioxaris@gmail.com>
Date: Thu, 13 Oct 2022 13:19:19 +0300
Subject: [PATCH 37/41] feat(backend-core): Add support for updating user's
 totp secret and backup codes

https://www.notion.so/clerkdev/Allow-updating-totp_secret-backup_codes-for-a-user-via-BAPI-77ed76eeed3d4681b54f04e2ae566016
---
 packages/backend-core/API.md                                 | 3 +++
 .../backend-core/src/__tests__/endpoints/UserApi.test.ts     | 5 +++++
 packages/backend-core/src/api/endpoints/UserApi.ts           | 3 +++
 3 files changed, 11 insertions(+)

diff --git a/packages/backend-core/API.md b/packages/backend-core/API.md
index 1927cf54e1a..02aed20385b 100644
--- a/packages/backend-core/API.md
+++ b/packages/backend-core/API.md
@@ -560,6 +560,7 @@ Available parameters are:
 - _firstName_ User's first name.
 - _lastName_ User's last name.
 - _totpSecret_ User's secret for TOTP. Useful while migrating users with enabled 2FA Authenticator Apps.
+- _backupCodes_ User's backup codes. Useful while migrating users with already existed 2FA backup codes.
 - _publicMetadata_ Metadata saved on the user, that is visible to both your Frontend and Backend APIs.
 - _privateMetadata_ Metadata saved on the user, that is only visible to your Backend API.
 - _unsafeMetadata_ Metadata saved on the user, that can be updated from both the Frontend and Backend APIs. Note: Since this data can be modified from the frontend, it is not guaranteed to be safe.
@@ -587,6 +588,8 @@ Supported user attributes for update are:
 | primaryPhoneNumberID  |         string          |
 |    publicMetadata     | Record<string, unknown> |
 |    privateMetadata    | Record<string, unknown> |
+|      totpSecret       |         string          |
+|      backupCodes      |        string[]         |
 
 #### deleteUser(userId)
 
diff --git a/packages/backend-core/src/__tests__/endpoints/UserApi.test.ts b/packages/backend-core/src/__tests__/endpoints/UserApi.test.ts
index 961995e5774..d2e6ffa5c49 100644
--- a/packages/backend-core/src/__tests__/endpoints/UserApi.test.ts
+++ b/packages/backend-core/src/__tests__/endpoints/UserApi.test.ts
@@ -148,6 +148,7 @@ test('createUser() creates a user', async () => {
     firstName: 'Boss',
     lastName: 'Clerk',
     totpSecret: 'AICJ3HCXKO4KOY6NDH6RII4E3ZYL5ZBH',
+    backupCodes: ['1234', 'abcd'],
   };
 
   nock(defaultServerAPIUrl)
@@ -169,6 +170,8 @@ test('updateUser() updates a user', async () => {
         nestedKey: 42,
       },
     },
+    totpSecret: 'AICJ3HCXKO4KOY6NDH6RII4E3ZYL5ZBH',
+    backupCodes: ['1234', 'abcd'],
   };
 
   nock(defaultServerAPIUrl)
@@ -181,6 +184,8 @@ test('updateUser() updates a user', async () => {
           nestedKey: 42,
         },
       },
+      totp_secret: 'AICJ3HCXKO4KOY6NDH6RII4E3ZYL5ZBH',
+      backup_codes: ['1234', 'abcd'],
     })
     .replyWithFile(200, __dirname + '/responses/updateUser.json', {
       'Content-Type': '',
diff --git a/packages/backend-core/src/api/endpoints/UserApi.ts b/packages/backend-core/src/api/endpoints/UserApi.ts
index f2c50c52213..0ebbcb6e189 100644
--- a/packages/backend-core/src/api/endpoints/UserApi.ts
+++ b/packages/backend-core/src/api/endpoints/UserApi.ts
@@ -36,6 +36,7 @@ type CreateUserParams = {
   skipPasswordChecks?: boolean;
   skipPasswordRequirement?: boolean;
   totpSecret?: string;
+  backupCodes?: string[];
 } & UserMetadataParams;
 
 interface UpdateUserParams extends UserMetadataParams {
@@ -45,6 +46,8 @@ interface UpdateUserParams extends UserMetadataParams {
   password?: string;
   primaryEmailAddressID?: string;
   primaryPhoneNumberID?: string;
+  totpSecret?: string;
+  backupCodes?: string[];
 }
 
 type GetOrganizationMembershipListParams = {

From 443149f314022910caa78f32a4a47951122e3f74 Mon Sep 17 00:00:00 2001
From: Sokratis Vidros <sokratis.vidros@gmail.com>
Date: Thu, 13 Oct 2022 21:28:55 +0300
Subject: [PATCH 38/41] chore(release): Publish

 - @clerk/backend-core@2.8.2-staging.0
 - @clerk/clerk-js@4.10.0-staging.0
 - @clerk/edge@1.12.3-staging.0
 - eslint-config-custom@0.0.1-staging.0
 - @clerk/clerk-expo@0.9.63-staging.0
 - @clerk/nextjs@4.5.3-staging.0
 - @clerk/clerk-react@4.3.0-staging.0
 - @clerk/remix@1.3.7-staging.0
 - @clerk/clerk-sdk-node@4.4.3-staging.0
 - @clerk/shared@0.0.2-staging.0
 - @clerk/themes@1.2.18-staging.0
 - @clerk/types@3.11.0-staging.0
---
 package-lock.json                          | 149 ++++++++++++++-------
 packages/backend-core/package.json         |   4 +-
 packages/clerk-js/package.json             |   6 +-
 packages/edge/package.json                 |   6 +-
 packages/edge/src/info.ts                  |   2 +-
 packages/eslint-config-custom/package.json |   8 +-
 packages/expo/package.json                 |   8 +-
 packages/nextjs/package.json               |  10 +-
 packages/react/package.json                |   4 +-
 packages/react/src/info.ts                 |   2 +-
 packages/remix/package.json                |   8 +-
 packages/sdk-node/package.json             |   6 +-
 packages/sdk-node/src/info.ts              |   2 +-
 packages/shared/package.json               |   6 +-
 packages/themes/package.json               |   4 +-
 packages/types/package.json                |   2 +-
 16 files changed, 136 insertions(+), 91 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index f26f042be78..ef4d4633e8c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -38043,10 +38043,10 @@
     },
     "packages/backend-core": {
       "name": "@clerk/backend-core",
-      "version": "2.8.1",
+      "version": "2.8.2-staging.0",
       "license": "MIT",
       "dependencies": {
-        "@clerk/types": "^3.10.1",
+        "@clerk/types": "^3.11.0-staging.0",
         "@peculiar/webcrypto": "^1.4.0",
         "@types/node": "^16.11.55",
         "@types/node-fetch": "^2",
@@ -38093,11 +38093,11 @@
     },
     "packages/clerk-js": {
       "name": "@clerk/clerk-js",
-      "version": "4.9.0",
+      "version": "4.10.0-staging.0",
       "license": "MIT",
       "dependencies": {
-        "@clerk/shared": "^0.0.1",
-        "@clerk/types": "^3.10.1",
+        "@clerk/shared": "^0.0.2-staging.0",
+        "@clerk/types": "^3.11.0-staging.0",
         "@emotion/cache": "^11.7.1",
         "@emotion/react": "^11.9.0",
         "@floating-ui/react-dom-interactions": "^0.6.3",
@@ -38256,11 +38256,11 @@
     },
     "packages/edge": {
       "name": "@clerk/edge",
-      "version": "1.12.2",
+      "version": "1.12.3-staging.0",
       "license": "MIT",
       "dependencies": {
-        "@clerk/backend-core": "^2.8.1",
-        "@clerk/types": "^3.10.1",
+        "@clerk/backend-core": "^2.8.2-staging.0",
+        "@clerk/types": "^3.11.0-staging.0",
         "@peculiar/webcrypto": "^1.4.0",
         "@types/node": "^16.11.55",
         "next": "^12.2.0"
@@ -38547,7 +38547,7 @@
       }
     },
     "packages/eslint-config-custom": {
-      "version": "0.0.0",
+      "version": "0.0.1-staging.0",
       "license": "MIT",
       "dependencies": {
         "@typescript-eslint/eslint-plugin": "^5.15.0",
@@ -38622,16 +38622,16 @@
     },
     "packages/expo": {
       "name": "@clerk/clerk-expo",
-      "version": "0.9.62",
+      "version": "0.9.63-staging.0",
       "license": "MIT",
       "dependencies": {
-        "@clerk/clerk-js": "^4.9.0",
-        "@clerk/clerk-react": "^4.2.6",
+        "@clerk/clerk-js": "^4.10.0-staging.0",
+        "@clerk/clerk-react": "^4.3.0-staging.0",
         "base-64": "^1.0.0",
         "react-native-url-polyfill": "^1.3.0"
       },
       "devDependencies": {
-        "@clerk/types": "^3.10.1",
+        "@clerk/types": "^3.11.0-staging.0",
         "@types/jest": "^27.4.0",
         "@types/node": "^16.11.55",
         "@types/react": "^17.0.39",
@@ -38695,6 +38695,22 @@
         "node": ">=14"
       }
     },
+    "packages/gatsby-plugin-clerk/node_modules/@clerk/clerk-react": {
+      "version": "4.2.6",
+      "resolved": "https://registry.npmjs.org/@clerk/clerk-react/-/clerk-react-4.2.6.tgz",
+      "integrity": "sha512-830Ykdr9vI8Ld8lBybZWAXXmxSYlxnZOsc8RQF1StEtACF0tFnga+AO7Amgi0z2s8yiX/EsT84SxK0fwLOekHQ==",
+      "dependencies": {
+        "@clerk/types": "^3.10.1",
+        "swr": "^1.3.0",
+        "tslib": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "react": ">=16"
+      }
+    },
     "packages/gatsby-plugin-clerk/node_modules/@clerk/clerk-sdk-node": {
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/@clerk/clerk-sdk-node/-/clerk-sdk-node-4.3.0.tgz",
@@ -38732,6 +38748,17 @@
         "node": ">=8"
       }
     },
+    "packages/gatsby-plugin-clerk/node_modules/@clerk/types": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/@clerk/types/-/types-3.10.1.tgz",
+      "integrity": "sha512-RZgTSkWu0CWeAWKw0WaYOVu7O/vlLsvBN4rptxDH5c4uQOgRmF/wBILmniSCmBMhyyihTW2pfiXsZpCatbJixQ==",
+      "dependencies": {
+        "csstype": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=14"
+      }
+    },
     "packages/gatsby-plugin-clerk/node_modules/@types/cookie": {
       "version": "0.5.0",
       "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.0.tgz",
@@ -38753,13 +38780,13 @@
     },
     "packages/nextjs": {
       "name": "@clerk/nextjs",
-      "version": "4.5.2",
+      "version": "4.5.3-staging.0",
       "license": "MIT",
       "dependencies": {
-        "@clerk/clerk-react": "^4.2.6",
-        "@clerk/clerk-sdk-node": "^4.4.2",
-        "@clerk/edge": "^1.12.2",
-        "@clerk/types": "^3.10.1",
+        "@clerk/clerk-react": "^4.3.0-staging.0",
+        "@clerk/clerk-sdk-node": "^4.4.3-staging.0",
+        "@clerk/edge": "^1.12.3-staging.0",
+        "@clerk/types": "^3.11.0-staging.0",
         "tslib": "^2.3.1"
       },
       "devDependencies": {
@@ -39085,10 +39112,10 @@
     },
     "packages/react": {
       "name": "@clerk/clerk-react",
-      "version": "4.2.6",
+      "version": "4.3.0-staging.0",
       "license": "MIT",
       "dependencies": {
-        "@clerk/types": "^3.10.1",
+        "@clerk/types": "^3.11.0-staging.0",
         "swr": "^1.3.0",
         "tslib": "^2.3.1"
       },
@@ -39126,12 +39153,12 @@
     },
     "packages/remix": {
       "name": "@clerk/remix",
-      "version": "1.3.6",
+      "version": "1.3.7-staging.0",
       "license": "MIT",
       "dependencies": {
-        "@clerk/clerk-react": "^4.2.6",
-        "@clerk/clerk-sdk-node": "^4.4.2",
-        "@clerk/types": "^3.10.1",
+        "@clerk/clerk-react": "^4.3.0-staging.0",
+        "@clerk/clerk-sdk-node": "^4.4.3-staging.0",
+        "@clerk/types": "^3.11.0-staging.0",
         "cookie": "^0.5.0",
         "tslib": "^2.3.1"
       },
@@ -39177,11 +39204,11 @@
     },
     "packages/sdk-node": {
       "name": "@clerk/clerk-sdk-node",
-      "version": "4.4.2",
+      "version": "4.4.3-staging.0",
       "license": "MIT",
       "dependencies": {
-        "@clerk/backend-core": "^2.8.1",
-        "@clerk/types": "^3.10.1",
+        "@clerk/backend-core": "^2.8.2-staging.0",
+        "@clerk/types": "^3.11.0-staging.0",
         "@peculiar/webcrypto": "^1.4.0",
         "@types/cookies": "^0.7.7",
         "@types/express": "^4.17.11",
@@ -39223,10 +39250,10 @@
     },
     "packages/shared": {
       "name": "@clerk/shared",
-      "version": "0.0.1",
+      "version": "0.0.2-staging.0",
       "license": "ISC",
       "devDependencies": {
-        "@clerk/types": "^3.10.1",
+        "@clerk/types": "^3.11.0-staging.0",
         "@types/js-cookie": "^3.0.2",
         "js-cookie": "^3.0.1",
         "tsup": "^6.2.3",
@@ -39245,10 +39272,10 @@
     },
     "packages/themes": {
       "name": "@clerk/themes",
-      "version": "1.2.17",
+      "version": "1.2.18-staging.0",
       "license": "MIT",
       "devDependencies": {
-        "@clerk/types": "^3.10.1",
+        "@clerk/types": "^3.11.0-staging.0",
         "typescript": "*"
       },
       "engines": {
@@ -39260,7 +39287,7 @@
     },
     "packages/types": {
       "name": "@clerk/types",
-      "version": "3.10.1",
+      "version": "3.11.0-staging.0",
       "license": "MIT",
       "dependencies": {
         "csstype": "^3.1.0"
@@ -40732,7 +40759,7 @@
     "@clerk/backend-core": {
       "version": "file:packages/backend-core",
       "requires": {
-        "@clerk/types": "^3.10.1",
+        "@clerk/types": "^3.11.0-staging.0",
         "@peculiar/webcrypto": "^1.4.0",
         "@types/jest": "^27.4.0",
         "@types/node": "^16.11.55",
@@ -40757,9 +40784,9 @@
     "@clerk/clerk-expo": {
       "version": "file:packages/expo",
       "requires": {
-        "@clerk/clerk-js": "^4.9.0",
-        "@clerk/clerk-react": "^4.2.6",
-        "@clerk/types": "^3.10.1",
+        "@clerk/clerk-js": "^4.10.0-staging.0",
+        "@clerk/clerk-react": "^4.3.0-staging.0",
+        "@clerk/types": "^3.11.0-staging.0",
         "@types/jest": "^27.4.0",
         "@types/node": "^16.11.55",
         "@types/react": "^17.0.39",
@@ -40791,8 +40818,8 @@
         "@babel/preset-env": "^7.12.1",
         "@babel/preset-react": "^7.12.5",
         "@babel/preset-typescript": "^7.12.1",
-        "@clerk/shared": "^0.0.1",
-        "@clerk/types": "^3.10.1",
+        "@clerk/shared": "^0.0.2-staging.0",
+        "@clerk/types": "^3.11.0-staging.0",
         "@emotion/cache": "^11.7.1",
         "@emotion/react": "^11.9.0",
         "@floating-ui/react-dom-interactions": "^0.6.3",
@@ -40900,7 +40927,7 @@
     "@clerk/clerk-react": {
       "version": "file:packages/react",
       "requires": {
-        "@clerk/types": "^3.10.1",
+        "@clerk/types": "^3.11.0-staging.0",
         "@testing-library/dom": "^7.28.1",
         "@testing-library/jest-dom": "^5.11.6",
         "@testing-library/react": "^11.2.1",
@@ -40933,8 +40960,8 @@
     "@clerk/clerk-sdk-node": {
       "version": "file:packages/sdk-node",
       "requires": {
-        "@clerk/backend-core": "^2.8.1",
-        "@clerk/types": "^3.10.1",
+        "@clerk/backend-core": "^2.8.2-staging.0",
+        "@clerk/types": "^3.11.0-staging.0",
         "@peculiar/webcrypto": "^1.4.0",
         "@types/cookies": "^0.7.7",
         "@types/express": "^4.17.11",
@@ -40971,8 +40998,8 @@
     "@clerk/edge": {
       "version": "file:packages/edge",
       "requires": {
-        "@clerk/backend-core": "^2.8.1",
-        "@clerk/types": "^3.10.1",
+        "@clerk/backend-core": "^2.8.2-staging.0",
+        "@clerk/types": "^3.11.0-staging.0",
         "@peculiar/webcrypto": "^1.4.0",
         "@types/jest": "^27.4.0",
         "@types/node": "^16.11.55",
@@ -41113,10 +41140,10 @@
     "@clerk/nextjs": {
       "version": "file:packages/nextjs",
       "requires": {
-        "@clerk/clerk-react": "^4.2.6",
-        "@clerk/clerk-sdk-node": "^4.4.2",
-        "@clerk/edge": "^1.12.2",
-        "@clerk/types": "^3.10.1",
+        "@clerk/clerk-react": "^4.3.0-staging.0",
+        "@clerk/clerk-sdk-node": "^4.4.3-staging.0",
+        "@clerk/edge": "^1.12.3-staging.0",
+        "@clerk/types": "^3.11.0-staging.0",
         "@types/jest": "^27.4.0",
         "@types/node": "^16.11.55",
         "@types/react": "^17.0.39",
@@ -41281,9 +41308,9 @@
     "@clerk/remix": {
       "version": "file:packages/remix",
       "requires": {
-        "@clerk/clerk-react": "^4.2.6",
-        "@clerk/clerk-sdk-node": "^4.4.2",
-        "@clerk/types": "^3.10.1",
+        "@clerk/clerk-react": "^4.3.0-staging.0",
+        "@clerk/clerk-sdk-node": "^4.4.3-staging.0",
+        "@clerk/types": "^3.11.0-staging.0",
         "@types/cookie": "^0.5.0",
         "@types/jest": "^27.4.0",
         "@types/node": "^16.11.55",
@@ -41320,7 +41347,7 @@
     "@clerk/shared": {
       "version": "file:packages/shared",
       "requires": {
-        "@clerk/types": "^3.10.1",
+        "@clerk/types": "^3.11.0-staging.0",
         "@types/js-cookie": "^3.0.2",
         "js-cookie": "^3.0.1",
         "tsup": "^6.2.3",
@@ -41331,7 +41358,7 @@
     "@clerk/themes": {
       "version": "file:packages/themes",
       "requires": {
-        "@clerk/types": "^3.10.1",
+        "@clerk/types": "^3.11.0-staging.0",
         "typescript": "*"
       }
     },
@@ -55133,6 +55160,16 @@
             "tslib": "^2.3.1"
           }
         },
+        "@clerk/clerk-react": {
+          "version": "4.2.6",
+          "resolved": "https://registry.npmjs.org/@clerk/clerk-react/-/clerk-react-4.2.6.tgz",
+          "integrity": "sha512-830Ykdr9vI8Ld8lBybZWAXXmxSYlxnZOsc8RQF1StEtACF0tFnga+AO7Amgi0z2s8yiX/EsT84SxK0fwLOekHQ==",
+          "requires": {
+            "@clerk/types": "^3.10.1",
+            "swr": "^1.3.0",
+            "tslib": "^2.3.1"
+          }
+        },
         "@clerk/clerk-sdk-node": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/@clerk/clerk-sdk-node/-/clerk-sdk-node-4.3.0.tgz",
@@ -55166,6 +55203,14 @@
             }
           }
         },
+        "@clerk/types": {
+          "version": "3.10.1",
+          "resolved": "https://registry.npmjs.org/@clerk/types/-/types-3.10.1.tgz",
+          "integrity": "sha512-RZgTSkWu0CWeAWKw0WaYOVu7O/vlLsvBN4rptxDH5c4uQOgRmF/wBILmniSCmBMhyyihTW2pfiXsZpCatbJixQ==",
+          "requires": {
+            "csstype": "^3.1.0"
+          }
+        },
         "@types/cookie": {
           "version": "0.5.0",
           "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.0.tgz",
diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json
index 178e0bb4c06..fb4fd423f71 100644
--- a/packages/backend-core/package.json
+++ b/packages/backend-core/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/backend-core",
-  "version": "2.8.1",
+  "version": "2.8.2-staging.0",
   "license": "MIT",
   "description": "Clerk Backend API core resources and authentication utilities for JavaScript environments.",
   "scripts": {
@@ -14,7 +14,7 @@
   "main": "dist/cjs/index.js",
   "module": "dist/mjs/index.js",
   "dependencies": {
-    "@clerk/types": "^3.10.1",
+    "@clerk/types": "^3.11.0-staging.0",
     "@peculiar/webcrypto": "^1.4.0",
     "@types/node": "^16.11.55",
     "@types/node-fetch": "^2",
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index aaea1705cf2..1af467c54d4 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/clerk-js",
-  "version": "4.9.0",
+  "version": "4.10.0-staging.0",
   "license": "MIT",
   "description": "Clerk.dev JS library",
   "keywords": [
@@ -38,8 +38,8 @@
     "test:coverage": "jest --collectCoverage"
   },
   "dependencies": {
-    "@clerk/types": "^3.10.1",
-    "@clerk/shared": "^0.0.1",
+    "@clerk/shared": "^0.0.2-staging.0",
+    "@clerk/types": "^3.11.0-staging.0",
     "@emotion/cache": "^11.7.1",
     "@emotion/react": "^11.9.0",
     "@floating-ui/react-dom-interactions": "^0.6.3",
diff --git a/packages/edge/package.json b/packages/edge/package.json
index 589605f774a..e42bbf72421 100644
--- a/packages/edge/package.json
+++ b/packages/edge/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/edge",
-  "version": "1.12.2",
+  "version": "1.12.3-staging.0",
   "license": "MIT",
   "description": "Clerk SDK for serverless and edge environments",
   "keywords": [
@@ -38,8 +38,8 @@
     "lint": "eslint ."
   },
   "dependencies": {
-    "@clerk/backend-core": "^2.8.1",
-    "@clerk/types": "^3.10.1",
+    "@clerk/backend-core": "^2.8.2-staging.0",
+    "@clerk/types": "^3.11.0-staging.0",
     "@peculiar/webcrypto": "^1.4.0",
     "@types/node": "^16.11.55",
     "next": "^12.2.0"
diff --git a/packages/edge/src/info.ts b/packages/edge/src/info.ts
index b237dcaf750..721552396ee 100644
--- a/packages/edge/src/info.ts
+++ b/packages/edge/src/info.ts
@@ -1,3 +1,3 @@
 /** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */
-export const LIB_VERSION = '1.12.2';
+export const LIB_VERSION = '1.12.3-staging.0';
 export const LIB_NAME = '@clerk/edge';
diff --git a/packages/eslint-config-custom/package.json b/packages/eslint-config-custom/package.json
index 64700ad4a0c..46efaf665bf 100644
--- a/packages/eslint-config-custom/package.json
+++ b/packages/eslint-config-custom/package.json
@@ -1,14 +1,14 @@
 {
   "name": "eslint-config-custom",
-  "version": "0.0.0",
+  "version": "0.0.1-staging.0",
   "main": "index.js",
   "license": "MIT",
   "dependencies": {
-    "eslint-config-prettier": "^8.5.0",
-    "eslint-plugin-react": "7.28.0",
-    "eslint-config-turbo": "latest",
     "@typescript-eslint/eslint-plugin": "^5.15.0",
     "@typescript-eslint/parser": "^5.15.0",
+    "eslint-config-prettier": "^8.5.0",
+    "eslint-config-turbo": "latest",
+    "eslint-plugin-react": "7.28.0",
     "eslint-plugin-simple-import-sort": "^7.0.0"
   },
   "publishConfig": {
diff --git a/packages/expo/package.json b/packages/expo/package.json
index 6a18a01f5ec..aaf08219ec4 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/clerk-expo",
-  "version": "0.9.62",
+  "version": "0.9.63-staging.0",
   "license": "MIT",
   "description": "Clerk.dev React Native/Expo library",
   "keywords": [
@@ -27,13 +27,13 @@
     "lint": "eslint ."
   },
   "dependencies": {
-    "@clerk/clerk-js": "^4.9.0",
-    "@clerk/clerk-react": "^4.2.6",
+    "@clerk/clerk-js": "^4.10.0-staging.0",
+    "@clerk/clerk-react": "^4.3.0-staging.0",
     "base-64": "^1.0.0",
     "react-native-url-polyfill": "^1.3.0"
   },
   "devDependencies": {
-    "@clerk/types": "^3.10.1",
+    "@clerk/types": "^3.11.0-staging.0",
     "@types/jest": "^27.4.0",
     "@types/node": "^16.11.55",
     "@types/react": "^17.0.39",
diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json
index 2f0a03e8978..63eb77f64c3 100644
--- a/packages/nextjs/package.json
+++ b/packages/nextjs/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/nextjs",
-  "version": "4.5.2",
+  "version": "4.5.3-staging.0",
   "license": "MIT",
   "description": "Clerk.dev SDK for NextJS",
   "keywords": [
@@ -35,10 +35,10 @@
     "dev": "tsc -p tsconfig.build.json --watch"
   },
   "dependencies": {
-    "@clerk/clerk-react": "^4.2.6",
-    "@clerk/clerk-sdk-node": "^4.4.2",
-    "@clerk/edge": "^1.12.2",
-    "@clerk/types": "^3.10.1",
+    "@clerk/clerk-react": "^4.3.0-staging.0",
+    "@clerk/clerk-sdk-node": "^4.4.3-staging.0",
+    "@clerk/edge": "^1.12.3-staging.0",
+    "@clerk/types": "^3.11.0-staging.0",
     "tslib": "^2.3.1"
   },
   "devDependencies": {
diff --git a/packages/react/package.json b/packages/react/package.json
index 2547e6b46a4..56bfcd49bc5 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/clerk-react",
-  "version": "4.2.6",
+  "version": "4.3.0-staging.0",
   "license": "MIT",
   "description": "Clerk.dev React library",
   "keywords": [
@@ -29,7 +29,7 @@
     "test": "jest"
   },
   "dependencies": {
-    "@clerk/types": "^3.10.1",
+    "@clerk/types": "^3.11.0-staging.0",
     "swr": "^1.3.0",
     "tslib": "^2.3.1"
   },
diff --git a/packages/react/src/info.ts b/packages/react/src/info.ts
index 290f7494513..b91a8b3734c 100644
--- a/packages/react/src/info.ts
+++ b/packages/react/src/info.ts
@@ -1,3 +1,3 @@
 /** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */
-export const LIB_VERSION = '4.2.6';
+export const LIB_VERSION = '4.3.0-staging.0';
 export const LIB_NAME = '@clerk/clerk-react';
diff --git a/packages/remix/package.json b/packages/remix/package.json
index 03e4fad55ab..7d2c8ec63b5 100644
--- a/packages/remix/package.json
+++ b/packages/remix/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/remix",
-  "version": "1.3.6",
+  "version": "1.3.7-staging.0",
   "license": "MIT",
   "description": "Clerk.dev SDK for Remix",
   "keywords": [
@@ -33,9 +33,9 @@
     "lint": "eslint ."
   },
   "dependencies": {
-    "@clerk/clerk-react": "^4.2.6",
-    "@clerk/clerk-sdk-node": "^4.4.2",
-    "@clerk/types": "^3.10.1",
+    "@clerk/clerk-react": "^4.3.0-staging.0",
+    "@clerk/clerk-sdk-node": "^4.4.3-staging.0",
+    "@clerk/types": "^3.11.0-staging.0",
     "cookie": "^0.5.0",
     "tslib": "^2.3.1"
   },
diff --git a/packages/sdk-node/package.json b/packages/sdk-node/package.json
index 3abf5747834..9c7ec5692bc 100644
--- a/packages/sdk-node/package.json
+++ b/packages/sdk-node/package.json
@@ -1,5 +1,5 @@
 {
-  "version": "4.4.2",
+  "version": "4.4.3-staging.0",
   "license": "MIT",
   "main": "dist/cjs/index.js",
   "module": "dist/esm/index.js",
@@ -38,8 +38,8 @@
     "typescript": "*"
   },
   "dependencies": {
-    "@clerk/backend-core": "^2.8.1",
-    "@clerk/types": "^3.10.1",
+    "@clerk/backend-core": "^2.8.2-staging.0",
+    "@clerk/types": "^3.11.0-staging.0",
     "@peculiar/webcrypto": "^1.4.0",
     "@types/cookies": "^0.7.7",
     "@types/express": "^4.17.11",
diff --git a/packages/sdk-node/src/info.ts b/packages/sdk-node/src/info.ts
index 4ddc7902d06..00ccc413759 100644
--- a/packages/sdk-node/src/info.ts
+++ b/packages/sdk-node/src/info.ts
@@ -1,3 +1,3 @@
 /** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */
-export const LIB_VERSION = '4.4.2';
+export const LIB_VERSION = '4.4.3-staging.0';
 export const LIB_NAME = '@clerk/clerk-sdk-node';
diff --git a/packages/shared/package.json b/packages/shared/package.json
index 1aacd2ecc98..38db2a57a04 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/shared",
-  "version": "0.0.1",
+  "version": "0.0.2-staging.0",
   "description": "Internal package utils used by the Clerk SDKs",
   "types": "./dist/types/index.d.ts",
   "main": "./dist/index.js",
@@ -18,9 +18,9 @@
     "test:watch": "vitest"
   },
   "devDependencies": {
-    "js-cookie": "^3.0.1",
-    "@clerk/types": "^3.10.1",
+    "@clerk/types": "^3.11.0-staging.0",
     "@types/js-cookie": "^3.0.2",
+    "js-cookie": "^3.0.1",
     "tsup": "^6.2.3",
     "typescript": "*",
     "vitest": "^0.23.4"
diff --git a/packages/themes/package.json b/packages/themes/package.json
index b77231a8274..9d7eec742b0 100644
--- a/packages/themes/package.json
+++ b/packages/themes/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/themes",
-  "version": "1.2.17",
+  "version": "1.2.18-staging.0",
   "license": "MIT",
   "description": "Themes for the Clerk auth components",
   "keywords": [
@@ -28,7 +28,7 @@
     "lint": "eslint ."
   },
   "devDependencies": {
-    "@clerk/types": "^3.10.1",
+    "@clerk/types": "^3.11.0-staging.0",
     "typescript": "*"
   },
   "peerDependencies": {
diff --git a/packages/types/package.json b/packages/types/package.json
index 89066632e3d..f7fc04ca0ea 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/types",
-  "version": "3.10.1",
+  "version": "3.11.0-staging.0",
   "license": "MIT",
   "description": "Typings for Clerk libraries.",
   "keywords": [

From 6430d127b517b4b65d8ab3f5fac02a8b3380cbd2 Mon Sep 17 00:00:00 2001
From: Sokratis Vidros <sokratis.vidros@gmail.com>
Date: Thu, 13 Oct 2022 21:47:01 +0300
Subject: [PATCH 39/41] chore(repo): Make eslint-config-custom private

---
 packages/eslint-config-custom/package.json | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/packages/eslint-config-custom/package.json b/packages/eslint-config-custom/package.json
index 46efaf665bf..64add6adbb8 100644
--- a/packages/eslint-config-custom/package.json
+++ b/packages/eslint-config-custom/package.json
@@ -2,6 +2,7 @@
   "name": "eslint-config-custom",
   "version": "0.0.1-staging.0",
   "main": "index.js",
+  "private": true,
   "license": "MIT",
   "dependencies": {
     "@typescript-eslint/eslint-plugin": "^5.15.0",
@@ -10,8 +11,5 @@
     "eslint-config-turbo": "latest",
     "eslint-plugin-react": "7.28.0",
     "eslint-plugin-simple-import-sort": "^7.0.0"
-  },
-  "publishConfig": {
-    "access": "public"
   }
 }

From 8858d053fdd221024d18e9502bce6621dbbd80b9 Mon Sep 17 00:00:00 2001
From: Sokratis Vidros <sokratis.vidros@gmail.com>
Date: Thu, 13 Oct 2022 21:59:03 +0300
Subject: [PATCH 40/41] chore(repo): Update package.json

---
 packages/backend-core/package.json | 3 ++-
 packages/clerk-js/package.json     | 3 ++-
 packages/edge/package.json         | 3 ++-
 packages/expo/package.json         | 3 ++-
 packages/nextjs/package.json       | 3 ++-
 packages/react/package.json        | 3 ++-
 packages/remix/package.json        | 3 ++-
 packages/sdk-node/package.json     | 3 ++-
 packages/shared/package.json       | 6 +++++-
 9 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json
index fb4fd423f71..73839058db5 100644
--- a/packages/backend-core/package.json
+++ b/packages/backend-core/package.json
@@ -43,5 +43,6 @@
   "homepage": "https://clerk.dev/",
   "engines": {
     "node": ">=14"
-  }
+  },
+  "gitHead": "1b19a43b61f712756ab4d8c9ccbee6e8bddbe4ce"
 }
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index 1af467c54d4..763f055104e 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -133,5 +133,6 @@
   "homepage": "https://clerk.dev/",
   "bugs": {
     "url": "https://github.com/clerkinc/javascript/issues"
-  }
+  },
+  "gitHead": "1b19a43b61f712756ab4d8c9ccbee6e8bddbe4ce"
 }
diff --git a/packages/edge/package.json b/packages/edge/package.json
index e42bbf72421..69a823803df 100644
--- a/packages/edge/package.json
+++ b/packages/edge/package.json
@@ -62,5 +62,6 @@
   },
   "bugs": {
     "url": "https://github.com/clerkinc/javascript/issues"
-  }
+  },
+  "gitHead": "1b19a43b61f712756ab4d8c9ccbee6e8bddbe4ce"
 }
diff --git a/packages/expo/package.json b/packages/expo/package.json
index aaf08219ec4..69db82aedf1 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -61,5 +61,6 @@
   "bugs": {
     "url": "https://github.com/clerkinc/javascript/issues"
   },
-  "homepage": "https://clerk.dev/"
+  "homepage": "https://clerk.dev/",
+  "gitHead": "1b19a43b61f712756ab4d8c9ccbee6e8bddbe4ce"
 }
diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json
index 63eb77f64c3..cbfd09a3791 100644
--- a/packages/nextjs/package.json
+++ b/packages/nextjs/package.json
@@ -69,5 +69,6 @@
   "bugs": {
     "url": "https://github.com/clerkinc/javascript/issues"
   },
-  "homepage": "https://clerk.dev/"
+  "homepage": "https://clerk.dev/",
+  "gitHead": "1b19a43b61f712756ab4d8c9ccbee6e8bddbe4ce"
 }
diff --git a/packages/react/package.json b/packages/react/package.json
index 56bfcd49bc5..34aa740fd7f 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -68,5 +68,6 @@
   "homepage": "https://clerk.dev/",
   "bugs": {
     "url": "https://github.com/clerkinc/javascript/issues"
-  }
+  },
+  "gitHead": "1b19a43b61f712756ab4d8c9ccbee6e8bddbe4ce"
 }
diff --git a/packages/remix/package.json b/packages/remix/package.json
index 7d2c8ec63b5..982cbfa1c7e 100644
--- a/packages/remix/package.json
+++ b/packages/remix/package.json
@@ -68,5 +68,6 @@
   "bugs": {
     "url": "https://github.com/clerkinc/javascript/issues"
   },
-  "homepage": "https://clerk.dev/"
+  "homepage": "https://clerk.dev/",
+  "gitHead": "1b19a43b61f712756ab4d8c9ccbee6e8bddbe4ce"
 }
diff --git a/packages/sdk-node/package.json b/packages/sdk-node/package.json
index 9c7ec5692bc..86b777b1521 100644
--- a/packages/sdk-node/package.json
+++ b/packages/sdk-node/package.json
@@ -70,5 +70,6 @@
   "homepage": "https://clerk.dev/",
   "publishConfig": {
     "access": "public"
-  }
+  },
+  "gitHead": "1b19a43b61f712756ab4d8c9ccbee6e8bddbe4ce"
 }
diff --git a/packages/shared/package.json b/packages/shared/package.json
index 38db2a57a04..23e8798680a 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -35,5 +35,9 @@
     "react-dom": "17.0.2"
   },
   "author": "",
-  "license": "ISC"
+  "license": "ISC",
+  "gitHead": "1b19a43b61f712756ab4d8c9ccbee6e8bddbe4ce",
+  "publishConfig": {
+    "access": "public"
+  }
 }

From 7226373edb46763ce006eeba4716d99c16fec47e Mon Sep 17 00:00:00 2001
From: Sokratis Vidros <sokratis.vidros@gmail.com>
Date: Thu, 13 Oct 2022 22:00:49 +0300
Subject: [PATCH 41/41] chore(release): Publish

 - @clerk/backend-core@2.9.0-staging.0
 - @clerk/clerk-js@4.10.0-staging.1
 - @clerk/edge@1.12.3-staging.1
 - eslint-config-custom@0.0.1-staging.1
 - @clerk/clerk-expo@0.9.63-staging.1
 - @clerk/nextjs@4.5.3-staging.1
 - @clerk/clerk-react@4.3.0-staging.1
 - @clerk/remix@1.3.7-staging.1
 - @clerk/clerk-sdk-node@4.4.3-staging.1
 - @clerk/shared@0.0.2-staging.1
 - @clerk/themes@1.2.18-staging.1
 - @clerk/types@3.11.0-staging.1
---
 package-lock.json                          | 104 ++++++++++-----------
 packages/backend-core/CHANGELOG.md         |   6 ++
 packages/backend-core/package.json         |   4 +-
 packages/clerk-js/CHANGELOG.md             |  29 ++++++
 packages/clerk-js/package.json             |   6 +-
 packages/edge/CHANGELOG.md                 |   4 +
 packages/edge/package.json                 |   6 +-
 packages/edge/src/info.ts                  |   2 +-
 packages/eslint-config-custom/CHANGELOG.md |   8 ++
 packages/eslint-config-custom/package.json |   2 +-
 packages/expo/CHANGELOG.md                 |   4 +
 packages/expo/package.json                 |   8 +-
 packages/nextjs/CHANGELOG.md               |   4 +
 packages/nextjs/package.json               |  10 +-
 packages/react/CHANGELOG.md                |   6 ++
 packages/react/package.json                |   4 +-
 packages/react/src/info.ts                 |   2 +-
 packages/remix/CHANGELOG.md                |   4 +
 packages/remix/package.json                |   8 +-
 packages/sdk-node/CHANGELOG.md             |   4 +
 packages/sdk-node/package.json             |   6 +-
 packages/sdk-node/src/info.ts              |   2 +-
 packages/shared/CHANGELOG.md               |   8 ++
 packages/shared/package.json               |   4 +-
 packages/themes/CHANGELOG.md               |   4 +
 packages/themes/package.json               |   4 +-
 packages/types/CHANGELOG.md                |  13 +++
 packages/types/package.json                |   2 +-
 28 files changed, 181 insertions(+), 87 deletions(-)
 create mode 100644 packages/eslint-config-custom/CHANGELOG.md
 create mode 100644 packages/shared/CHANGELOG.md

diff --git a/package-lock.json b/package-lock.json
index ef4d4633e8c..1bfb22bc153 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -38043,10 +38043,10 @@
     },
     "packages/backend-core": {
       "name": "@clerk/backend-core",
-      "version": "2.8.2-staging.0",
+      "version": "2.9.0-staging.0",
       "license": "MIT",
       "dependencies": {
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/types": "^3.11.0-staging.1",
         "@peculiar/webcrypto": "^1.4.0",
         "@types/node": "^16.11.55",
         "@types/node-fetch": "^2",
@@ -38093,11 +38093,11 @@
     },
     "packages/clerk-js": {
       "name": "@clerk/clerk-js",
-      "version": "4.10.0-staging.0",
+      "version": "4.10.0-staging.1",
       "license": "MIT",
       "dependencies": {
-        "@clerk/shared": "^0.0.2-staging.0",
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/shared": "^0.0.2-staging.1",
+        "@clerk/types": "^3.11.0-staging.1",
         "@emotion/cache": "^11.7.1",
         "@emotion/react": "^11.9.0",
         "@floating-ui/react-dom-interactions": "^0.6.3",
@@ -38256,11 +38256,11 @@
     },
     "packages/edge": {
       "name": "@clerk/edge",
-      "version": "1.12.3-staging.0",
+      "version": "1.12.3-staging.1",
       "license": "MIT",
       "dependencies": {
-        "@clerk/backend-core": "^2.8.2-staging.0",
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/backend-core": "^2.9.0-staging.0",
+        "@clerk/types": "^3.11.0-staging.1",
         "@peculiar/webcrypto": "^1.4.0",
         "@types/node": "^16.11.55",
         "next": "^12.2.0"
@@ -38547,7 +38547,7 @@
       }
     },
     "packages/eslint-config-custom": {
-      "version": "0.0.1-staging.0",
+      "version": "0.0.1-staging.1",
       "license": "MIT",
       "dependencies": {
         "@typescript-eslint/eslint-plugin": "^5.15.0",
@@ -38622,16 +38622,16 @@
     },
     "packages/expo": {
       "name": "@clerk/clerk-expo",
-      "version": "0.9.63-staging.0",
+      "version": "0.9.63-staging.1",
       "license": "MIT",
       "dependencies": {
-        "@clerk/clerk-js": "^4.10.0-staging.0",
-        "@clerk/clerk-react": "^4.3.0-staging.0",
+        "@clerk/clerk-js": "^4.10.0-staging.1",
+        "@clerk/clerk-react": "^4.3.0-staging.1",
         "base-64": "^1.0.0",
         "react-native-url-polyfill": "^1.3.0"
       },
       "devDependencies": {
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/types": "^3.11.0-staging.1",
         "@types/jest": "^27.4.0",
         "@types/node": "^16.11.55",
         "@types/react": "^17.0.39",
@@ -38780,13 +38780,13 @@
     },
     "packages/nextjs": {
       "name": "@clerk/nextjs",
-      "version": "4.5.3-staging.0",
+      "version": "4.5.3-staging.1",
       "license": "MIT",
       "dependencies": {
-        "@clerk/clerk-react": "^4.3.0-staging.0",
-        "@clerk/clerk-sdk-node": "^4.4.3-staging.0",
-        "@clerk/edge": "^1.12.3-staging.0",
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/clerk-react": "^4.3.0-staging.1",
+        "@clerk/clerk-sdk-node": "^4.4.3-staging.1",
+        "@clerk/edge": "^1.12.3-staging.1",
+        "@clerk/types": "^3.11.0-staging.1",
         "tslib": "^2.3.1"
       },
       "devDependencies": {
@@ -39112,10 +39112,10 @@
     },
     "packages/react": {
       "name": "@clerk/clerk-react",
-      "version": "4.3.0-staging.0",
+      "version": "4.3.0-staging.1",
       "license": "MIT",
       "dependencies": {
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/types": "^3.11.0-staging.1",
         "swr": "^1.3.0",
         "tslib": "^2.3.1"
       },
@@ -39153,12 +39153,12 @@
     },
     "packages/remix": {
       "name": "@clerk/remix",
-      "version": "1.3.7-staging.0",
+      "version": "1.3.7-staging.1",
       "license": "MIT",
       "dependencies": {
-        "@clerk/clerk-react": "^4.3.0-staging.0",
-        "@clerk/clerk-sdk-node": "^4.4.3-staging.0",
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/clerk-react": "^4.3.0-staging.1",
+        "@clerk/clerk-sdk-node": "^4.4.3-staging.1",
+        "@clerk/types": "^3.11.0-staging.1",
         "cookie": "^0.5.0",
         "tslib": "^2.3.1"
       },
@@ -39204,11 +39204,11 @@
     },
     "packages/sdk-node": {
       "name": "@clerk/clerk-sdk-node",
-      "version": "4.4.3-staging.0",
+      "version": "4.4.3-staging.1",
       "license": "MIT",
       "dependencies": {
-        "@clerk/backend-core": "^2.8.2-staging.0",
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/backend-core": "^2.9.0-staging.0",
+        "@clerk/types": "^3.11.0-staging.1",
         "@peculiar/webcrypto": "^1.4.0",
         "@types/cookies": "^0.7.7",
         "@types/express": "^4.17.11",
@@ -39250,10 +39250,10 @@
     },
     "packages/shared": {
       "name": "@clerk/shared",
-      "version": "0.0.2-staging.0",
+      "version": "0.0.2-staging.1",
       "license": "ISC",
       "devDependencies": {
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/types": "^3.11.0-staging.1",
         "@types/js-cookie": "^3.0.2",
         "js-cookie": "^3.0.1",
         "tsup": "^6.2.3",
@@ -39272,10 +39272,10 @@
     },
     "packages/themes": {
       "name": "@clerk/themes",
-      "version": "1.2.18-staging.0",
+      "version": "1.2.18-staging.1",
       "license": "MIT",
       "devDependencies": {
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/types": "^3.11.0-staging.1",
         "typescript": "*"
       },
       "engines": {
@@ -39287,7 +39287,7 @@
     },
     "packages/types": {
       "name": "@clerk/types",
-      "version": "3.11.0-staging.0",
+      "version": "3.11.0-staging.1",
       "license": "MIT",
       "dependencies": {
         "csstype": "^3.1.0"
@@ -40759,7 +40759,7 @@
     "@clerk/backend-core": {
       "version": "file:packages/backend-core",
       "requires": {
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/types": "^3.11.0-staging.1",
         "@peculiar/webcrypto": "^1.4.0",
         "@types/jest": "^27.4.0",
         "@types/node": "^16.11.55",
@@ -40784,9 +40784,9 @@
     "@clerk/clerk-expo": {
       "version": "file:packages/expo",
       "requires": {
-        "@clerk/clerk-js": "^4.10.0-staging.0",
-        "@clerk/clerk-react": "^4.3.0-staging.0",
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/clerk-js": "^4.10.0-staging.1",
+        "@clerk/clerk-react": "^4.3.0-staging.1",
+        "@clerk/types": "^3.11.0-staging.1",
         "@types/jest": "^27.4.0",
         "@types/node": "^16.11.55",
         "@types/react": "^17.0.39",
@@ -40818,8 +40818,8 @@
         "@babel/preset-env": "^7.12.1",
         "@babel/preset-react": "^7.12.5",
         "@babel/preset-typescript": "^7.12.1",
-        "@clerk/shared": "^0.0.2-staging.0",
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/shared": "^0.0.2-staging.1",
+        "@clerk/types": "^3.11.0-staging.1",
         "@emotion/cache": "^11.7.1",
         "@emotion/react": "^11.9.0",
         "@floating-ui/react-dom-interactions": "^0.6.3",
@@ -40927,7 +40927,7 @@
     "@clerk/clerk-react": {
       "version": "file:packages/react",
       "requires": {
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/types": "^3.11.0-staging.1",
         "@testing-library/dom": "^7.28.1",
         "@testing-library/jest-dom": "^5.11.6",
         "@testing-library/react": "^11.2.1",
@@ -40960,8 +40960,8 @@
     "@clerk/clerk-sdk-node": {
       "version": "file:packages/sdk-node",
       "requires": {
-        "@clerk/backend-core": "^2.8.2-staging.0",
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/backend-core": "^2.9.0-staging.0",
+        "@clerk/types": "^3.11.0-staging.1",
         "@peculiar/webcrypto": "^1.4.0",
         "@types/cookies": "^0.7.7",
         "@types/express": "^4.17.11",
@@ -40998,8 +40998,8 @@
     "@clerk/edge": {
       "version": "file:packages/edge",
       "requires": {
-        "@clerk/backend-core": "^2.8.2-staging.0",
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/backend-core": "^2.9.0-staging.0",
+        "@clerk/types": "^3.11.0-staging.1",
         "@peculiar/webcrypto": "^1.4.0",
         "@types/jest": "^27.4.0",
         "@types/node": "^16.11.55",
@@ -41140,10 +41140,10 @@
     "@clerk/nextjs": {
       "version": "file:packages/nextjs",
       "requires": {
-        "@clerk/clerk-react": "^4.3.0-staging.0",
-        "@clerk/clerk-sdk-node": "^4.4.3-staging.0",
-        "@clerk/edge": "^1.12.3-staging.0",
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/clerk-react": "^4.3.0-staging.1",
+        "@clerk/clerk-sdk-node": "^4.4.3-staging.1",
+        "@clerk/edge": "^1.12.3-staging.1",
+        "@clerk/types": "^3.11.0-staging.1",
         "@types/jest": "^27.4.0",
         "@types/node": "^16.11.55",
         "@types/react": "^17.0.39",
@@ -41308,9 +41308,9 @@
     "@clerk/remix": {
       "version": "file:packages/remix",
       "requires": {
-        "@clerk/clerk-react": "^4.3.0-staging.0",
-        "@clerk/clerk-sdk-node": "^4.4.3-staging.0",
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/clerk-react": "^4.3.0-staging.1",
+        "@clerk/clerk-sdk-node": "^4.4.3-staging.1",
+        "@clerk/types": "^3.11.0-staging.1",
         "@types/cookie": "^0.5.0",
         "@types/jest": "^27.4.0",
         "@types/node": "^16.11.55",
@@ -41347,7 +41347,7 @@
     "@clerk/shared": {
       "version": "file:packages/shared",
       "requires": {
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/types": "^3.11.0-staging.1",
         "@types/js-cookie": "^3.0.2",
         "js-cookie": "^3.0.1",
         "tsup": "^6.2.3",
@@ -41358,7 +41358,7 @@
     "@clerk/themes": {
       "version": "file:packages/themes",
       "requires": {
-        "@clerk/types": "^3.11.0-staging.0",
+        "@clerk/types": "^3.11.0-staging.1",
         "typescript": "*"
       }
     },
diff --git a/packages/backend-core/CHANGELOG.md b/packages/backend-core/CHANGELOG.md
index 59809b21a35..3de43940656 100644
--- a/packages/backend-core/CHANGELOG.md
+++ b/packages/backend-core/CHANGELOG.md
@@ -3,6 +3,12 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [2.9.0-staging.0](https://github.com/clerkinc/javascript/compare/@clerk/backend-core@2.8.1...@clerk/backend-core@2.9.0-staging.0) (2022-10-13)
+
+### Features
+
+- **backend-core:** Add support for updating user's totp secret and backup codes ([250a47d](https://github.com/clerkinc/javascript/commit/250a47daf561928e7d09b48873b19be4de28a581))
+
 ### [2.8.1](https://github.com/clerkinc/javascript/compare/@clerk/backend-core@2.8.1-staging.0...@clerk/backend-core@2.8.1) (2022-10-07)
 
 **Note:** Version bump only for package @clerk/backend-core
diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json
index 73839058db5..14936f3f330 100644
--- a/packages/backend-core/package.json
+++ b/packages/backend-core/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/backend-core",
-  "version": "2.8.2-staging.0",
+  "version": "2.9.0-staging.0",
   "license": "MIT",
   "description": "Clerk Backend API core resources and authentication utilities for JavaScript environments.",
   "scripts": {
@@ -14,7 +14,7 @@
   "main": "dist/cjs/index.js",
   "module": "dist/mjs/index.js",
   "dependencies": {
-    "@clerk/types": "^3.11.0-staging.0",
+    "@clerk/types": "^3.11.0-staging.1",
     "@peculiar/webcrypto": "^1.4.0",
     "@types/node": "^16.11.55",
     "@types/node-fetch": "^2",
diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md
index 3ec44d1ac00..208130f94bb 100644
--- a/packages/clerk-js/CHANGELOG.md
+++ b/packages/clerk-js/CHANGELOG.md
@@ -3,6 +3,35 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [4.10.0-staging.1](https://github.com/clerkinc/javascript/compare/@clerk/clerk-js@4.9.0...@clerk/clerk-js@4.10.0-staging.1) (2022-10-13)
+
+### Features
+
+- **clerk-js,clerk-react,types:** Wire up `OrganizationSwitcher` and `OrganizationProfile` ([1e34e69](https://github.com/clerkinc/javascript/commit/1e34e6986ee49aeb9ca9f72cdc5d799d6611b53f))
+- **clerk-js:** Add table and pagination elements ([cb56f5c](https://github.com/clerkinc/javascript/commit/cb56f5c0313ba6f1fce50eae6fc3e3d596cf1b16))
+- **clerk-js:** Fade in text for ImpersonationFab ([25c24b2](https://github.com/clerkinc/javascript/commit/25c24b29564ea14e933ca6bfeb108b5fbeee0405))
+- **clerk-js:** Introduce Menu element ([f4b4586](https://github.com/clerkinc/javascript/commit/f4b4586816734a97a06bc7a9ee1c12f728973daa))
+- **clerk-js:** Introduce Select element and use it in PhoneInput ([9619bfe](https://github.com/clerkinc/javascript/commit/9619bfe6da4fb876f2ba6279f2c08d6a8c2d263c))
+- **clerk-js:** Make the whole ImpersonationFab draggable ([85d65f8](https://github.com/clerkinc/javascript/commit/85d65f8ae962cb16b14ddf9b77b4bf42cb1423da))
+- **clerk-js:** Replace Switch Account text with icon ([1262f1b](https://github.com/clerkinc/javascript/commit/1262f1bfacd10df0a292fe0250b8843729aa1162))
+
+### Bug Fixes
+
+- **clerk-js:** Add appearance customization support for avatar gradient ([96cde45](https://github.com/clerkinc/javascript/commit/96cde45b4f1db5ff074289b57ff58c40bf80f6e1))
+- **clerk-js:** Add default colors for avatar ([703fbd9](https://github.com/clerkinc/javascript/commit/703fbd9922c25b4e34fc8b443020e77d54a11afe))
+- **clerk-js:** Add global not_allowed_access error to localization prop ([0313fe5](https://github.com/clerkinc/javascript/commit/0313fe5ce4e0afca20865ad1b6d0503502ea6e4d))
+- **clerk-js:** Consistent ImpersonationFab drag behaviour in mobile ([b53d0a8](https://github.com/clerkinc/javascript/commit/b53d0a88b898e9aa8161906b671e0cd70c5ba2e9))
+- **clerk-js:** Extract BoringAvatar library module ([ca5420b](https://github.com/clerkinc/javascript/commit/ca5420b4dd6a6ddb26086c1f1641e9b2b44ea7b2))
+- **clerk-js:** Fix useSupportEmail.test.tsx ([52bb1cb](https://github.com/clerkinc/javascript/commit/52bb1cb950edc88b53c8ea05c88b3cfd6b1d377e))
+- **clerk-js:** Implement tabs components ([d9428cd](https://github.com/clerkinc/javascript/commit/d9428cdf21889318a181310f32ea77fe1f627e7e))
+- **clerk-js:** Improve keyboard nav and handle disabled tabs order of focus ([ae87f00](https://github.com/clerkinc/javascript/commit/ae87f0025b457ac64a60bd5176406bb46b1d532f))
+- **clerk-js:** Introduce FullHeightLoader element and replace Spinner in UserProfile ([121d697](https://github.com/clerkinc/javascript/commit/121d6972889fe8ecc3d534e12e40273766b2ba41))
+- **clerk-js:** Make global errors localizable ([e674272](https://github.com/clerkinc/javascript/commit/e674272bfe61d8eae24db3c10436f92eaf98a5da))
+- **clerk-js:** Make translateError fallback to longMessage first ([78627ca](https://github.com/clerkinc/javascript/commit/78627ca84f96627c3b5ccd77e4fbbcb52f5df784))
+- **clerk-js:** Minor refactor in naming and types ([8e1d32b](https://github.com/clerkinc/javascript/commit/8e1d32b660e33c2131642de0e9d0435e40544362))
+- **clerk-js:** Remove redundant code ([49c97e2](https://github.com/clerkinc/javascript/commit/49c97e2165eb54a430c22a74e86649e298205644))
+- **clerk-js:** Replace gravatar with Boring avatar ([7f2e2b6](https://github.com/clerkinc/javascript/commit/7f2e2b600fb746cc36c8464629d63ca3aa1a430b))
+
 ## [4.9.0](https://github.com/clerkinc/javascript/compare/@clerk/clerk-js@4.9.0-staging.1...@clerk/clerk-js@4.9.0) (2022-10-07)
 
 **Note:** Version bump only for package @clerk/clerk-js
diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json
index 763f055104e..81d171ff1e9 100644
--- a/packages/clerk-js/package.json
+++ b/packages/clerk-js/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/clerk-js",
-  "version": "4.10.0-staging.0",
+  "version": "4.10.0-staging.1",
   "license": "MIT",
   "description": "Clerk.dev JS library",
   "keywords": [
@@ -38,8 +38,8 @@
     "test:coverage": "jest --collectCoverage"
   },
   "dependencies": {
-    "@clerk/shared": "^0.0.2-staging.0",
-    "@clerk/types": "^3.11.0-staging.0",
+    "@clerk/shared": "^0.0.2-staging.1",
+    "@clerk/types": "^3.11.0-staging.1",
     "@emotion/cache": "^11.7.1",
     "@emotion/react": "^11.9.0",
     "@floating-ui/react-dom-interactions": "^0.6.3",
diff --git a/packages/edge/CHANGELOG.md b/packages/edge/CHANGELOG.md
index 4c0fdee900e..72c63499d60 100644
--- a/packages/edge/CHANGELOG.md
+++ b/packages/edge/CHANGELOG.md
@@ -3,6 +3,10 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+### [1.12.3-staging.1](https://github.com/clerkinc/javascript/compare/@clerk/edge@1.12.2...@clerk/edge@1.12.3-staging.1) (2022-10-13)
+
+**Note:** Version bump only for package @clerk/edge
+
 ### [1.12.2](https://github.com/clerkinc/javascript/compare/@clerk/edge@1.12.2-staging.0...@clerk/edge@1.12.2) (2022-10-07)
 
 **Note:** Version bump only for package @clerk/edge
diff --git a/packages/edge/package.json b/packages/edge/package.json
index 69a823803df..68736a551b2 100644
--- a/packages/edge/package.json
+++ b/packages/edge/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/edge",
-  "version": "1.12.3-staging.0",
+  "version": "1.12.3-staging.1",
   "license": "MIT",
   "description": "Clerk SDK for serverless and edge environments",
   "keywords": [
@@ -38,8 +38,8 @@
     "lint": "eslint ."
   },
   "dependencies": {
-    "@clerk/backend-core": "^2.8.2-staging.0",
-    "@clerk/types": "^3.11.0-staging.0",
+    "@clerk/backend-core": "^2.9.0-staging.0",
+    "@clerk/types": "^3.11.0-staging.1",
     "@peculiar/webcrypto": "^1.4.0",
     "@types/node": "^16.11.55",
     "next": "^12.2.0"
diff --git a/packages/edge/src/info.ts b/packages/edge/src/info.ts
index 721552396ee..3b75a150d43 100644
--- a/packages/edge/src/info.ts
+++ b/packages/edge/src/info.ts
@@ -1,3 +1,3 @@
 /** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */
-export const LIB_VERSION = '1.12.3-staging.0';
+export const LIB_VERSION = '1.12.3-staging.1';
 export const LIB_NAME = '@clerk/edge';
diff --git a/packages/eslint-config-custom/CHANGELOG.md b/packages/eslint-config-custom/CHANGELOG.md
new file mode 100644
index 00000000000..b5e4795b9a4
--- /dev/null
+++ b/packages/eslint-config-custom/CHANGELOG.md
@@ -0,0 +1,8 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+### 0.0.1-staging.1 (2022-10-13)
+
+**Note:** Version bump only for package eslint-config-custom
diff --git a/packages/eslint-config-custom/package.json b/packages/eslint-config-custom/package.json
index 64add6adbb8..3c0e1af6bde 100644
--- a/packages/eslint-config-custom/package.json
+++ b/packages/eslint-config-custom/package.json
@@ -1,6 +1,6 @@
 {
   "name": "eslint-config-custom",
-  "version": "0.0.1-staging.0",
+  "version": "0.0.1-staging.1",
   "main": "index.js",
   "private": true,
   "license": "MIT",
diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md
index 3eb1507cf0c..dea26b2ebf5 100644
--- a/packages/expo/CHANGELOG.md
+++ b/packages/expo/CHANGELOG.md
@@ -3,6 +3,10 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+### [0.9.63-staging.1](https://github.com/clerkinc/javascript/compare/@clerk/clerk-expo@0.9.62...@clerk/clerk-expo@0.9.63-staging.1) (2022-10-13)
+
+**Note:** Version bump only for package @clerk/clerk-expo
+
 ### [0.9.62](https://github.com/clerkinc/javascript/compare/@clerk/clerk-expo@0.9.62-staging.1...@clerk/clerk-expo@0.9.62) (2022-10-07)
 
 **Note:** Version bump only for package @clerk/clerk-expo
diff --git a/packages/expo/package.json b/packages/expo/package.json
index 69db82aedf1..69d9173fec0 100644
--- a/packages/expo/package.json
+++ b/packages/expo/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/clerk-expo",
-  "version": "0.9.63-staging.0",
+  "version": "0.9.63-staging.1",
   "license": "MIT",
   "description": "Clerk.dev React Native/Expo library",
   "keywords": [
@@ -27,13 +27,13 @@
     "lint": "eslint ."
   },
   "dependencies": {
-    "@clerk/clerk-js": "^4.10.0-staging.0",
-    "@clerk/clerk-react": "^4.3.0-staging.0",
+    "@clerk/clerk-js": "^4.10.0-staging.1",
+    "@clerk/clerk-react": "^4.3.0-staging.1",
     "base-64": "^1.0.0",
     "react-native-url-polyfill": "^1.3.0"
   },
   "devDependencies": {
-    "@clerk/types": "^3.11.0-staging.0",
+    "@clerk/types": "^3.11.0-staging.1",
     "@types/jest": "^27.4.0",
     "@types/node": "^16.11.55",
     "@types/react": "^17.0.39",
diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md
index 2421358a1a9..de4c2902bf8 100644
--- a/packages/nextjs/CHANGELOG.md
+++ b/packages/nextjs/CHANGELOG.md
@@ -3,6 +3,10 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+### [4.5.3-staging.1](https://github.com/clerkinc/javascript/compare/@clerk/nextjs@4.5.2...@clerk/nextjs@4.5.3-staging.1) (2022-10-13)
+
+**Note:** Version bump only for package @clerk/nextjs
+
 ### [4.5.2](https://github.com/clerkinc/javascript/compare/@clerk/nextjs@4.5.2-staging.0...@clerk/nextjs@4.5.2) (2022-10-07)
 
 **Note:** Version bump only for package @clerk/nextjs
diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json
index cbfd09a3791..e32de020d1e 100644
--- a/packages/nextjs/package.json
+++ b/packages/nextjs/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/nextjs",
-  "version": "4.5.3-staging.0",
+  "version": "4.5.3-staging.1",
   "license": "MIT",
   "description": "Clerk.dev SDK for NextJS",
   "keywords": [
@@ -35,10 +35,10 @@
     "dev": "tsc -p tsconfig.build.json --watch"
   },
   "dependencies": {
-    "@clerk/clerk-react": "^4.3.0-staging.0",
-    "@clerk/clerk-sdk-node": "^4.4.3-staging.0",
-    "@clerk/edge": "^1.12.3-staging.0",
-    "@clerk/types": "^3.11.0-staging.0",
+    "@clerk/clerk-react": "^4.3.0-staging.1",
+    "@clerk/clerk-sdk-node": "^4.4.3-staging.1",
+    "@clerk/edge": "^1.12.3-staging.1",
+    "@clerk/types": "^3.11.0-staging.1",
     "tslib": "^2.3.1"
   },
   "devDependencies": {
diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md
index afd55d5d6b1..3a52c1e7d66 100644
--- a/packages/react/CHANGELOG.md
+++ b/packages/react/CHANGELOG.md
@@ -3,6 +3,12 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [4.3.0-staging.1](https://github.com/clerkinc/javascript/compare/@clerk/clerk-react@4.2.6...@clerk/clerk-react@4.3.0-staging.1) (2022-10-13)
+
+### Features
+
+- **clerk-js,clerk-react,types:** Wire up `OrganizationSwitcher` and `OrganizationProfile` ([1e34e69](https://github.com/clerkinc/javascript/commit/1e34e6986ee49aeb9ca9f72cdc5d799d6611b53f))
+
 ### [4.2.6](https://github.com/clerkinc/javascript/compare/@clerk/clerk-react@4.2.6-staging.0...@clerk/clerk-react@4.2.6) (2022-10-07)
 
 **Note:** Version bump only for package @clerk/clerk-react
diff --git a/packages/react/package.json b/packages/react/package.json
index 34aa740fd7f..2b46f4a95f4 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/clerk-react",
-  "version": "4.3.0-staging.0",
+  "version": "4.3.0-staging.1",
   "license": "MIT",
   "description": "Clerk.dev React library",
   "keywords": [
@@ -29,7 +29,7 @@
     "test": "jest"
   },
   "dependencies": {
-    "@clerk/types": "^3.11.0-staging.0",
+    "@clerk/types": "^3.11.0-staging.1",
     "swr": "^1.3.0",
     "tslib": "^2.3.1"
   },
diff --git a/packages/react/src/info.ts b/packages/react/src/info.ts
index b91a8b3734c..82ecffa07cd 100644
--- a/packages/react/src/info.ts
+++ b/packages/react/src/info.ts
@@ -1,3 +1,3 @@
 /** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */
-export const LIB_VERSION = '4.3.0-staging.0';
+export const LIB_VERSION = '4.3.0-staging.1';
 export const LIB_NAME = '@clerk/clerk-react';
diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md
index ae8f6d36b8c..67530dfb318 100644
--- a/packages/remix/CHANGELOG.md
+++ b/packages/remix/CHANGELOG.md
@@ -3,6 +3,10 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+### [1.3.7-staging.1](https://github.com/clerkinc/javascript/compare/@clerk/remix@1.3.6...@clerk/remix@1.3.7-staging.1) (2022-10-13)
+
+**Note:** Version bump only for package @clerk/remix
+
 ### [1.3.6](https://github.com/clerkinc/javascript/compare/@clerk/remix@1.3.6-staging.0...@clerk/remix@1.3.6) (2022-10-07)
 
 **Note:** Version bump only for package @clerk/remix
diff --git a/packages/remix/package.json b/packages/remix/package.json
index 982cbfa1c7e..02e1d1b2cbf 100644
--- a/packages/remix/package.json
+++ b/packages/remix/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/remix",
-  "version": "1.3.7-staging.0",
+  "version": "1.3.7-staging.1",
   "license": "MIT",
   "description": "Clerk.dev SDK for Remix",
   "keywords": [
@@ -33,9 +33,9 @@
     "lint": "eslint ."
   },
   "dependencies": {
-    "@clerk/clerk-react": "^4.3.0-staging.0",
-    "@clerk/clerk-sdk-node": "^4.4.3-staging.0",
-    "@clerk/types": "^3.11.0-staging.0",
+    "@clerk/clerk-react": "^4.3.0-staging.1",
+    "@clerk/clerk-sdk-node": "^4.4.3-staging.1",
+    "@clerk/types": "^3.11.0-staging.1",
     "cookie": "^0.5.0",
     "tslib": "^2.3.1"
   },
diff --git a/packages/sdk-node/CHANGELOG.md b/packages/sdk-node/CHANGELOG.md
index 0dfd777efb2..b438b0d3bb5 100644
--- a/packages/sdk-node/CHANGELOG.md
+++ b/packages/sdk-node/CHANGELOG.md
@@ -3,6 +3,10 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+### [4.4.3-staging.1](https://github.com/clerkinc/javascript/compare/@clerk/clerk-sdk-node@4.4.2...@clerk/clerk-sdk-node@4.4.3-staging.1) (2022-10-13)
+
+**Note:** Version bump only for package @clerk/clerk-sdk-node
+
 ### [4.4.2](https://github.com/clerkinc/javascript/compare/@clerk/clerk-sdk-node@4.4.2-staging.0...@clerk/clerk-sdk-node@4.4.2) (2022-10-07)
 
 **Note:** Version bump only for package @clerk/clerk-sdk-node
diff --git a/packages/sdk-node/package.json b/packages/sdk-node/package.json
index 86b777b1521..51addba3580 100644
--- a/packages/sdk-node/package.json
+++ b/packages/sdk-node/package.json
@@ -1,5 +1,5 @@
 {
-  "version": "4.4.3-staging.0",
+  "version": "4.4.3-staging.1",
   "license": "MIT",
   "main": "dist/cjs/index.js",
   "module": "dist/esm/index.js",
@@ -38,8 +38,8 @@
     "typescript": "*"
   },
   "dependencies": {
-    "@clerk/backend-core": "^2.8.2-staging.0",
-    "@clerk/types": "^3.11.0-staging.0",
+    "@clerk/backend-core": "^2.9.0-staging.0",
+    "@clerk/types": "^3.11.0-staging.1",
     "@peculiar/webcrypto": "^1.4.0",
     "@types/cookies": "^0.7.7",
     "@types/express": "^4.17.11",
diff --git a/packages/sdk-node/src/info.ts b/packages/sdk-node/src/info.ts
index 00ccc413759..92730302c21 100644
--- a/packages/sdk-node/src/info.ts
+++ b/packages/sdk-node/src/info.ts
@@ -1,3 +1,3 @@
 /** DO NOT EDIT: This file is automatically generated by ../scripts/info.js */
-export const LIB_VERSION = '4.4.3-staging.0';
+export const LIB_VERSION = '4.4.3-staging.1';
 export const LIB_NAME = '@clerk/clerk-sdk-node';
diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md
new file mode 100644
index 00000000000..cfca2a29b04
--- /dev/null
+++ b/packages/shared/CHANGELOG.md
@@ -0,0 +1,8 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+### [0.0.2-staging.1](https://github.com/clerkinc/clerk_docker/compare/@clerk/shared@0.3.27...@clerk/shared@0.0.2-staging.1) (2022-10-13)
+
+**Note:** Version bump only for package @clerk/shared
diff --git a/packages/shared/package.json b/packages/shared/package.json
index 23e8798680a..41afacdfcb0 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/shared",
-  "version": "0.0.2-staging.0",
+  "version": "0.0.2-staging.1",
   "description": "Internal package utils used by the Clerk SDKs",
   "types": "./dist/types/index.d.ts",
   "main": "./dist/index.js",
@@ -18,7 +18,7 @@
     "test:watch": "vitest"
   },
   "devDependencies": {
-    "@clerk/types": "^3.11.0-staging.0",
+    "@clerk/types": "^3.11.0-staging.1",
     "@types/js-cookie": "^3.0.2",
     "js-cookie": "^3.0.1",
     "tsup": "^6.2.3",
diff --git a/packages/themes/CHANGELOG.md b/packages/themes/CHANGELOG.md
index 174225928d0..ac42c9c64c9 100644
--- a/packages/themes/CHANGELOG.md
+++ b/packages/themes/CHANGELOG.md
@@ -3,6 +3,10 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+### [1.2.18-staging.1](https://github.com/clerkinc/javascript/compare/@clerk/themes@1.2.17...@clerk/themes@1.2.18-staging.1) (2022-10-13)
+
+**Note:** Version bump only for package @clerk/themes
+
 ### [1.2.17](https://github.com/clerkinc/javascript/compare/@clerk/themes@1.2.17-staging.0...@clerk/themes@1.2.17) (2022-10-07)
 
 **Note:** Version bump only for package @clerk/themes
diff --git a/packages/themes/package.json b/packages/themes/package.json
index 9d7eec742b0..b31205508c4 100644
--- a/packages/themes/package.json
+++ b/packages/themes/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/themes",
-  "version": "1.2.18-staging.0",
+  "version": "1.2.18-staging.1",
   "license": "MIT",
   "description": "Themes for the Clerk auth components",
   "keywords": [
@@ -28,7 +28,7 @@
     "lint": "eslint ."
   },
   "devDependencies": {
-    "@clerk/types": "^3.11.0-staging.0",
+    "@clerk/types": "^3.11.0-staging.1",
     "typescript": "*"
   },
   "peerDependencies": {
diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md
index f72a7808e54..a12caceb292 100644
--- a/packages/types/CHANGELOG.md
+++ b/packages/types/CHANGELOG.md
@@ -3,6 +3,19 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [3.11.0-staging.1](https://github.com/clerkinc/javascript/compare/@clerk/types@3.10.1...@clerk/types@3.11.0-staging.1) (2022-10-13)
+
+### Features
+
+- **clerk-js,clerk-react,types:** Wire up `OrganizationSwitcher` and `OrganizationProfile` ([1e34e69](https://github.com/clerkinc/javascript/commit/1e34e6986ee49aeb9ca9f72cdc5d799d6611b53f))
+- **clerk-js:** Add table and pagination elements ([cb56f5c](https://github.com/clerkinc/javascript/commit/cb56f5c0313ba6f1fce50eae6fc3e3d596cf1b16))
+
+### Bug Fixes
+
+- **clerk-js:** Add appearance customization support for avatar gradient ([96cde45](https://github.com/clerkinc/javascript/commit/96cde45b4f1db5ff074289b57ff58c40bf80f6e1))
+- **clerk-js:** Add global not_allowed_access error to localization prop ([0313fe5](https://github.com/clerkinc/javascript/commit/0313fe5ce4e0afca20865ad1b6d0503502ea6e4d))
+- **types:** Remove unused hideNavigation prop from UserProfile ([21cafcb](https://github.com/clerkinc/javascript/commit/21cafcb488d66f90a3b0a13a2079d9b0473ecf7e))
+
 ### [3.10.1](https://github.com/clerkinc/javascript/compare/@clerk/types@3.10.1-staging.0...@clerk/types@3.10.1) (2022-10-07)
 
 **Note:** Version bump only for package @clerk/types
diff --git a/packages/types/package.json b/packages/types/package.json
index f7fc04ca0ea..3d5009e962c 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@clerk/types",
-  "version": "3.11.0-staging.0",
+  "version": "3.11.0-staging.1",
   "license": "MIT",
   "description": "Typings for Clerk libraries.",
   "keywords": [