From 621444fe8f63810dbdc4d23b4186569196cdefc2 Mon Sep 17 00:00:00 2001 From: Joshua Melville Date: Thu, 26 Oct 2023 17:05:50 +0200 Subject: [PATCH 01/14] WIP example implementation of new react server actions functionality in combination with next cache revalidation --- .../_components/AnonymousRecruitment.tsx | 15 - .../AnonymousRecruitmentSwitch.tsx | 65 -- .../dashboard/_components/ResetButton.tsx | 2 + app/(dashboard)/dashboard/page.tsx | 4 +- .../OnboardSteps/Documentation.tsx | 2 + .../OnboardSteps/ManageParticipants.tsx | 38 +- .../_components/OnboardSteps/Steps.tsx | 16 +- app/(onboard)/_components/OnboardWizard.tsx | 62 -- app/(onboard)/expired/page.tsx | 29 +- app/(onboard)/setup/page.tsx | 65 +- app/_actions.ts | 14 + app/layout.tsx | 20 +- .../AnonymousRecruitmentSwitch.tsx | 19 + .../AnonymousRecruitmentSwitch/Switch.tsx | 54 ++ .../AnonymousRecruitmentSwitch/action.ts | 27 + .../BackgroundBlobs/BackgroundBlobs.tsx | 2 +- package.json | 2 +- pnpm-lock.yaml | 727 +++++++++--------- server/routers/appSettings.ts | 16 +- trpc/server.ts | 18 +- 20 files changed, 615 insertions(+), 582 deletions(-) delete mode 100644 app/(dashboard)/dashboard/_components/AnonymousRecruitment.tsx delete mode 100644 app/(dashboard)/dashboard/_components/AnonymousRecruitmentSwitch.tsx delete mode 100644 app/(onboard)/_components/OnboardWizard.tsx create mode 100644 app/_actions.ts create mode 100644 components/AnonymousRecruitmentSwitch/AnonymousRecruitmentSwitch.tsx create mode 100644 components/AnonymousRecruitmentSwitch/Switch.tsx create mode 100644 components/AnonymousRecruitmentSwitch/action.ts diff --git a/app/(dashboard)/dashboard/_components/AnonymousRecruitment.tsx b/app/(dashboard)/dashboard/_components/AnonymousRecruitment.tsx deleted file mode 100644 index c9d4c689..00000000 --- a/app/(dashboard)/dashboard/_components/AnonymousRecruitment.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { api } from '~/trpc/server'; -import AnonymousRecruitmentSwitch from './AnonymousRecruitmentSwitch'; - -const AnonymousRecruitment = async () => { - const allowAnonymousRecruitment = - await api.appSettings.get.allowAnonymousRecruitment.query(undefined, { - context: { - revalidate: 0, - }, - }); - - return ; -}; - -export default AnonymousRecruitment; diff --git a/app/(dashboard)/dashboard/_components/AnonymousRecruitmentSwitch.tsx b/app/(dashboard)/dashboard/_components/AnonymousRecruitmentSwitch.tsx deleted file mode 100644 index 2359f804..00000000 --- a/app/(dashboard)/dashboard/_components/AnonymousRecruitmentSwitch.tsx +++ /dev/null @@ -1,65 +0,0 @@ -'use client'; - -import { api } from '~/trpc/client'; -import { Switch } from '~/components/ui/switch'; - -const AnonymousRecruitmentSwitch = ({ - initialData, -}: { - initialData: boolean; -}) => { - const utils = api.useUtils(); - - const { data: allowAnonymousRecruitment } = - api.appSettings.get.allowAnonymousRecruitment.useQuery(undefined, { - initialData, - }); - - const { mutateAsync: updateAnonymousRecruitment } = - api.appSettings.updateAnonymousRecruitment.useMutation({ - async onMutate(newState: boolean) { - await utils.appSettings.get.allowAnonymousRecruitment.cancel(); - - const previousState = - utils.appSettings.get.allowAnonymousRecruitment.getData(); - - utils.appSettings.get.allowAnonymousRecruitment.setData( - undefined, - newState, - ); - - return previousState; - }, - onError: (err, _newState, previousState) => { - utils.appSettings.get.allowAnonymousRecruitment.setData( - undefined, - previousState, - ); - // eslint-disable-next-line no-console - console.error(err); - }, - }); - - const handleCheckedChange = async () => { - await updateAnonymousRecruitment(!allowAnonymousRecruitment); - }; - - return ( -
-
-
-

Anonymous Recruitment

-

- Allow anonymous recruitment of participants. -

-
- void handleCheckedChange()} - /> -
-
- ); -}; - -export default AnonymousRecruitmentSwitch; diff --git a/app/(dashboard)/dashboard/_components/ResetButton.tsx b/app/(dashboard)/dashboard/_components/ResetButton.tsx index d15b2f77..bfd18964 100644 --- a/app/(dashboard)/dashboard/_components/ResetButton.tsx +++ b/app/(dashboard)/dashboard/_components/ResetButton.tsx @@ -5,6 +5,7 @@ import { useRouter } from 'next/navigation'; import { useState } from 'react'; import { api } from '~/trpc/client'; import { Button } from '~/components/ui/Button'; +import { revalidatePath } from 'next/cache'; const ResetButton = () => { const [loading, setLoading] = useState(false); @@ -14,6 +15,7 @@ const ResetButton = () => { const reset = async () => { setLoading(true); await resetConfigured(); + revalidatePath('/'); router.refresh(); }; diff --git a/app/(dashboard)/dashboard/page.tsx b/app/(dashboard)/dashboard/page.tsx index 26b257a3..fcd06fd1 100644 --- a/app/(dashboard)/dashboard/page.tsx +++ b/app/(dashboard)/dashboard/page.tsx @@ -1,5 +1,5 @@ import ResetButton from './_components/ResetButton'; -import AnonymousRecruitment from './_components/AnonymousRecruitment'; +import AnonymousRecruitmentSwitch from '~/components/AnonymousRecruitmentSwitch/AnonymousRecruitmentSwitch'; import Link from 'next/link'; import { Button } from '~/components/ui/Button'; @@ -13,7 +13,7 @@ function Home() { - + ); diff --git a/app/(onboard)/_components/OnboardSteps/Documentation.tsx b/app/(onboard)/_components/OnboardSteps/Documentation.tsx index 488913ad..8a155141 100644 --- a/app/(onboard)/_components/OnboardSteps/Documentation.tsx +++ b/app/(onboard)/_components/OnboardSteps/Documentation.tsx @@ -5,6 +5,7 @@ import { FileText, Loader2, MonitorPlay } from 'lucide-react'; import { Button } from '~/components/ui/Button'; import { api } from '~/trpc/client'; import { useState } from 'react'; +import { revalidateTag } from 'next/cache'; function Documentation() { const [loading, setLoading] = useState(false); @@ -13,6 +14,7 @@ function Documentation() { setLoading(true); }, onSuccess: () => { + revalidateTag('appConfigured'); window.location.replace('/dashboard'); }, onError: () => { diff --git a/app/(onboard)/_components/OnboardSteps/ManageParticipants.tsx b/app/(onboard)/_components/OnboardSteps/ManageParticipants.tsx index cacc7900..459b672d 100644 --- a/app/(onboard)/_components/OnboardSteps/ManageParticipants.tsx +++ b/app/(onboard)/_components/OnboardSteps/ManageParticipants.tsx @@ -1,25 +1,21 @@ import { Check } from 'lucide-react'; -import { useState } from 'react'; -import { Button } from '~/components/ui/Button'; -import { usePathname, useRouter, useSearchParams } from 'next/navigation'; -import AnonymousRecruitmentSwitch from '~/app/(dashboard)/dashboard/_components/AnonymousRecruitmentSwitch'; -import type { Route } from 'next'; import ImportCSVModal from '~/app/(dashboard)/dashboard/participants/_components/ImportCSVModal'; +import AnonymousRecruitmentSwitch from '~/components/AnonymousRecruitmentSwitch/AnonymousRecruitmentSwitch'; function ManageParticipants() { - const pathname = usePathname() as Route; - const searchParams = useSearchParams(); - const currentStep = searchParams.get('step') as string; - const [participantsUploaded, setParticipantsUploaded] = useState(false); - const router = useRouter(); + // const pathname = usePathname() as Route; + // const searchParams = useSearchParams(); + // const currentStep = searchParams.get('step') as string; + // const [participantsUploaded, setParticipantsUploaded] = useState(false); + // const router = useRouter(); - const handleParticipantsUploaded = () => { - setParticipantsUploaded(true); - }; + // const handleParticipantsUploaded = () => { + // setParticipantsUploaded(true); + // }; - const handleNextStep = () => { - router.replace(`${pathname}?step=${parseInt(currentStep) + 1}`); - }; + // const handleNextStep = () => { + // router.replace(`${pathname}?step=${parseInt(currentStep) + 1}`); + // }; return (
@@ -39,17 +35,17 @@ function ManageParticipants() { Upload a CSV file of participants.

- {participantsUploaded && } + {/* {participantsUploaded && } {!participantsUploaded && ( - )} + )} */} - -
+ + {/*
-
+
*/} ); } diff --git a/app/(onboard)/_components/OnboardSteps/Steps.tsx b/app/(onboard)/_components/OnboardSteps/Steps.tsx index 63a8d312..3f128dff 100644 --- a/app/(onboard)/_components/OnboardSteps/Steps.tsx +++ b/app/(onboard)/_components/OnboardSteps/Steps.tsx @@ -1,29 +1,23 @@ -import type { ComponentType } from 'react'; -import UploadProtocol from '~/app/(onboard)/_components/OnboardSteps/UploadProtocol'; -import CreateAccount from '~/app/(onboard)/_components/OnboardSteps/CreateAccount'; -import Documentation from '~/app/(onboard)/_components/OnboardSteps/Documentation'; -import ManageParticipants from './ManageParticipants'; - export type Step = { description: string; - component: ComponentType; + component: string; }; export const steps: Step[] = [ { description: 'Create Account', - component: CreateAccount, + component: 'CreateAccount', }, { description: 'Upload Protocol', - component: UploadProtocol, + component: 'UploadProtocol', }, { description: 'Configure Participation', - component: ManageParticipants, + component: 'ManageParticipants', }, { description: 'Documentation', - component: Documentation, + component: 'Documentation', }, ]; diff --git a/app/(onboard)/_components/OnboardWizard.tsx b/app/(onboard)/_components/OnboardWizard.tsx deleted file mode 100644 index fafe4623..00000000 --- a/app/(onboard)/_components/OnboardWizard.tsx +++ /dev/null @@ -1,62 +0,0 @@ -'use client'; - -import { - type Step, - steps, -} from '~/app/(onboard)/_components/OnboardSteps/Steps'; -import { cn } from '~/utils/shadcn'; -import { usePathname, useRouter, useSearchParams } from 'next/navigation'; -import OnboardSteps from './OnboardSteps/StepsSidebar'; -import { userFormClasses } from '../_shared'; -import { useSession } from '~/providers/SessionProvider'; -import { useEffect } from 'react'; -import type { Route } from 'next'; -import { api } from '~/trpc/client'; - -function OnboardWizard() { - const { session } = useSession(); - const pathname = usePathname() as Route; - const router = useRouter(); - const searchParams = useSearchParams(); - const step = searchParams.get('step'); - const stepInt = parseInt(step ?? '1', 10); - - const { data: expired } = api.appSettings.get.expired.useQuery(undefined, { - refetchInterval: 1000 * 10, - }); - - useEffect(() => { - if (expired) { - router.refresh(); - } - - if (!step || (!session && stepInt !== 1)) { - router.push(`${pathname}?step=1`); - return; - } - - // If we have a user session, skip step 1 - if (session && stepInt === 1) { - router.push(`${pathname}?step=2`); - return; - } - }, [expired, router, pathname, session, step, stepInt]); - - const cardClasses = cn(userFormClasses, 'flex-row bg-transparent p-0 gap-6'); - const mainClasses = cn('bg-white flex w-full p-8 rounded-xl'); - - const stepIndex = (stepInt - 1) as keyof typeof steps; - - const { component: StepComponent } = steps[stepIndex] as Step; - - return ( -
- -
- -
-
- ); -} - -export default OnboardWizard; diff --git a/app/(onboard)/expired/page.tsx b/app/(onboard)/expired/page.tsx index 8106e261..3493ba3d 100644 --- a/app/(onboard)/expired/page.tsx +++ b/app/(onboard)/expired/page.tsx @@ -1,23 +1,9 @@ -'use client'; - import { env } from '~/env.mjs'; import { userFormClasses } from '../_shared'; import { Button } from '~/components/ui/Button'; -import { api } from '~/trpc/client'; -import { Loader2 } from 'lucide-react'; +import { resetAppSettings } from '~/app/_actions'; export default function Page() { - const utils = api.useUtils(); - const { mutate: resetExpired, isLoading } = api.appSettings.reset.useMutation( - { - onSuccess: async () => { - await utils.appSettings.get.allappSettings.refetch(); - - window.location.replace('/setup'); - }, - }, - ); - return (

Installation expired

@@ -29,14 +15,11 @@ export default function Page() { Please redploy a new instance of Fresco to continue using the software.

{env.NODE_ENV === 'development' && ( - +
+ +
)}
); diff --git a/app/(onboard)/setup/page.tsx b/app/(onboard)/setup/page.tsx index 27f5ef6d..5930be52 100644 --- a/app/(onboard)/setup/page.tsx +++ b/app/(onboard)/setup/page.tsx @@ -1,7 +1,66 @@ -import OnboardWizard from '../_components/OnboardWizard'; +import { revalidateTag } from 'next/cache'; +import { redirect } from 'next/navigation'; +import { api } from '~/trpc/server'; +import { getServerSession } from '~/utils/auth'; +import { cn } from '~/utils/shadcn'; +import { userFormClasses } from '../_shared'; +import OnboardSteps from '../_components/OnboardSteps/StepsSidebar'; -function Page() { - return ; +import { Suspense } from 'react'; +import dynamic from 'next/dynamic'; +import { steps } from '../_components/OnboardSteps/Steps'; + +async function Page({ + searchParams: { step = '1' }, +}: { + searchParams: { + step?: string; + }; +}) { + const stepInt = parseInt(step ?? '1', 10); + + const expired = await api.appSettings.get.expired.query(undefined, { + context: { + revalidate: 1, + }, + }); + + if (expired) { + revalidateTag('appExpired'); + } + + const session = await getServerSession(); + + // If we have a session already, skip the account signup step + if (session && stepInt === 1) { + redirect('/setup?step=2'); + } + + if (!session && stepInt > 1) { + redirect('/setup?step=1'); + } + + console.log('step', step); + + const cardClasses = cn(userFormClasses, 'flex-row bg-transparent p-0 gap-6'); + const mainClasses = cn('bg-white flex w-full p-8 rounded-xl'); + + const StepComponent = steps[stepInt - 1].component; + + const CustomModule = dynamic( + () => import(`../_components/OnboardSteps/${StepComponent}`), + ); + + return ( +
+ +
+ Loading...
}> + + +
+ + ); } export default Page; diff --git a/app/_actions.ts b/app/_actions.ts new file mode 100644 index 00000000..ab58b08f --- /dev/null +++ b/app/_actions.ts @@ -0,0 +1,14 @@ +'use server'; + +import { revalidateTag } from 'next/cache'; +import { redirect } from 'next/navigation'; +import { api } from '~/trpc/server'; + +export const resetAppSettings = async () => { + await api.appSettings.reset.mutate(); + + revalidateTag('appConfigured'); + revalidateTag('appExpired'); + + redirect('/'); +}; diff --git a/app/layout.tsx b/app/layout.tsx index ada70959..7327c06d 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -5,21 +5,33 @@ import RedirectWrapper from '~/components/RedirectWrapper'; import { getServerSession } from '~/utils/auth'; import { api } from '~/trpc/server'; import { Toaster } from '~/components/ui/toaster'; +import { unstable_cache } from 'next/cache'; export const metadata = { title: 'Network Canvas Fresco', description: 'Fresco.', }; -export const revalidate = false; -export const runtime = 'nodejs'; export const dynamic = 'force-dynamic'; async function RootLayout({ children }: { children: React.ReactNode }) { const session = await getServerSession(); - const { configured, expired } = - await api.appSettings.get.allappSettings.query(); + const { configured, expired } = await unstable_cache( + async () => { + const result = await api.appSettings.get.allappSettings.query(); + + return { + configured: result.configured, + expired: result.expired, + }; + }, + ['appConfigured', 'appExpired'], + { + tags: ['appConfigured', 'appExpired'], + revalidate: false, + }, + )(); return ( diff --git a/components/AnonymousRecruitmentSwitch/AnonymousRecruitmentSwitch.tsx b/components/AnonymousRecruitmentSwitch/AnonymousRecruitmentSwitch.tsx new file mode 100644 index 00000000..f8732158 --- /dev/null +++ b/components/AnonymousRecruitmentSwitch/AnonymousRecruitmentSwitch.tsx @@ -0,0 +1,19 @@ +import { api } from '~/trpc/server'; +import Switch from './Switch'; +import { unstable_cache } from 'next/cache'; +import 'server-only'; + +const AnonymousRecruitmentSwitch = async () => { + const allowAnonymousRecruitment = await unstable_cache( + async () => await api.appSettings.get.allowAnonymousRecruitment.query(), + ['anonymousRecruitment'], + { + tags: ['anonymousRecruitment'], + revalidate: false, + }, + )(); + + return ; +}; + +export default AnonymousRecruitmentSwitch; diff --git a/components/AnonymousRecruitmentSwitch/Switch.tsx b/components/AnonymousRecruitmentSwitch/Switch.tsx new file mode 100644 index 00000000..84e84e8a --- /dev/null +++ b/components/AnonymousRecruitmentSwitch/Switch.tsx @@ -0,0 +1,54 @@ +/* eslint-disable @typescript-eslint/no-misused-promises */ +'use client'; + +import { Switch as SwitchUI } from '~/components/ui/switch'; +import { setAnonymousRecruitment } from './action'; +import { + useTransition, + experimental_useOptimistic as useOptimistic, +} from 'react'; + +const Switch = ({ + allowAnonymousRecruitment, +}: { + allowAnonymousRecruitment: boolean; +}) => { + const [isPending, startTransition] = useTransition(); + + const [ + optimisticAllowAnonymousRecruitment, + setOptimisticAllowAnonymousRecruitment, + ] = useOptimistic( + allowAnonymousRecruitment, + (state: boolean, newState: boolean) => newState, + ); + + console.log('op', { + optimisticAllowAnonymousRecruitment, + allowAnonymousRecruitment, + }); + + return ( +
+
+
+

Anonymous Recruitment

+

+ Allow anonymous recruitment of participants. +

+
+ { + console.log('hello', value); + setOptimisticAllowAnonymousRecruitment(value); + await setAnonymousRecruitment(value); + }} + /> +
+
+ ); +}; + +export default Switch; diff --git a/components/AnonymousRecruitmentSwitch/action.ts b/components/AnonymousRecruitmentSwitch/action.ts new file mode 100644 index 00000000..22ea935e --- /dev/null +++ b/components/AnonymousRecruitmentSwitch/action.ts @@ -0,0 +1,27 @@ +'use server'; + +import { revalidateTag } from 'next/cache'; +import { getAppSettings } from '~/server/routers/appSettings'; +import { prisma } from '~/utils/db'; + +export async function setAnonymousRecruitment(state: boolean) { + const { configured, initializedAt } = await getAppSettings(); + + // eslint-disable-next-line local-rules/require-data-mapper + await prisma.appSettings.update({ + where: { + configured_initializedAt: { + configured, + initializedAt, + }, + }, + data: { + allowAnonymousRecruitment: state, + }, + }); + + // Currently, this is not working with tRPC, for unknown reasons. + // const result = await api.appSettings.updateAnonymousRecruitment.mutate(state); + + revalidateTag('anonymousRecruitment'); +} diff --git a/components/BackgroundBlobs/BackgroundBlobs.tsx b/components/BackgroundBlobs/BackgroundBlobs.tsx index 590dc23e..78852bbf 100644 --- a/components/BackgroundBlobs/BackgroundBlobs.tsx +++ b/components/BackgroundBlobs/BackgroundBlobs.tsx @@ -16,7 +16,7 @@ const gradients = [ ['rgb(107, 114, 236)', 'rgb(58, 58, 117)'], ['rgb(242, 183, 0)', 'rgb(247,137,30)'], ['rgb(15, 178, 226)', 'rgb(15, 112, 255)'], - ['rgb(45, 41, 85)', 'rgb(58,58,117)'], + ['rgb(45, 41, 285)', 'rgb(58,58,217)'], ]; const SPEED_FACTOR = 1; diff --git a/package.json b/package.json index 1448545c..ba02596d 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "@types/jest": "^29.5.6", "@types/node": "^20.8.8", "@types/papaparse": "^5.3.10", - "@types/react": "^18.2.31", + "@types/react": "^18.2.21", "@types/react-dom": "^18.2.14", "@types/uuid": "^9.0.6", "@types/validator": "^13.11.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bd1fbe36..1c49ba02 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,43 +25,43 @@ dependencies: version: 5.4.2(prisma@5.4.2) '@radix-ui/react-alert-dialog': specifier: ^1.0.5 - version: 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-checkbox': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-collapsible': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-dialog': specifier: ^1.0.5 - version: 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-dropdown-menu': specifier: ^2.0.6 - version: 2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + version: 2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-label': specifier: ^2.0.2 - version: 2.0.2(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + version: 2.0.2(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-progress': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-select': specifier: ^2.0.0 - version: 2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + version: 2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-slot': specifier: ^1.0.2 - version: 1.0.2(@types/react@18.2.31)(react@18.2.0) + version: 1.0.2(@types/react@18.2.21)(react@18.2.0) '@radix-ui/react-switch': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-tabs': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-toast': specifier: ^1.1.5 - version: 1.1.5(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + version: 1.1.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-tooltip': specifier: ^1.0.7 - version: 1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@t3-oss/env-nextjs': specifier: ^0.7.1 version: 0.7.1(typescript@5.2.2)(zod@3.22.4) @@ -189,19 +189,19 @@ devDependencies: version: 8.2.0 '@storybook/addon-essentials': specifier: ^7.5.1 - version: 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + version: 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-interactions': specifier: ^7.5.1 - version: 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + version: 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-links': specifier: ^7.5.1 version: 7.5.1(react-dom@18.2.0)(react@18.2.0) '@storybook/blocks': specifier: ^7.5.1 - version: 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + version: 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/nextjs': specifier: ^7.5.1 - version: 7.5.1(@swc/core@1.3.94)(@types/react-dom@18.2.14)(@types/react@18.2.31)(esbuild@0.18.20)(next@13.5.6)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4)(typescript@5.2.2)(webpack@5.89.0) + version: 7.5.1(@swc/core@1.3.94)(@types/react-dom@18.2.14)(@types/react@18.2.21)(esbuild@0.18.20)(next@13.5.6)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4)(typescript@5.2.2)(webpack@5.89.0) '@storybook/react': specifier: ^7.5.1 version: 7.5.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) @@ -230,8 +230,8 @@ devDependencies: specifier: ^5.3.10 version: 5.3.10 '@types/react': - specifier: ^18.2.31 - version: 18.2.31 + specifier: ^18.2.21 + version: 18.2.21 '@types/react-dom': specifier: ^18.2.14 version: 18.2.14 @@ -2367,7 +2367,7 @@ packages: react: '>=16' dependencies: '@types/mdx': 2.0.9 - '@types/react': 18.2.31 + '@types/react': 18.2.33 react: 18.2.0 dev: true @@ -2568,7 +2568,7 @@ packages: dependencies: '@babel/runtime': 7.23.2 - /@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==} peerDependencies: '@types/react': '*' @@ -2583,18 +2583,18 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} peerDependencies: '@types/react': '*' @@ -2608,13 +2608,13 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==} peerDependencies: '@types/react': '*' @@ -2629,20 +2629,20 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} peerDependencies: '@types/react': '*' @@ -2657,20 +2657,20 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} peerDependencies: '@types/react': '*' @@ -2684,16 +2684,16 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.31)(react@18.2.0): + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: '@types/react': '*' @@ -2703,10 +2703,10 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.31 + '@types/react': 18.2.21 react: 18.2.0 - /@radix-ui/react-context@1.0.1(@types/react@18.2.31)(react@18.2.0): + /@radix-ui/react-context@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: '@types/react': '*' @@ -2716,10 +2716,10 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.31 + '@types/react': 18.2.21 react: 18.2.0 - /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} peerDependencies: '@types/react': '*' @@ -2734,26 +2734,26 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.31)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) dev: false - /@radix-ui/react-direction@1.0.1(@types/react@18.2.31)(react@18.2.0): + /@radix-ui/react-direction@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} peerDependencies: '@types/react': '*' @@ -2763,10 +2763,10 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.31 + '@types/react': 18.2.21 react: 18.2.0 - /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} peerDependencies: '@types/react': '*' @@ -2781,17 +2781,17 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} peerDependencies: '@types/react': '*' @@ -2806,17 +2806,17 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} peerDependencies: '@types/react': '*' @@ -2831,19 +2831,19 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.31)(react@18.2.0): + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: '@types/react': '*' @@ -2853,10 +2853,10 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.31 + '@types/react': 18.2.21 react: 18.2.0 - /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} peerDependencies: '@types/react': '*' @@ -2870,16 +2870,16 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} peerDependencies: '@types/react': '*' @@ -2893,16 +2893,16 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-id@1.0.1(@types/react@18.2.31)(react@18.2.0): + /@radix-ui/react-id@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: '@types/react': '*' @@ -2912,11 +2912,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 react: 18.2.0 - /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} peerDependencies: '@types/react': '*' @@ -2930,14 +2930,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==} peerDependencies: '@types/react': '*' @@ -2952,30 +2952,30 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.31)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) dev: false - /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} peerDependencies: '@types/react': '*' @@ -2990,22 +2990,22 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.31)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.31 + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} peerDependencies: '@types/react': '*' @@ -3020,22 +3020,22 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.31)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.31 + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} peerDependencies: '@types/react': '*' @@ -3049,14 +3049,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} peerDependencies: '@types/react': '*' @@ -3070,14 +3070,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: '@types/react': '*' @@ -3091,15 +3091,15 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: '@types/react': '*' @@ -3113,13 +3113,13 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /@radix-ui/react-progress@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-progress@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-5G6Om/tYSxjSeEdrb1VfKkfZfn/1IlPWd731h2RfPuSbIfNUgfqAwbKfJCg/PP6nuUCTrYzalwHSpSinoWoCag==} peerDependencies: '@types/react': '*' @@ -3133,15 +3133,15 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} peerDependencies: '@types/react': '*' @@ -3156,20 +3156,20 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /@radix-ui/react-select@1.2.2(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-select@1.2.2(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==} peerDependencies: '@types/react': '*' @@ -3185,32 +3185,32 @@ packages: '@babel/runtime': 7.23.2 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.31)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) dev: true - /@radix-ui/react-select@2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-select@2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==} peerDependencies: '@types/react': '*' @@ -3226,32 +3226,32 @@ packages: '@babel/runtime': 7.23.2 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.31)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) dev: false - /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} peerDependencies: '@types/react': '*' @@ -3265,14 +3265,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@radix-ui/react-slot@1.0.2(@types/react@18.2.31)(react@18.2.0): + /@radix-ui/react-slot@1.0.2(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: '@types/react': '*' @@ -3282,11 +3282,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 react: 18.2.0 - /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==} peerDependencies: '@types/react': '*' @@ -3301,19 +3301,19 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==} peerDependencies: '@types/react': '*' @@ -3328,20 +3328,20 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-toast@1.1.5(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-toast@1.1.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-fRLn227WHIBRSzuRzGJ8W+5YALxofH23y0MlPLddaIpLpCDqdE0NZlS2NRQDRiptfxDeeCjgFIpexB1/zkxDlw==} peerDependencies: '@types/react': '*' @@ -3356,24 +3356,24 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==} peerDependencies: '@types/react': '*' @@ -3388,19 +3388,19 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==} peerDependencies: '@types/react': '*' @@ -3415,15 +3415,15 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@radix-ui/react-toolbar@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-toolbar@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q==} peerDependencies: '@types/react': '*' @@ -3438,19 +3438,19 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-separator': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-separator': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==} peerDependencies: '@types/react': '*' @@ -3465,24 +3465,24 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.31)(react@18.2.0): + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: '@types/react': '*' @@ -3492,10 +3492,10 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.31 + '@types/react': 18.2.21 react: 18.2.0 - /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.31)(react@18.2.0): + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} peerDependencies: '@types/react': '*' @@ -3505,11 +3505,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 react: 18.2.0 - /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.31)(react@18.2.0): + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} peerDependencies: '@types/react': '*' @@ -3519,11 +3519,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 react: 18.2.0 - /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.31)(react@18.2.0): + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} peerDependencies: '@types/react': '*' @@ -3533,10 +3533,10 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.31 + '@types/react': 18.2.21 react: 18.2.0 - /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.31)(react@18.2.0): + /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} peerDependencies: '@types/react': '*' @@ -3546,10 +3546,10 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.31 + '@types/react': 18.2.21 react: 18.2.0 - /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.31)(react@18.2.0): + /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} peerDependencies: '@types/react': '*' @@ -3560,10 +3560,10 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.31 + '@types/react': 18.2.21 react: 18.2.0 - /@radix-ui/react-use-size@1.0.1(@types/react@18.2.31)(react@18.2.0): + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} peerDependencies: '@types/react': '*' @@ -3573,11 +3573,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.31)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 react: 18.2.0 - /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} peerDependencies: '@types/react': '*' @@ -3591,8 +3591,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.31 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -3622,7 +3622,7 @@ packages: '@sinonjs/commons': 3.0.0 dev: true - /@storybook/addon-actions@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-actions@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-GieD3ru6EslKvwol1cE4lvszQCLB/AkQdnLofnqy1nnYso+hRxmPAw9/O+pWfpUBFdjXsQ7GX09+wEUpOJzepw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3634,7 +3634,7 @@ packages: optional: true dependencies: '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/core-events': 7.5.1 '@storybook/global': 5.0.0 '@storybook/manager-api': 7.5.1(react-dom@18.2.0)(react@18.2.0) @@ -3656,7 +3656,7 @@ packages: - '@types/react-dom' dev: true - /@storybook/addon-backgrounds@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-backgrounds@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-XZoyJw/WoUlVvQHPTbSAZjKy2SEUjaSmAWgcRync25vp+q0obthjx6UnZHEUuH8Ud07HA3FYzlFtMicH5y/OIQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3668,7 +3668,7 @@ packages: optional: true dependencies: '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/core-events': 7.5.1 '@storybook/global': 5.0.0 '@storybook/manager-api': 7.5.1(react-dom@18.2.0)(react@18.2.0) @@ -3684,7 +3684,7 @@ packages: - '@types/react-dom' dev: true - /@storybook/addon-controls@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-controls@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Xag1e7TZo04LjUenfobkShpKMxTtwa4xM4bXQA8LjaAGZQ7jipbQ4PE73a17K59S2vqq89VAhkuMJWiyaOFqpw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3695,9 +3695,9 @@ packages: react-dom: optional: true dependencies: - '@storybook/blocks': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@storybook/blocks': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/core-common': 7.5.1 '@storybook/core-events': 7.5.1 '@storybook/manager-api': 7.5.1(react-dom@18.2.0)(react@18.2.0) @@ -3716,7 +3716,7 @@ packages: - supports-color dev: true - /@storybook/addon-docs@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-docs@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-+wE67oWIhGK9+kv2sxoY2KDXm3v62RfEgxiksdhtffTP/joOK3p88S0lO+8g0G4xfNGUnBhPtzGMuUxWwaH2Pw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3724,9 +3724,9 @@ packages: dependencies: '@jest/transform': 29.7.0 '@mdx-js/react': 2.3.0(react@18.2.0) - '@storybook/blocks': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@storybook/blocks': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/csf-plugin': 7.5.1 '@storybook/csf-tools': 7.5.1 '@storybook/global': 5.0.0 @@ -3750,21 +3750,21 @@ packages: - supports-color dev: true - /@storybook/addon-essentials@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-essentials@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-/jaUZXV+mE/2G5PgEpFKm4lFEHluWn6GFR/pg+hphvHOzBGA3Y75JMgUfJ5CDYHB1dAVSf9JrPOd8Eb1tpESfA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/addon-actions': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-backgrounds': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-controls': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-docs': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-actions': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-backgrounds': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-controls': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-docs': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-highlight': 7.5.1 - '@storybook/addon-measure': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-outline': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-toolbars': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-viewport': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-measure': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-outline': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-toolbars': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-viewport': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/core-common': 7.5.1 '@storybook/manager-api': 7.5.1(react-dom@18.2.0)(react@18.2.0) '@storybook/node-logger': 7.5.1 @@ -3787,7 +3787,7 @@ packages: '@storybook/preview-api': 7.5.1 dev: true - /@storybook/addon-interactions@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-interactions@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-m9yohFYil+UBwYKFxHYdsAsn8PBCPl6HY/FSgfrDc5PiqT1Ya7paXopimyy9ok+VQt/RC8sEWIm809ONEoxosw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3799,7 +3799,7 @@ packages: optional: true dependencies: '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/core-common': 7.5.1 '@storybook/core-events': 7.5.1 '@storybook/global': 5.0.0 @@ -3845,7 +3845,7 @@ packages: ts-dedent: 2.2.0 dev: true - /@storybook/addon-measure@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-measure@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-yR6oELJe0UHYxRijd1YMuGaQRlZ3uABjmrXaFCPnd6agahgTwIJLiK4XamtkVur//LaiJMvtmM2XXrkJ1BvNJw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3857,7 +3857,7 @@ packages: optional: true dependencies: '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/core-events': 7.5.1 '@storybook/global': 5.0.0 '@storybook/manager-api': 7.5.1(react-dom@18.2.0)(react@18.2.0) @@ -3871,7 +3871,7 @@ packages: - '@types/react-dom' dev: true - /@storybook/addon-outline@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-outline@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-IMi5Bo34/Q5YUG5uD8ZUTBwlpGrkDIV+PUgkyNIbmn9OgozoCH80Fs7YlGluRFODQISpHwio9qvSFRGdSNT56A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3883,7 +3883,7 @@ packages: optional: true dependencies: '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/core-events': 7.5.1 '@storybook/global': 5.0.0 '@storybook/manager-api': 7.5.1(react-dom@18.2.0)(react@18.2.0) @@ -3897,7 +3897,7 @@ packages: - '@types/react-dom' dev: true - /@storybook/addon-toolbars@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-toolbars@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-T88hEEQicV6eCovr5TN2nFgKt7wU0o7pAunP5cU01iiVRj63+oQiVIBB8Xtm4tN+/DsqtyP0BTa6rFwt2ULy8A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3909,7 +3909,7 @@ packages: optional: true dependencies: '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/manager-api': 7.5.1(react-dom@18.2.0)(react@18.2.0) '@storybook/preview-api': 7.5.1 '@storybook/theming': 7.5.1(react-dom@18.2.0)(react@18.2.0) @@ -3920,7 +3920,7 @@ packages: - '@types/react-dom' dev: true - /@storybook/addon-viewport@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-viewport@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-L57lOGB3LfKgAdLinaZojRQ9W9w2RC0iP9bVaXwrRVeJdpNayfuW4Kh1C8dmacZroB4Zp2U/nEjkSmdcp6uUWg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3932,7 +3932,7 @@ packages: optional: true dependencies: '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/core-events': 7.5.1 '@storybook/global': 5.0.0 '@storybook/manager-api': 7.5.1(react-dom@18.2.0)(react@18.2.0) @@ -3947,7 +3947,7 @@ packages: - '@types/react-dom' dev: true - /@storybook/blocks@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@storybook/blocks@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-7b69p6kDdgmlejEMM2mW6/Lz4OmU/R3Qr+TpKnPcV5iS7ADxRQEQCTEMoQ5RyLJf0vDRh/7Ljn/RMo8Ux3X7JA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3955,7 +3955,7 @@ packages: dependencies: '@storybook/channels': 7.5.1 '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/core-events': 7.5.1 '@storybook/csf': 0.1.1 '@storybook/docs-tools': 7.5.1 @@ -4153,14 +4153,14 @@ packages: - supports-color dev: true - /@storybook/components@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0): + /@storybook/components@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-fdzzxGBV/Fj9pYwfYL3RZsVUHeBqlfLMBP/L6mPmjaZSwHFqkaRZZUajZc57lCtI+TOy2gY6WH3cPavEtqtgLw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@radix-ui/react-select': 1.2.2(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-toolbar': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-select': 1.2.2(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toolbar': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/client-logger': 7.5.1 '@storybook/csf': 0.1.1 '@storybook/global': 5.0.0 @@ -4386,7 +4386,7 @@ packages: resolution: {integrity: sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==} dev: true - /@storybook/nextjs@7.5.1(@swc/core@1.3.94)(@types/react-dom@18.2.14)(@types/react@18.2.31)(esbuild@0.18.20)(next@13.5.6)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4)(typescript@5.2.2)(webpack@5.89.0): + /@storybook/nextjs@7.5.1(@swc/core@1.3.94)(@types/react-dom@18.2.14)(@types/react@18.2.21)(esbuild@0.18.20)(next@13.5.6)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4)(typescript@5.2.2)(webpack@5.89.0): resolution: {integrity: sha512-DezMv3UZYzqltzOgLw1TOQOct3IQ9zGffvfP3T/mRQxmW7UOYXDbAtmD/d3Ud6Fi59HuEnu4hEwyJNacZvuNqw==} engines: {node: '>=16.0.0'} peerDependencies: @@ -4419,7 +4419,7 @@ packages: '@babel/preset-react': 7.22.15(@babel/core@7.23.2) '@babel/preset-typescript': 7.23.2(@babel/core@7.23.2) '@babel/runtime': 7.23.2 - '@storybook/addon-actions': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.31)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-actions': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@storybook/builder-webpack5': 7.5.1(esbuild@0.18.20)(typescript@5.2.2) '@storybook/core-common': 7.5.1 '@storybook/core-events': 7.5.1 @@ -5251,10 +5251,17 @@ packages: /@types/react-dom@18.2.14: resolution: {integrity: sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==} dependencies: - '@types/react': 18.2.31 + '@types/react': 18.2.33 - /@types/react@18.2.31: - resolution: {integrity: sha512-c2UnPv548q+5DFh03y8lEDeMfDwBn9G3dRwfkrxQMo/dOtRHUUO57k6pHvBIfH/VF4Nh+98mZ5aaSe+2echD5g==} + /@types/react@18.2.21: + resolution: {integrity: sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==} + dependencies: + '@types/prop-types': 15.7.9 + '@types/scheduler': 0.16.5 + csstype: 3.1.2 + + /@types/react@18.2.33: + resolution: {integrity: sha512-v+I7S+hu3PIBoVkKGpSYYpiBT1ijqEzWpzQD62/jm4K74hPpSP7FF9BnKG6+fg2+62weJYkkBWDJlZt5JO/9hg==} dependencies: '@types/prop-types': 15.7.9 '@types/scheduler': 0.16.5 @@ -11512,7 +11519,7 @@ packages: engines: {node: '>=0.10.0'} dev: true - /react-remove-scroll-bar@2.3.4(@types/react@18.2.31)(react@18.2.0): + /react-remove-scroll-bar@2.3.4(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} engines: {node: '>=10'} peerDependencies: @@ -11522,12 +11529,12 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.31 + '@types/react': 18.2.21 react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.31)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.21)(react@18.2.0) tslib: 2.6.2 - /react-remove-scroll@2.5.5(@types/react@18.2.31)(react@18.2.0): + /react-remove-scroll@2.5.5(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} engines: {node: '>=10'} peerDependencies: @@ -11537,13 +11544,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.31 + '@types/react': 18.2.21 react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.31)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.31)(react@18.2.0) + react-remove-scroll-bar: 2.3.4(@types/react@18.2.21)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.21)(react@18.2.0) tslib: 2.6.2 - use-callback-ref: 1.3.0(@types/react@18.2.31)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.31)(react@18.2.0) + use-callback-ref: 1.3.0(@types/react@18.2.21)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.21)(react@18.2.0) /react-ssr-prepass@1.5.0(react@18.2.0): resolution: {integrity: sha512-yFNHrlVEReVYKsLI5lF05tZoHveA5pGzjFbFJY/3pOqqjGOmMmqx83N4hIjN2n6E1AOa+eQEUxs3CgRnPmT0RQ==} @@ -11553,7 +11560,7 @@ packages: react: 18.2.0 dev: false - /react-style-singleton@2.2.1(@types/react@18.2.31)(react@18.2.0): + /react-style-singleton@2.2.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -11563,7 +11570,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.31 + '@types/react': 18.2.21 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 @@ -13062,7 +13069,7 @@ packages: qs: 6.11.2 dev: true - /use-callback-ref@1.3.0(@types/react@18.2.31)(react@18.2.0): + /use-callback-ref@1.3.0(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} engines: {node: '>=10'} peerDependencies: @@ -13072,7 +13079,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.31 + '@types/react': 18.2.21 react: 18.2.0 tslib: 2.6.2 @@ -13087,7 +13094,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /use-sidecar@1.1.2(@types/react@18.2.31)(react@18.2.0): + /use-sidecar@1.1.2(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -13097,7 +13104,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.31 + '@types/react': 18.2.21 detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.6.2 diff --git a/server/routers/appSettings.ts b/server/routers/appSettings.ts index 1f456a0e..243d1299 100644 --- a/server/routers/appSettings.ts +++ b/server/routers/appSettings.ts @@ -13,7 +13,7 @@ import { signOutProc } from './session'; const calculateIsExpired = (configured: boolean, initializedAt: Date) => !configured && initializedAt.getTime() < Date.now() - UNCONFIGURED_TIMEOUT; -const getappSettings = async () => { +export const getAppSettings = async () => { let appSettings = await prisma.appSettings.findFirst(); // if no setup appSettings exists, seed it if (!appSettings) { @@ -35,24 +35,24 @@ const getappSettings = async () => { }; const getPropertiesRouter = router({ - allappSettings: publicProcedure.query(getappSettings), + allappSettings: publicProcedure.query(getAppSettings), expired: publicProcedure.query(async () => { - const { expired } = await getappSettings(); + const { expired } = await getAppSettings(); return expired; }), configured: publicProcedure.query(async () => { - const { configured } = await getappSettings(); + const { configured } = await getAppSettings(); return configured; }), initializedAt: publicProcedure.query(async () => { - const { initializedAt } = await getappSettings(); + const { initializedAt } = await getAppSettings(); return initializedAt; }), allowAnonymousRecruitment: publicProcedure.query(async () => { - const { allowAnonymousRecruitment } = await getappSettings(); + const { allowAnonymousRecruitment } = await getAppSettings(); return allowAnonymousRecruitment; }), @@ -63,7 +63,7 @@ export const appSettingsRouter = router({ updateAnonymousRecruitment: protectedProcedure .input(z.boolean()) .mutation(async ({ input }) => { - const { configured, initializedAt } = await getappSettings(); + const { configured, initializedAt } = await getAppSettings(); try { const updatedappSettings = await prisma.appSettings.update({ where: { @@ -102,7 +102,7 @@ export const appSettingsRouter = router({ // Todo: we need to remove assets from uploadthing before deleting the reference record. }), setConfigured: publicProcedure.mutation(async () => { - const { configured, initializedAt } = await getappSettings(); + const { configured, initializedAt } = await getAppSettings(); await prisma.appSettings.update({ where: { diff --git a/trpc/server.ts b/trpc/server.ts index cc72cc3f..42ab543c 100644 --- a/trpc/server.ts +++ b/trpc/server.ts @@ -1,17 +1,13 @@ 'use server'; -import { - createTRPCProxyClient, - loggerLink, - unstable_httpBatchStreamLink, -} from '@trpc/client'; +import { createTRPCProxyClient, loggerLink } from '@trpc/client'; import { experimental_nextHttpLink } from '@trpc/next/app-dir/links/nextHttp'; -import { experimental_createTRPCNextAppDirServer } from '@trpc/next/app-dir/server'; import { headers } from 'next/headers'; import SuperJSON from 'superjson'; import { env } from '~/env.mjs'; import { type AppRouter } from '~/server/router'; import { getUrl } from '~/trpc/shared'; +import 'server-only'; /** * This client invokes procedures directly on the server without fetching over HTTP. @@ -44,6 +40,11 @@ import { getUrl } from '~/trpc/shared'; // headers() { // const heads = new Map(headers()); // heads.set('x-trpc-source', 'rsc-invoke'); + +// // Bug with next fetch and tRPC: https://discord.com/channels/867764511159091230/1156105147315933235/1156767718956072992 +// heads.delete('content-length'); +// heads.delete('content-type'); + // return Object.fromEntries(heads); // }, // url: getUrl(), @@ -75,6 +76,11 @@ export const api = createTRPCProxyClient({ headers() { const heads = new Map(headers()); heads.set('x-trpc-source', 'rsc-invoke'); + + // Bug with next fetch and tRPC: https://discord.com/channels/867764511159091230/1156105147315933235/1156767718956072992 + heads.delete('content-length'); + heads.delete('content-type'); + return Object.fromEntries(heads); }, url: getUrl(), From 5d40e26a870e1b6a4bfe327b625d036c4898376b Mon Sep 17 00:00:00 2001 From: Joshua Melville Date: Fri, 27 Oct 2023 15:34:06 +0200 Subject: [PATCH 02/14] refactor onboarding process and implement client side revalidation via api route handler --- .../dashboard/_components/ResetButton.tsx | 4 +- app/(onboard)/_components/Helpers.tsx | 26 +++ .../OnboardSteps/CreateAccount.tsx | 59 +++++-- .../OnboardSteps/Documentation.tsx | 21 ++- .../OnboardSteps/ManageParticipants.tsx | 36 +++-- .../_components/OnboardSteps/Steps.tsx | 23 --- .../_components/OnboardSteps/StepsSidebar.tsx | 56 ------- .../OnboardSteps/UploadProtocol.tsx | 12 +- .../_components/OnboardingProvider.tsx | 34 ++++ app/(onboard)/_components/Sidebar.tsx | 53 ++++++ app/(onboard)/setup/page.tsx | 151 ++++++++++++------ app/api/revalidate/route.ts | 18 +++ .../AnonymousRecruitmentSwitch/Switch.tsx | 13 +- components/ui/FancyButton.tsx | 52 ++++++ providers/SessionProvider.tsx | 5 +- server/routers/appSettings.ts | 4 + utils/calculateRedirectedRoutes.ts | 2 +- utils/clientRevalidate.ts | 27 ++++ 18 files changed, 407 insertions(+), 189 deletions(-) create mode 100644 app/(onboard)/_components/Helpers.tsx delete mode 100644 app/(onboard)/_components/OnboardSteps/Steps.tsx delete mode 100644 app/(onboard)/_components/OnboardSteps/StepsSidebar.tsx create mode 100644 app/(onboard)/_components/OnboardingProvider.tsx create mode 100644 app/(onboard)/_components/Sidebar.tsx create mode 100644 app/api/revalidate/route.ts create mode 100644 components/ui/FancyButton.tsx create mode 100644 utils/clientRevalidate.ts diff --git a/app/(dashboard)/dashboard/_components/ResetButton.tsx b/app/(dashboard)/dashboard/_components/ResetButton.tsx index bfd18964..2afe5bd2 100644 --- a/app/(dashboard)/dashboard/_components/ResetButton.tsx +++ b/app/(dashboard)/dashboard/_components/ResetButton.tsx @@ -5,7 +5,7 @@ import { useRouter } from 'next/navigation'; import { useState } from 'react'; import { api } from '~/trpc/client'; import { Button } from '~/components/ui/Button'; -import { revalidatePath } from 'next/cache'; +import { clientRevalidatePath } from '~/utils/clientRevalidate'; const ResetButton = () => { const [loading, setLoading] = useState(false); @@ -15,7 +15,7 @@ const ResetButton = () => { const reset = async () => { setLoading(true); await resetConfigured(); - revalidatePath('/'); + await clientRevalidatePath('/'); router.refresh(); }; diff --git a/app/(onboard)/_components/Helpers.tsx b/app/(onboard)/_components/Helpers.tsx new file mode 100644 index 00000000..781fe682 --- /dev/null +++ b/app/(onboard)/_components/Helpers.tsx @@ -0,0 +1,26 @@ +import { motion } from 'framer-motion'; +import { Loader2 } from 'lucide-react'; +import type { ReactNode } from 'react'; + +export const StepLoadingState = () => ( + + + +); + +export const StepMotionWrapper = ({ children }: { children: ReactNode }) => { + return ( + + {children} + + ); +}; diff --git a/app/(onboard)/_components/OnboardSteps/CreateAccount.tsx b/app/(onboard)/_components/OnboardSteps/CreateAccount.tsx index df97148b..8bfb00a4 100644 --- a/app/(onboard)/_components/OnboardSteps/CreateAccount.tsx +++ b/app/(onboard)/_components/OnboardSteps/CreateAccount.tsx @@ -1,30 +1,63 @@ 'use client'; -import type { Route } from 'next'; -import { usePathname, useRouter, useSearchParams } from 'next/navigation'; import { SignUpForm } from '~/app/(onboard)/_components/SignUpForm'; +import { Button } from '~/components/ui/Button'; +import { useSession } from '~/providers/SessionProvider'; +import { useOnboardingContext } from '../OnboardingProvider'; +import { api } from '~/trpc/client'; +import { env } from '~/env.mjs'; +import { useRouter } from 'next/navigation'; function CreateAccount() { const router = useRouter(); - const pathname = usePathname() as Route; - const searchParams = useSearchParams(); - const step = searchParams.get('step'); + const { currentStep, setCurrentStep } = useOnboardingContext(); + const { session, isLoading } = useSession(); + const { data: adminUserExists, isLoading: isCheckingAdminUser } = + api.appSettings.get.adminUserExists.useQuery(); const completeCallback = () => { - router.push(`${pathname}?step=${parseInt(step || '1') + 1}`); + setCurrentStep(2).catch(() => {}); }; + if (isLoading || isCheckingAdminUser) { + return null; + } + + if (adminUserExists) { + router.push(`/signin?callbackUrl=${encodeURI('/setup')}`); + } + return ( -
+

Create an Account

-

- To use Fresco, you need to set up an administrator account which will - enable to you access the protect parts of the app. Only one - administrator account can be created. -

- + {session && ( +
+

+ You have already created an admin account and are logged in. Please + continue to the next step in the setup process. +

+ {env.NODE_ENV === 'development' && ( + + )} + +
+ )} + {!session && ( + <> +

+ To use Fresco, you need to set up an administrator account which + will enable to you access the protect parts of the app. Only one + administrator account can be created. +

+ + + )}
); } diff --git a/app/(onboard)/_components/OnboardSteps/Documentation.tsx b/app/(onboard)/_components/OnboardSteps/Documentation.tsx index 8a155141..c56677e8 100644 --- a/app/(onboard)/_components/OnboardSteps/Documentation.tsx +++ b/app/(onboard)/_components/OnboardSteps/Documentation.tsx @@ -2,20 +2,25 @@ import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card'; import { FileText, Loader2, MonitorPlay } from 'lucide-react'; -import { Button } from '~/components/ui/Button'; import { api } from '~/trpc/client'; import { useState } from 'react'; -import { revalidateTag } from 'next/cache'; +import { FancyButton } from '~/components/ui/FancyButton'; +import { clientRevalidateTag } from '~/utils/clientRevalidate'; +import { useRouter } from 'next/navigation'; function Documentation() { const [loading, setLoading] = useState(false); + const router = useRouter(); + const { mutate: setConfigured } = api.appSettings.setConfigured.useMutation({ onMutate: () => { setLoading(true); }, onSuccess: () => { - revalidateTag('appConfigured'); - window.location.replace('/dashboard'); + clientRevalidateTag('appConfigured') + .then(() => router.refresh()) + // eslint-disable-next-line no-console + .catch((e) => console.error(e)); }, onError: () => { setLoading(false); @@ -72,10 +77,10 @@ function Documentation() { -
- +
+ setConfigured()}> + Go to the dashboard! +
); diff --git a/app/(onboard)/_components/OnboardSteps/ManageParticipants.tsx b/app/(onboard)/_components/OnboardSteps/ManageParticipants.tsx index 459b672d..3555dfe1 100644 --- a/app/(onboard)/_components/OnboardSteps/ManageParticipants.tsx +++ b/app/(onboard)/_components/OnboardSteps/ManageParticipants.tsx @@ -1,21 +1,23 @@ +'use client'; + import { Check } from 'lucide-react'; +import { Button } from '~/components/ui/Button'; import ImportCSVModal from '~/app/(dashboard)/dashboard/participants/_components/ImportCSVModal'; -import AnonymousRecruitmentSwitch from '~/components/AnonymousRecruitmentSwitch/AnonymousRecruitmentSwitch'; +import { useOnboardingContext } from '../OnboardingProvider'; +import { useState } from 'react'; +// import AnonymousRecruitmentSwitch from '~/components/AnonymousRecruitmentSwitch/AnonymousRecruitmentSwitch'; function ManageParticipants() { - // const pathname = usePathname() as Route; - // const searchParams = useSearchParams(); - // const currentStep = searchParams.get('step') as string; - // const [participantsUploaded, setParticipantsUploaded] = useState(false); - // const router = useRouter(); + const [participantsUploaded, setParticipantsUploaded] = useState(false); + const { currentStep, setCurrentStep } = useOnboardingContext(); - // const handleParticipantsUploaded = () => { - // setParticipantsUploaded(true); - // }; + const handleParticipantsUploaded = () => { + setParticipantsUploaded(true); + }; - // const handleNextStep = () => { - // router.replace(`${pathname}?step=${parseInt(currentStep) + 1}`); - // }; + const handleNextStep = () => { + setCurrentStep(currentStep + 1).catch(() => {}); + }; return (
@@ -35,17 +37,17 @@ function ManageParticipants() { Upload a CSV file of participants.

- {/* {participantsUploaded && } + {participantsUploaded && } {!participantsUploaded && ( - )} */} + )}
- - {/*
+ {/* */} +
-
*/} +
); } diff --git a/app/(onboard)/_components/OnboardSteps/Steps.tsx b/app/(onboard)/_components/OnboardSteps/Steps.tsx deleted file mode 100644 index 3f128dff..00000000 --- a/app/(onboard)/_components/OnboardSteps/Steps.tsx +++ /dev/null @@ -1,23 +0,0 @@ -export type Step = { - description: string; - component: string; -}; - -export const steps: Step[] = [ - { - description: 'Create Account', - component: 'CreateAccount', - }, - { - description: 'Upload Protocol', - component: 'UploadProtocol', - }, - { - description: 'Configure Participation', - component: 'ManageParticipants', - }, - { - description: 'Documentation', - component: 'Documentation', - }, -]; diff --git a/app/(onboard)/_components/OnboardSteps/StepsSidebar.tsx b/app/(onboard)/_components/OnboardSteps/StepsSidebar.tsx deleted file mode 100644 index 42eee7f1..00000000 --- a/app/(onboard)/_components/OnboardSteps/StepsSidebar.tsx +++ /dev/null @@ -1,56 +0,0 @@ -'use client'; - -import { Check } from 'lucide-react'; -import { steps } from '~/app/(onboard)/_components/OnboardSteps/Steps'; -import { cn } from '~/utils/shadcn'; - -const StepNumber = ({ - number, - description, - active = false, - complete = false, -}: { - number: number; - description: string; - active?: boolean; - complete?: boolean; -}) => { - const outerClasses = cn( - 'flex items-center gap-2 py-2 px-6 rounded-xl', - active && 'bg-white', - ); - - return ( -
-
- {complete ? : number + 1} -
-
-

{description}

-
-
- ); -}; - -function OnboardSteps({ currentStep }: { currentStep: keyof typeof steps }) { - return ( -
- {steps.map((stepItem, index) => ( - - ))} -
- ); -} - -export default OnboardSteps; diff --git a/app/(onboard)/_components/OnboardSteps/UploadProtocol.tsx b/app/(onboard)/_components/OnboardSteps/UploadProtocol.tsx index bc52bcd4..def4b926 100644 --- a/app/(onboard)/_components/OnboardSteps/UploadProtocol.tsx +++ b/app/(onboard)/_components/OnboardSteps/UploadProtocol.tsx @@ -3,28 +3,24 @@ import { Check } from 'lucide-react'; import { useState } from 'react'; import ProtocolUploader from '~/app/(dashboard)/dashboard/_components/ProtocolUploader'; import { Button } from '~/components/ui/Button'; -import { usePathname, useRouter, useSearchParams } from 'next/navigation'; -import type { Route } from 'next'; +import { useOnboardingContext } from '../OnboardingProvider'; function ConfigureStudy() { - const pathname = usePathname() as Route; const [protocolUploaded, setProtocolUploaded] = useState(false); - const searchParams = useSearchParams(); - const currentStep = searchParams.get('step') as string; - const router = useRouter(); + const { currentStep, setCurrentStep } = useOnboardingContext(); const handleProtocolUploaded = () => { setProtocolUploaded(true); }; const handleNextStep = () => { - router.replace(`${pathname}?step=${parseInt(currentStep) + 1}`); + setCurrentStep(currentStep + 1).catch(() => {}); }; return (
-

Upload a protocol

+

Upload a Protocol

Upload a Network Canvas protocol file (.netcanvas) to create your study. You can upload more protocol files later from the diff --git a/app/(onboard)/_components/OnboardingProvider.tsx b/app/(onboard)/_components/OnboardingProvider.tsx new file mode 100644 index 00000000..7271ec5a --- /dev/null +++ b/app/(onboard)/_components/OnboardingProvider.tsx @@ -0,0 +1,34 @@ +import { useQueryState, parseAsInteger } from 'next-usequerystate'; +import { createContext, useContext, type ReactNode } from 'react'; + +type OnboardingContext = { + currentStep: number; + setCurrentStep: (step: number) => Promise; +}; + +const onboardingContext = createContext(null); + +export const useOnboardingContext = () => { + const context = useContext(onboardingContext); + + if (!context) { + throw new Error( + 'useOnboardingContext must be used within a OnboardingProvider', + ); + } + + return context; +}; + +export const OnboardingProvider = ({ children }: { children: ReactNode }) => { + const [currentStep, setCurrentStep] = useQueryState( + 'step', + parseAsInteger.withDefault(1), + ); + + return ( + + {children} + + ); +}; diff --git a/app/(onboard)/_components/Sidebar.tsx b/app/(onboard)/_components/Sidebar.tsx new file mode 100644 index 00000000..ca6479a1 --- /dev/null +++ b/app/(onboard)/_components/Sidebar.tsx @@ -0,0 +1,53 @@ +'use client'; + +import { Check } from 'lucide-react'; +import { cn } from '~/utils/shadcn'; +import { useOnboardingContext } from './OnboardingProvider'; + +const stepLabels = [ + 'Create Account', + 'Upload Protocol', + 'Configure Participation', + 'Documentation', +]; + +function OnboardSteps() { + const { currentStep, setCurrentStep } = useOnboardingContext(); + + return ( +

+ {stepLabels.map((step, index) => ( +
index && 'pointer-events-auto cursor-pointer', + )} + onClick={() => void setCurrentStep(index + 1)} + > +
+ {index < currentStep - 1 ? ( + + ) : ( + index + 1 + )} +
+
+

{step}

+
+
+ ))} +
+ ); +} + +export default OnboardSteps; diff --git a/app/(onboard)/setup/page.tsx b/app/(onboard)/setup/page.tsx index 5930be52..6646a08e 100644 --- a/app/(onboard)/setup/page.tsx +++ b/app/(onboard)/setup/page.tsx @@ -1,65 +1,120 @@ -import { revalidateTag } from 'next/cache'; -import { redirect } from 'next/navigation'; -import { api } from '~/trpc/server'; -import { getServerSession } from '~/utils/auth'; +'use client'; + import { cn } from '~/utils/shadcn'; +import { usePathname, useRouter } from 'next/navigation'; +import OnboardSteps from '../_components/Sidebar'; +import { parseAsInteger, useQueryState } from 'next-usequerystate'; import { userFormClasses } from '../_shared'; -import OnboardSteps from '../_components/OnboardSteps/StepsSidebar'; - -import { Suspense } from 'react'; +import { useSession } from '~/providers/SessionProvider'; +import React, { useCallback, useEffect } from 'react'; +import type { Route } from 'next'; +import { api } from '~/trpc/client'; import dynamic from 'next/dynamic'; -import { steps } from '../_components/OnboardSteps/Steps'; +import { AnimatePresence, motion } from 'framer-motion'; +import { OnboardingProvider } from '../_components/OnboardingProvider'; +import { StepLoadingState, StepMotionWrapper } from '../_components/Helpers'; +import { clientRevalidateTag } from '~/utils/clientRevalidate'; -async function Page({ - searchParams: { step = '1' }, -}: { - searchParams: { - step?: string; - }; -}) { - const stepInt = parseInt(step ?? '1', 10); +// Stages are dynamically imported, and then conditionally rendered, so that +// we don't load all the code for all the stages at once. +const CreateAccount = dynamic( + () => import('../_components/OnboardSteps/CreateAccount'), + { + loading: () => , + }, +); +const UploadProtocol = dynamic( + () => import('../_components/OnboardSteps/UploadProtocol'), + { + loading: () => , + }, +); +const ManageParticipants = dynamic( + () => import('../_components/OnboardSteps/ManageParticipants'), + { + loading: () => , + }, +); +const Documentation = dynamic( + () => import('../_components/OnboardSteps/Documentation'), + { + loading: () => , + }, +); - const expired = await api.appSettings.get.expired.query(undefined, { - context: { - revalidate: 1, - }, - }); +function Page() { + const { session, isLoading } = useSession(); + const pathname = usePathname() as Route; + const router = useRouter(); - if (expired) { - revalidateTag('appExpired'); - } + const [currentStep, setCurrentStep] = useQueryState( + 'step', + parseAsInteger.withDefault(1), + ); - const session = await getServerSession(); + const { data: expired } = api.appSettings.get.expired.useQuery(undefined, { + refetchInterval: 1000 * 10, + }); - // If we have a session already, skip the account signup step - if (session && stepInt === 1) { - redirect('/setup?step=2'); - } + useEffect(() => { + if (expired) { + clientRevalidateTag('appExpired') + .then(() => router.refresh()) + // eslint-disable-next-line no-console + .catch((e) => console.error(e)); + } - if (!session && stepInt > 1) { - redirect('/setup?step=1'); - } + if (isLoading) { + return; + } - console.log('step', step); + if (!session && currentStep !== 1) { + setCurrentStep(1).catch(() => {}); + return; + } + }, [ + isLoading, + expired, + router, + pathname, + session, + currentStep, + setCurrentStep, + ]); const cardClasses = cn(userFormClasses, 'flex-row bg-transparent p-0 gap-6'); - const mainClasses = cn('bg-white flex w-full p-8 rounded-xl'); - - const StepComponent = steps[stepInt - 1].component; - - const CustomModule = dynamic( - () => import(`../_components/OnboardSteps/${StepComponent}`), - ); + const mainClasses = cn('bg-white flex w-full p-12 rounded-xl'); return ( -
- -
- Loading...
}> - - -
-
+ + + +
+ + {currentStep === 1 && ( + + + + )} + {currentStep === 2 && ( + + + + )} + {currentStep === 3 && ( + + + + )} + {currentStep === 4 && ( + + + + )} + +
+
+
); } diff --git a/app/api/revalidate/route.ts b/app/api/revalidate/route.ts new file mode 100644 index 00000000..f5a4b5b3 --- /dev/null +++ b/app/api/revalidate/route.ts @@ -0,0 +1,18 @@ +import { revalidatePath, revalidateTag } from 'next/cache'; + +// Route handler for triggering revalidation based on a tag or a path from client components +export async function POST(request: Request) { + const { tag, path } = await request.json(); + + if (tag) { + revalidateTag(tag); + return Response.json({ revalidated: true, now: Date.now() }); + } + + if (path) { + revalidatePath(path); + return Response.json({ revalidated: true, now: Date.now() }); + } + + return Response.json({ revalidated: false, now: Date.now() }); +} diff --git a/components/AnonymousRecruitmentSwitch/Switch.tsx b/components/AnonymousRecruitmentSwitch/Switch.tsx index 84e84e8a..ac03c6dc 100644 --- a/components/AnonymousRecruitmentSwitch/Switch.tsx +++ b/components/AnonymousRecruitmentSwitch/Switch.tsx @@ -3,18 +3,13 @@ import { Switch as SwitchUI } from '~/components/ui/switch'; import { setAnonymousRecruitment } from './action'; -import { - useTransition, - experimental_useOptimistic as useOptimistic, -} from 'react'; +import { experimental_useOptimistic as useOptimistic } from 'react'; const Switch = ({ allowAnonymousRecruitment, }: { allowAnonymousRecruitment: boolean; }) => { - const [isPending, startTransition] = useTransition(); - const [ optimisticAllowAnonymousRecruitment, setOptimisticAllowAnonymousRecruitment, @@ -23,11 +18,6 @@ const Switch = ({ (state: boolean, newState: boolean) => newState, ); - console.log('op', { - optimisticAllowAnonymousRecruitment, - allowAnonymousRecruitment, - }); - return (
@@ -41,7 +31,6 @@ const Switch = ({ name="allowAnonymousRecruitment" checked={optimisticAllowAnonymousRecruitment} onCheckedChange={async (value) => { - console.log('hello', value); setOptimisticAllowAnonymousRecruitment(value); await setAnonymousRecruitment(value); }} diff --git a/components/ui/FancyButton.tsx b/components/ui/FancyButton.tsx new file mode 100644 index 00000000..3ce06bca --- /dev/null +++ b/components/ui/FancyButton.tsx @@ -0,0 +1,52 @@ +import * as React from 'react'; +import { cva, type VariantProps } from 'class-variance-authority'; +import { cn } from '~/utils/shadcn'; +import BackgroundBlobs from '../BackgroundBlobs/BackgroundBlobs'; + +const fancyButtonVariants = cva( + 'inline-flex items-center justify-center rounded-xl text-lg font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 relative overflow-hidden', + { + variants: { + variant: { + default: + 'bg-primary text-primary-foreground hover:bg-primary/90 border border-primary-foreground hover:border-primary-foreground/90', + }, + size: { + default: 'px-8 py-4', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +); + +export interface FancyButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean; +} + +const FancyButton = React.forwardRef( + ({ children, className, variant, size, ...props }, ref) => { + return ( + + ); + }, +); + +FancyButton.displayName = 'Button'; + +export { FancyButton, fancyButtonVariants }; diff --git a/providers/SessionProvider.tsx b/providers/SessionProvider.tsx index 9fc86b6e..3480486a 100644 --- a/providers/SessionProvider.tsx +++ b/providers/SessionProvider.tsx @@ -50,6 +50,8 @@ export const SessionProvider = ({ }, }); + const { mutateAsync: signOut } = api.session.signOut.useMutation(); + // If we have an initial session, we don't need to fetch it again. useEffect(() => { if (initialSession) { @@ -75,8 +77,9 @@ export const SessionProvider = ({ () => ({ session, isLoading, + signOut, }), - [session, isLoading], + [session, isLoading, signOut], ); return ( diff --git a/server/routers/appSettings.ts b/server/routers/appSettings.ts index 243d1299..87b71abf 100644 --- a/server/routers/appSettings.ts +++ b/server/routers/appSettings.ts @@ -36,6 +36,10 @@ export const getAppSettings = async () => { const getPropertiesRouter = router({ allappSettings: publicProcedure.query(getAppSettings), + adminUserExists: publicProcedure.query(async () => { + const user = await prisma.user.count(); + return user > 0; + }), expired: publicProcedure.query(async () => { const { expired } = await getAppSettings(); diff --git a/utils/calculateRedirectedRoutes.ts b/utils/calculateRedirectedRoutes.ts index e97f4706..ce82c98b 100644 --- a/utils/calculateRedirectedRoutes.ts +++ b/utils/calculateRedirectedRoutes.ts @@ -12,7 +12,7 @@ const routeIsLandingPage = (pathname: Route) => { }; const routeIsOnboarding = (pathname: Route) => { - return pathname === '/setup'; + return pathname.startsWith('/setup'); }; const routeIsInterviewing = (pathname: Route) => { diff --git a/utils/clientRevalidate.ts b/utils/clientRevalidate.ts new file mode 100644 index 00000000..dddadb8c --- /dev/null +++ b/utils/clientRevalidate.ts @@ -0,0 +1,27 @@ +import 'client-only'; + +const API_PATH = '/api/revalidate'; + +export const clientRevalidateTag = (tag: string) => { + return fetch(API_PATH, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + tag, + }), + }); +}; + +export const clientRevalidatePath = (path: string) => { + return fetch(API_PATH, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + path, + }), + }); +}; From 48d12fbc3fdbd47b8f0834a320c561f7956448f0 Mon Sep 17 00:00:00 2001 From: Joshua Melville Date: Fri, 27 Oct 2023 15:37:01 +0200 Subject: [PATCH 03/14] add revalidateTag to reset tRPC procedure --- app/(dashboard)/dashboard/_components/ResetButton.tsx | 2 -- server/routers/appSettings.ts | 5 +++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/(dashboard)/dashboard/_components/ResetButton.tsx b/app/(dashboard)/dashboard/_components/ResetButton.tsx index 2afe5bd2..d15b2f77 100644 --- a/app/(dashboard)/dashboard/_components/ResetButton.tsx +++ b/app/(dashboard)/dashboard/_components/ResetButton.tsx @@ -5,7 +5,6 @@ import { useRouter } from 'next/navigation'; import { useState } from 'react'; import { api } from '~/trpc/client'; import { Button } from '~/components/ui/Button'; -import { clientRevalidatePath } from '~/utils/clientRevalidate'; const ResetButton = () => { const [loading, setLoading] = useState(false); @@ -15,7 +14,6 @@ const ResetButton = () => { const reset = async () => { setLoading(true); await resetConfigured(); - await clientRevalidatePath('/'); router.refresh(); }; diff --git a/server/routers/appSettings.ts b/server/routers/appSettings.ts index 87b71abf..e65972f3 100644 --- a/server/routers/appSettings.ts +++ b/server/routers/appSettings.ts @@ -9,6 +9,7 @@ import { import { UNCONFIGURED_TIMEOUT } from '~/fresco.config'; import { z } from 'zod'; import { signOutProc } from './session'; +import { revalidatePath, revalidateTag } from 'next/cache'; const calculateIsExpired = (configured: boolean, initializedAt: Date) => !configured && initializedAt.getTime() < Date.now() - UNCONFIGURED_TIMEOUT; @@ -103,6 +104,10 @@ export const appSettingsRouter = router({ await prisma.participant.deleteMany(); await prisma.protocol.deleteMany(); // Deleting protocol will cascade to Interviews + revalidateTag('appConfigured'); + revalidateTag('appExpired'); + revalidatePath('/'); + // Todo: we need to remove assets from uploadthing before deleting the reference record. }), setConfigured: publicProcedure.mutation(async () => { From f9b5a4137552daf4ce4ee5f6235cbcf0bb46ce7f Mon Sep 17 00:00:00 2001 From: Joshua Melville Date: Mon, 30 Oct 2023 13:35:20 +0200 Subject: [PATCH 04/14] improvements to revalidation: use tRPC generated cache keys, and experimental_nextCacheLink --- app/(interview)/interview/new/page.tsx | 9 +- .../OnboardSteps/CreateAccount.tsx | 51 +----- app/(onboard)/setup/page.tsx | 16 +- app/_actions.ts | 5 - app/layout.tsx | 26 ++- .../AnonymousRecruitmentSwitch.tsx | 16 +- .../AnonymousRecruitmentSwitch/action.ts | 24 +-- prisma/schema.prisma | 7 +- server/routers/appSettings.ts | 81 +++------- trpc/server.ts | 153 ++++++++++-------- 10 files changed, 139 insertions(+), 249 deletions(-) diff --git a/app/(interview)/interview/new/page.tsx b/app/(interview)/interview/new/page.tsx index 37adeec5..ca83548f 100644 --- a/app/(interview)/interview/new/page.tsx +++ b/app/(interview)/interview/new/page.tsx @@ -29,14 +29,9 @@ export default async function Page({ ); } // check if anonymous recruitment is enabled - const allowAnonymousRecruitment = - await api.appSettings.get.allowAnonymousRecruitment.query(undefined, { - context: { - revalidate: 0, - }, - }); + const appSettings = await api.appSettings.get.query(); - if (!allowAnonymousRecruitment) { + if (!appSettings || !appSettings.allowAnonymousRecruitment) { return ( { setCurrentStep(2).catch(() => {}); }; - if (isLoading || isCheckingAdminUser) { - return null; - } - - if (adminUserExists) { - router.push(`/signin?callbackUrl=${encodeURI('/setup')}`); - } - return (

Create an Account

- {session && ( -
-

- You have already created an admin account and are logged in. Please - continue to the next step in the setup process. -

- {env.NODE_ENV === 'development' && ( - - )} - -
- )} - {!session && ( - <> -

- To use Fresco, you need to set up an administrator account which - will enable to you access the protect parts of the app. Only one - administrator account can be created. -

- - - )} +

+ To use Fresco, you need to set up an administrator account which will + enable to you access the protect parts of the app. Only one + administrator account can be created. +

+
); } diff --git a/app/(onboard)/setup/page.tsx b/app/(onboard)/setup/page.tsx index 6646a08e..54c1bf78 100644 --- a/app/(onboard)/setup/page.tsx +++ b/app/(onboard)/setup/page.tsx @@ -52,13 +52,13 @@ function Page() { parseAsInteger.withDefault(1), ); - const { data: expired } = api.appSettings.get.expired.useQuery(undefined, { + const { data } = api.appSettings.get.useQuery(undefined, { refetchInterval: 1000 * 10, }); useEffect(() => { - if (expired) { - clientRevalidateTag('appExpired') + if (data?.expired) { + clientRevalidateTag('appSettings.get') .then(() => router.refresh()) // eslint-disable-next-line no-console .catch((e) => console.error(e)); @@ -72,15 +72,7 @@ function Page() { setCurrentStep(1).catch(() => {}); return; } - }, [ - isLoading, - expired, - router, - pathname, - session, - currentStep, - setCurrentStep, - ]); + }, [isLoading, data, router, pathname, session, currentStep, setCurrentStep]); const cardClasses = cn(userFormClasses, 'flex-row bg-transparent p-0 gap-6'); const mainClasses = cn('bg-white flex w-full p-12 rounded-xl'); diff --git a/app/_actions.ts b/app/_actions.ts index ab58b08f..0a894916 100644 --- a/app/_actions.ts +++ b/app/_actions.ts @@ -1,14 +1,9 @@ 'use server'; -import { revalidateTag } from 'next/cache'; import { redirect } from 'next/navigation'; import { api } from '~/trpc/server'; export const resetAppSettings = async () => { await api.appSettings.reset.mutate(); - - revalidateTag('appConfigured'); - revalidateTag('appExpired'); - redirect('/'); }; diff --git a/app/layout.tsx b/app/layout.tsx index 7327c06d..a7d2d93a 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -5,7 +5,7 @@ import RedirectWrapper from '~/components/RedirectWrapper'; import { getServerSession } from '~/utils/auth'; import { api } from '~/trpc/server'; import { Toaster } from '~/components/ui/toaster'; -import { unstable_cache } from 'next/cache'; +import { revalidateTag } from 'next/cache'; export const metadata = { title: 'Network Canvas Fresco', @@ -17,28 +17,20 @@ export const dynamic = 'force-dynamic'; async function RootLayout({ children }: { children: React.ReactNode }) { const session = await getServerSession(); - const { configured, expired } = await unstable_cache( - async () => { - const result = await api.appSettings.get.allappSettings.query(); + const appSettings = await api.appSettings.get.query(); - return { - configured: result.configured, - expired: result.expired, - }; - }, - ['appConfigured', 'appExpired'], - { - tags: ['appConfigured', 'appExpired'], - revalidate: false, - }, - )(); + // If this is the first run, app settings must be created + if (!appSettings) { + await api.appSettings.create.mutate(); + return; + } return ( {children} diff --git a/components/AnonymousRecruitmentSwitch/AnonymousRecruitmentSwitch.tsx b/components/AnonymousRecruitmentSwitch/AnonymousRecruitmentSwitch.tsx index f8732158..dd1d5d54 100644 --- a/components/AnonymousRecruitmentSwitch/AnonymousRecruitmentSwitch.tsx +++ b/components/AnonymousRecruitmentSwitch/AnonymousRecruitmentSwitch.tsx @@ -1,19 +1,15 @@ import { api } from '~/trpc/server'; import Switch from './Switch'; -import { unstable_cache } from 'next/cache'; import 'server-only'; const AnonymousRecruitmentSwitch = async () => { - const allowAnonymousRecruitment = await unstable_cache( - async () => await api.appSettings.get.allowAnonymousRecruitment.query(), - ['anonymousRecruitment'], - { - tags: ['anonymousRecruitment'], - revalidate: false, - }, - )(); + const appSettings = await api.appSettings.get.query(); - return ; + return ( + + ); }; export default AnonymousRecruitmentSwitch; diff --git a/components/AnonymousRecruitmentSwitch/action.ts b/components/AnonymousRecruitmentSwitch/action.ts index 22ea935e..9a175deb 100644 --- a/components/AnonymousRecruitmentSwitch/action.ts +++ b/components/AnonymousRecruitmentSwitch/action.ts @@ -1,27 +1,7 @@ 'use server'; -import { revalidateTag } from 'next/cache'; -import { getAppSettings } from '~/server/routers/appSettings'; -import { prisma } from '~/utils/db'; +import { api } from '~/trpc/server'; export async function setAnonymousRecruitment(state: boolean) { - const { configured, initializedAt } = await getAppSettings(); - - // eslint-disable-next-line local-rules/require-data-mapper - await prisma.appSettings.update({ - where: { - configured_initializedAt: { - configured, - initializedAt, - }, - }, - data: { - allowAnonymousRecruitment: state, - }, - }); - - // Currently, this is not working with tRPC, for unknown reasons. - // const result = await api.appSettings.updateAnonymousRecruitment.mutate(state); - - revalidateTag('anonymousRecruitment'); + await api.appSettings.updateAnonymousRecruitment.mutate(state); } diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 77d7d462..5ab52397 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -92,10 +92,9 @@ model Key { } model AppSettings { - configured Boolean @default(false) - initializedAt DateTime @default(now()) - configuredAt DateTime? - allowAnonymousRecruitment Boolean @default(false) + configured Boolean @default(false) + initializedAt DateTime @default(now()) + allowAnonymousRecruitment Boolean @default(false) @@id([configured, initializedAt]) } diff --git a/server/routers/appSettings.ts b/server/routers/appSettings.ts index e65972f3..ad1cbc71 100644 --- a/server/routers/appSettings.ts +++ b/server/routers/appSettings.ts @@ -9,21 +9,16 @@ import { import { UNCONFIGURED_TIMEOUT } from '~/fresco.config'; import { z } from 'zod'; import { signOutProc } from './session'; -import { revalidatePath, revalidateTag } from 'next/cache'; +import { revalidateTag } from 'next/cache'; const calculateIsExpired = (configured: boolean, initializedAt: Date) => !configured && initializedAt.getTime() < Date.now() - UNCONFIGURED_TIMEOUT; export const getAppSettings = async () => { - let appSettings = await prisma.appSettings.findFirst(); - // if no setup appSettings exists, seed it + const appSettings = await prisma.appSettings.findFirst(); + if (!appSettings) { - appSettings = await prisma.appSettings.create({ - data: { - configured: false, - initializedAt: new Date(), - }, - }); + return null; } return { @@ -35,52 +30,30 @@ export const getAppSettings = async () => { }; }; -const getPropertiesRouter = router({ - allappSettings: publicProcedure.query(getAppSettings), - adminUserExists: publicProcedure.query(async () => { - const user = await prisma.user.count(); - return user > 0; - }), - expired: publicProcedure.query(async () => { - const { expired } = await getAppSettings(); - - return expired; - }), - configured: publicProcedure.query(async () => { - const { configured } = await getAppSettings(); - - return configured; - }), - initializedAt: publicProcedure.query(async () => { - const { initializedAt } = await getAppSettings(); - - return initializedAt; - }), - allowAnonymousRecruitment: publicProcedure.query(async () => { - const { allowAnonymousRecruitment } = await getAppSettings(); +export const appSettingsRouter = router({ + get: publicProcedure.query(getAppSettings), + create: publicProcedure.mutation(async () => { + const appSettings = await prisma.appSettings.create({ + data: { + initializedAt: new Date(), + }, + }); - return allowAnonymousRecruitment; + revalidateTag('appSettings.get'); + return appSettings; }), -}); - -export const appSettingsRouter = router({ - get: getPropertiesRouter, updateAnonymousRecruitment: protectedProcedure .input(z.boolean()) .mutation(async ({ input }) => { - const { configured, initializedAt } = await getAppSettings(); try { - const updatedappSettings = await prisma.appSettings.update({ - where: { - configured_initializedAt: { - configured, - initializedAt, - }, - }, + const updatedappSettings = await prisma.appSettings.updateMany({ data: { allowAnonymousRecruitment: input, }, }); + + revalidateTag('appSettings.get'); + return { error: null, appSettings: updatedappSettings }; } catch (error) { return { error: 'Failed to update appSettings', appSettings: null }; @@ -103,27 +76,19 @@ export const appSettingsRouter = router({ await prisma.user.deleteMany(); // Deleting a user will cascade to Session and Key await prisma.participant.deleteMany(); await prisma.protocol.deleteMany(); // Deleting protocol will cascade to Interviews + await prisma.appSettings.deleteMany(); - revalidateTag('appConfigured'); - revalidateTag('appExpired'); - revalidatePath('/'); + revalidateTag('appSettings.get'); // Todo: we need to remove assets from uploadthing before deleting the reference record. }), setConfigured: publicProcedure.mutation(async () => { - const { configured, initializedAt } = await getAppSettings(); - - await prisma.appSettings.update({ - where: { - configured_initializedAt: { - configured, - initializedAt, - }, - }, + await prisma.appSettings.updateMany({ data: { configured: true, - configuredAt: new Date(), }, }); + + revalidateTag('appSettings.get'); }), }); diff --git a/trpc/server.ts b/trpc/server.ts index 42ab543c..0350f5d8 100644 --- a/trpc/server.ts +++ b/trpc/server.ts @@ -1,89 +1,102 @@ 'use server'; import { createTRPCProxyClient, loggerLink } from '@trpc/client'; +import { experimental_createTRPCNextAppDirServer } from '@trpc/next/app-dir/server'; import { experimental_nextHttpLink } from '@trpc/next/app-dir/links/nextHttp'; +import { experimental_nextCacheLink } from '@trpc/next/app-dir/links/nextCache'; import { headers } from 'next/headers'; import SuperJSON from 'superjson'; import { env } from '~/env.mjs'; -import { type AppRouter } from '~/server/router'; +import { appRouter, type AppRouter } from '~/server/router'; import { getUrl } from '~/trpc/shared'; import 'server-only'; +import { getServerSession } from '~/utils/auth'; /** * This client invokes procedures directly on the server without fetching over HTTP. */ -// export const api = experimental_createTRPCNextAppDirServer({ -// config() { -// return { -// transformer: SuperJSON, -// links: [ -// loggerLink({ -// enabled: (opts) => -// (env.NODE_ENV === 'development' && typeof window !== 'undefined') || -// (opts.direction === 'down' && opts.result instanceof Error), -// }), -// // This link doesn't allow revalidate: 0, which is needed to disable caching -// // entirely. It is also not considered production ready: https://nextjs.org/docs/app/building-your-application/caching#unstable_cache -// // experimental_nextCacheLink({ -// // revalidate: 1, -// // router: appRouter, -// // createContext: async () => ({ -// // session: await getPageSession(), -// // headers: { -// // 'cookie': cookies().toString(), -// // 'x-trpc-source': 'rsc-invoke', -// // }, -// // }), -// // }), -// experimental_nextHttpLink({ -// batch: true, -// headers() { -// const heads = new Map(headers()); -// heads.set('x-trpc-source', 'rsc-invoke'); +export const api = experimental_createTRPCNextAppDirServer({ + config() { + return { + transformer: SuperJSON, + links: [ + loggerLink({ + enabled: (opts) => + (env.NODE_ENV === 'development' && typeof window !== 'undefined') || + (opts.direction === 'down' && opts.result instanceof Error), + }), + // This link doesn't allow revalidate: 0, which is needed to disable caching + // entirely. It is also not considered production ready: https://nextjs.org/docs/app/building-your-application/caching#unstable_cache + experimental_nextCacheLink({ + revalidate: false, + router: appRouter, + createContext: async () => { + const getHeaders = () => { + const heads = new Map(headers()); + heads.set('x-trpc-source', 'rsc-invoke'); -// // Bug with next fetch and tRPC: https://discord.com/channels/867764511159091230/1156105147315933235/1156767718956072992 -// heads.delete('content-length'); -// heads.delete('content-type'); + // Bug with next fetch and tRPC: https://discord.com/channels/867764511159091230/1156105147315933235/1156767718956072992 + heads.delete('content-length'); + heads.delete('content-type'); -// return Object.fromEntries(heads); -// }, -// url: getUrl(), -// }), -// ], -// }; -// }, -// }); + return Object.fromEntries(heads) as unknown as Headers; + }; -// This is the server client used in create-t3-app -export const api = createTRPCProxyClient({ - transformer: SuperJSON, - links: [ - loggerLink({ - enabled: (op) => - env.NODE_ENV === 'development' || - (op.direction === 'down' && op.result instanceof Error), - }), - // unstable_httpBatchStreamLink({ - // url: getUrl(), - // headers() { - // const heads = new Map(headers()); - // heads.set('x-trpc-source', 'rsc'); - // return Object.fromEntries(heads); - // }, - // }), - experimental_nextHttpLink({ - batch: true, - headers() { - const heads = new Map(headers()); - heads.set('x-trpc-source', 'rsc-invoke'); + return { + session: await getServerSession(), + headers: getHeaders(), + }; + }, + }), + // experimental_nextHttpLink({ + // batch: true, + // headers() { + // const heads = new Map(headers()); + // heads.set('x-trpc-source', 'rsc-invoke'); - // Bug with next fetch and tRPC: https://discord.com/channels/867764511159091230/1156105147315933235/1156767718956072992 - heads.delete('content-length'); - heads.delete('content-type'); + // // Bug with next fetch and tRPC: https://discord.com/channels/867764511159091230/1156105147315933235/1156767718956072992 + // heads.delete('content-length'); + // heads.delete('content-type'); - return Object.fromEntries(heads); - }, - url: getUrl(), - }), - ], + // return Object.fromEntries(heads); + // }, + // url: getUrl(), + // }), + ], + }; + }, }); + +// This is the server client used in create-t3-app +// export const api = createTRPCProxyClient({ +// transformer: SuperJSON, +// links: [ +// loggerLink({ +// enabled: (op) => +// env.NODE_ENV === 'development' || +// (op.direction === 'down' && op.result instanceof Error), +// }), +// // unstable_httpBatchStreamLink({ +// // url: getUrl(), +// // headers() { +// // const heads = new Map(headers()); +// // heads.set('x-trpc-source', 'rsc'); +// // return Object.fromEntries(heads); +// // }, +// // }), +// experimental_nextHttpLink({ +// batch: true, +// headers() { +// const heads = new Map(headers()); +// heads.set('x-trpc-source', 'rsc-invoke'); + +// // Bug with next fetch and tRPC: https://discord.com/channels/867764511159091230/1156105147315933235/1156767718956072992 +// heads.delete('content-length'); +// heads.delete('content-type'); + +// return Object.fromEntries(heads); +// }, +// url: getUrl(), +// }), +// ], +// }); From 28df1da7140b38fbca1cc4d4a17e6fc12bbdeb58 Mon Sep 17 00:00:00 2001 From: Joshua Melville Date: Mon, 30 Oct 2023 13:48:31 +0200 Subject: [PATCH 05/14] remove manual use of revalidate: 0 --- app/(dashboard)/dashboard/participants/page.tsx | 6 +----- app/(dashboard)/dashboard/protocols/page.tsx | 6 +----- app/(interview)/interview/[interviewId]/page.tsx | 9 +-------- .../_components/OnboardSteps/Documentation.tsx | 2 +- app/_actions.ts | 5 +++++ trpc/server.ts | 10 ++++------ 6 files changed, 13 insertions(+), 25 deletions(-) diff --git a/app/(dashboard)/dashboard/participants/page.tsx b/app/(dashboard)/dashboard/participants/page.tsx index b2dbaf4d..699b13b6 100644 --- a/app/(dashboard)/dashboard/participants/page.tsx +++ b/app/(dashboard)/dashboard/participants/page.tsx @@ -4,11 +4,7 @@ import { api } from '~/trpc/server'; export const dynamic = 'force-dynamic'; const ParticipantPage = async () => { - const participants = await api.participant.get.all.query(undefined, { - context: { - revalidate: 0, - }, - }); + const participants = await api.participant.get.all.query(); return (

Participant management view

diff --git a/app/(dashboard)/dashboard/protocols/page.tsx b/app/(dashboard)/dashboard/protocols/page.tsx index b0f84f4d..a4bc8114 100644 --- a/app/(dashboard)/dashboard/protocols/page.tsx +++ b/app/(dashboard)/dashboard/protocols/page.tsx @@ -2,11 +2,7 @@ import { ProtocolsTable } from '~/app/(dashboard)/dashboard/_components/Protocol import { api } from '~/trpc/server'; const ProtocolsPage = async () => { - const protocols = await api.protocol.get.all.query(undefined, { - context: { - revalidate: 0, - }, - }); + const protocols = await api.protocol.get.all.query(); return (

Protocols management view

diff --git a/app/(interview)/interview/[interviewId]/page.tsx b/app/(interview)/interview/[interviewId]/page.tsx index 5a3eb63e..30af83a9 100644 --- a/app/(interview)/interview/[interviewId]/page.tsx +++ b/app/(interview)/interview/[interviewId]/page.tsx @@ -16,14 +16,7 @@ export default async function Page({ return 'No interview id found'; } - const interview = await api.interview.get.byId.query( - { id: interviewId }, - { - context: { - revalidate: 0, - }, - }, - ); + const interview = await api.interview.get.byId.query({ id: interviewId }); if (!interview) { return 'No interview found'; diff --git a/app/(onboard)/_components/OnboardSteps/Documentation.tsx b/app/(onboard)/_components/OnboardSteps/Documentation.tsx index c56677e8..f4f03e2b 100644 --- a/app/(onboard)/_components/OnboardSteps/Documentation.tsx +++ b/app/(onboard)/_components/OnboardSteps/Documentation.tsx @@ -17,7 +17,7 @@ function Documentation() { setLoading(true); }, onSuccess: () => { - clientRevalidateTag('appConfigured') + clientRevalidateTag('appSettings.get') .then(() => router.refresh()) // eslint-disable-next-line no-console .catch((e) => console.error(e)); diff --git a/app/_actions.ts b/app/_actions.ts index 0a894916..a5c5e0ef 100644 --- a/app/_actions.ts +++ b/app/_actions.ts @@ -7,3 +7,8 @@ export const resetAppSettings = async () => { await api.appSettings.reset.mutate(); redirect('/'); }; + +export const setAppConfigured = async () => { + await api.appSettings.setConfigured.mutate(); + redirect('/'); +}; diff --git a/trpc/server.ts b/trpc/server.ts index 0350f5d8..65216410 100644 --- a/trpc/server.ts +++ b/trpc/server.ts @@ -1,16 +1,14 @@ 'use server'; -import { createTRPCProxyClient, loggerLink } from '@trpc/client'; +import { loggerLink } from '@trpc/client'; import { experimental_createTRPCNextAppDirServer } from '@trpc/next/app-dir/server'; -import { experimental_nextHttpLink } from '@trpc/next/app-dir/links/nextHttp'; import { experimental_nextCacheLink } from '@trpc/next/app-dir/links/nextCache'; import { headers } from 'next/headers'; import SuperJSON from 'superjson'; import { env } from '~/env.mjs'; import { appRouter, type AppRouter } from '~/server/router'; -import { getUrl } from '~/trpc/shared'; -import 'server-only'; import { getServerSession } from '~/utils/auth'; +import 'server-only'; /** * This client invokes procedures directly on the server without fetching over HTTP. @@ -25,8 +23,7 @@ export const api = experimental_createTRPCNextAppDirServer({ (env.NODE_ENV === 'development' && typeof window !== 'undefined') || (opts.direction === 'down' && opts.result instanceof Error), }), - // This link doesn't allow revalidate: 0, which is needed to disable caching - // entirely. It is also not considered production ready: https://nextjs.org/docs/app/building-your-application/caching#unstable_cache + // This link uses the unstable next cache directly: https://nextjs.org/docs/app/building-your-application/caching#unstable_cache experimental_nextCacheLink({ revalidate: false, router: appRouter, @@ -49,6 +46,7 @@ export const api = experimental_createTRPCNextAppDirServer({ }, }), // experimental_nextHttpLink({ + // revalidate: false, // batch: true, // headers() { // const heads = new Map(headers()); From b46cafb0703430280839921f9fc56f2813bc71f1 Mon Sep 17 00:00:00 2001 From: Joshua Melville Date: Mon, 30 Oct 2023 14:32:22 +0200 Subject: [PATCH 06/14] begin to implement better revalidation of server side tRPC queries --- .../_components/ParticipantModal.tsx | 6 +--- .../OnboardSteps/Documentation.tsx | 29 ++++--------------- app/(onboard)/_components/SignInForm.tsx | 5 ++-- app/_actions.ts | 2 +- app/layout.tsx | 3 +- components/RedirectWrapper.tsx | 4 ++- server/routers/session.ts | 5 ++++ utils/calculateRedirectedRoutes.ts | 13 ++++++++- 8 files changed, 32 insertions(+), 35 deletions(-) diff --git a/app/(dashboard)/dashboard/participants/_components/ParticipantModal.tsx b/app/(dashboard)/dashboard/participants/_components/ParticipantModal.tsx index 04c8b546..52b17050 100644 --- a/app/(dashboard)/dashboard/participants/_components/ParticipantModal.tsx +++ b/app/(dashboard)/dashboard/participants/_components/ParticipantModal.tsx @@ -75,9 +75,6 @@ function ParticipantModal({ onMutate() { setIsLoading(true); }, - async onSuccess() { - await utils.participant.get.invalidate(); - }, onError(error) { setError(error.message); }, @@ -112,9 +109,8 @@ function ParticipantModal({ await createParticipant([data.identifier]); } - await utils.participant.get.invalidate(); - if (!error) { + await utils.participant.get.invalidate(); setOpen(false); reset(); } diff --git a/app/(onboard)/_components/OnboardSteps/Documentation.tsx b/app/(onboard)/_components/OnboardSteps/Documentation.tsx index f4f03e2b..bea9c65e 100644 --- a/app/(onboard)/_components/OnboardSteps/Documentation.tsx +++ b/app/(onboard)/_components/OnboardSteps/Documentation.tsx @@ -2,30 +2,13 @@ import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card'; import { FileText, Loader2, MonitorPlay } from 'lucide-react'; -import { api } from '~/trpc/client'; -import { useState } from 'react'; import { FancyButton } from '~/components/ui/FancyButton'; -import { clientRevalidateTag } from '~/utils/clientRevalidate'; import { useRouter } from 'next/navigation'; +import { experimental_useFormStatus as useFormStatus } from 'react-dom'; +import { setAppConfigured } from '~/app/_actions'; function Documentation() { - const [loading, setLoading] = useState(false); - const router = useRouter(); - - const { mutate: setConfigured } = api.appSettings.setConfigured.useMutation({ - onMutate: () => { - setLoading(true); - }, - onSuccess: () => { - clientRevalidateTag('appSettings.get') - .then(() => router.refresh()) - // eslint-disable-next-line no-console - .catch((e) => console.error(e)); - }, - onError: () => { - setLoading(false); - }, - }); + const { pending: loading } = useFormStatus(); if (loading) { return ( @@ -78,9 +61,9 @@ function Documentation() {
- setConfigured()}> - Go to the dashboard! - +
+ Go to the dashboard! +
); diff --git a/app/(onboard)/_components/SignInForm.tsx b/app/(onboard)/_components/SignInForm.tsx index f5fcc783..f4295100 100644 --- a/app/(onboard)/_components/SignInForm.tsx +++ b/app/(onboard)/_components/SignInForm.tsx @@ -9,6 +9,7 @@ import { api } from '~/trpc/client'; import ActionError from '../../../components/ActionError'; import type { Route } from 'next'; import useZodForm from '~/hooks/useZodForm'; +import { useRouter } from 'next/navigation'; type ResponseError = { title: string; @@ -17,6 +18,7 @@ type ResponseError = { export default function SignInForm({ callbackUrl }: { callbackUrl?: Route }) { const [loading, setLoading] = useState(false); + const router = useRouter(); const [responseError, setResponseError] = useState( null, @@ -43,8 +45,7 @@ export default function SignInForm({ callbackUrl }: { callbackUrl?: Route }) { if (result.session) { if (callbackUrl) { - window.location.replace(callbackUrl); - // router.replace(callbackUrl); + router.push(callbackUrl); } } }, diff --git a/app/_actions.ts b/app/_actions.ts index a5c5e0ef..5618668d 100644 --- a/app/_actions.ts +++ b/app/_actions.ts @@ -10,5 +10,5 @@ export const resetAppSettings = async () => { export const setAppConfigured = async () => { await api.appSettings.setConfigured.mutate(); - redirect('/'); + redirect('/dashboard'); }; diff --git a/app/layout.tsx b/app/layout.tsx index a7d2d93a..02f58f04 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -15,8 +15,7 @@ export const metadata = { export const dynamic = 'force-dynamic'; async function RootLayout({ children }: { children: React.ReactNode }) { - const session = await getServerSession(); - + const session = await api.session.get.query(); const appSettings = await api.appSettings.get.query(); // If this is the first run, app settings must be created diff --git a/components/RedirectWrapper.tsx b/components/RedirectWrapper.tsx index ac26d811..a13ba533 100644 --- a/components/RedirectWrapper.tsx +++ b/components/RedirectWrapper.tsx @@ -2,7 +2,7 @@ import type { Session } from 'lucia'; import type { Route } from 'next'; -import { usePathname, redirect } from 'next/navigation'; +import { usePathname, redirect, useSearchParams } from 'next/navigation'; import { calculateRedirect } from '~/utils/calculateRedirectedRoutes'; /** @@ -29,10 +29,12 @@ export default function RedirectWrapper({ expired: boolean; }) { const path = usePathname() as Route; + const searchParams = useSearchParams(); const shouldRedirect = calculateRedirect({ session, path, + searchParams, expired, configured, }); diff --git a/server/routers/session.ts b/server/routers/session.ts index 3d8f0462..e2f16669 100644 --- a/server/routers/session.ts +++ b/server/routers/session.ts @@ -6,6 +6,7 @@ import { protectedProcedure, publicProcedure, router } from '../trpc'; import * as context from 'next/headers'; import type { inferAsyncReturnType } from '@trpc/server'; import type { createTRPCContext } from '../context'; +import { revalidateTag } from 'next/cache'; type Context = inferAsyncReturnType; @@ -23,6 +24,8 @@ export const signOutProc = async ({ ctx }: { ctx: Context }) => { authRequest.setSession(null); + revalidateTag('session.get'); + return { success: true, }; @@ -83,6 +86,8 @@ export const sessionRouter = router({ authRequest.setSession(session); + revalidateTag('session.get'); + return { error: null, session, diff --git a/utils/calculateRedirectedRoutes.ts b/utils/calculateRedirectedRoutes.ts index ce82c98b..8422ebda 100644 --- a/utils/calculateRedirectedRoutes.ts +++ b/utils/calculateRedirectedRoutes.ts @@ -1,6 +1,7 @@ /* eslint-disable no-console */ import type { Session } from 'lucia'; import type { Route } from 'next'; +import { ReadonlyURLSearchParams } from 'next/navigation'; import { cache } from 'react'; const routeIsLoginPage = (pathname: Route) => { @@ -26,11 +27,13 @@ const routeIsExpiredPage = (pathname: Route) => { export const calculateRedirect = ({ session, path, + searchParams, expired, configured, }: { session: Session | null; path: Route; + searchParams: ReadonlyURLSearchParams; expired: boolean; configured: boolean; }): undefined | Route => { @@ -85,10 +88,18 @@ export const calculateRedirect = ({ // Redirect authed users away from these pages and to the dashboard if (isLoginPage || isOnboarding || isLandingPage || isExpiredPage) { + if (isLoginPage) { + const callbackUrl = searchParams.get('callbackUrl') as Route; + + if (callbackUrl) { + return callbackUrl; + } + } + return '/dashboard'; } - // APP IS CONFIGURED AND SESSION EXISTS AND USER IS ON DASHBOARD + // APP IS CONFIGURED AND SESSION EXISTS AND USER IS WHERE THEY REQUESTED TO BE return; }; From 2ea5940173d751cca397d48eec2b5a33346b5959 Mon Sep 17 00:00:00 2001 From: Joshua Melville Date: Mon, 30 Oct 2023 14:50:05 +0200 Subject: [PATCH 07/14] update to next 14 --- .../OnboardSteps/Documentation.tsx | 3 +- .../AnonymousRecruitmentSwitch/Switch.tsx | 3 +- next.config.mjs | 1 - package.json | 8 +- pnpm-lock.yaml | 813 +++++++++--------- server/trpc.ts | 31 +- 6 files changed, 427 insertions(+), 432 deletions(-) diff --git a/app/(onboard)/_components/OnboardSteps/Documentation.tsx b/app/(onboard)/_components/OnboardSteps/Documentation.tsx index bea9c65e..0e4c2898 100644 --- a/app/(onboard)/_components/OnboardSteps/Documentation.tsx +++ b/app/(onboard)/_components/OnboardSteps/Documentation.tsx @@ -3,8 +3,7 @@ import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card'; import { FileText, Loader2, MonitorPlay } from 'lucide-react'; import { FancyButton } from '~/components/ui/FancyButton'; -import { useRouter } from 'next/navigation'; -import { experimental_useFormStatus as useFormStatus } from 'react-dom'; +import { useFormStatus } from 'react-dom'; import { setAppConfigured } from '~/app/_actions'; function Documentation() { diff --git a/components/AnonymousRecruitmentSwitch/Switch.tsx b/components/AnonymousRecruitmentSwitch/Switch.tsx index ac03c6dc..20c94e3d 100644 --- a/components/AnonymousRecruitmentSwitch/Switch.tsx +++ b/components/AnonymousRecruitmentSwitch/Switch.tsx @@ -1,9 +1,8 @@ -/* eslint-disable @typescript-eslint/no-misused-promises */ 'use client'; import { Switch as SwitchUI } from '~/components/ui/switch'; import { setAnonymousRecruitment } from './action'; -import { experimental_useOptimistic as useOptimistic } from 'react'; +import { useOptimistic } from 'react'; const Switch = ({ allowAnonymousRecruitment, diff --git a/next.config.mjs b/next.config.mjs index a4e2d338..5d811cf1 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -9,7 +9,6 @@ const config = { output: 'standalone', reactStrictMode: true, experimental: { - serverActions: true, typedRoutes: true, }, }; diff --git a/package.json b/package.json index ba02596d..6395bdb6 100644 --- a/package.json +++ b/package.json @@ -66,11 +66,11 @@ "jszip": "^3.10.1", "lucia": "^2.7.2", "lucide-react": "^0.286.0", - "next": "^13.5.6", + "next": "^14.0.0", "next-usequerystate": "^1.8.4", "papaparse": "^5.4.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", "react-dropzone": "^14.2.3", "react-hook-form": "^7.47.0", "sharp": "^0.32.6", @@ -99,7 +99,7 @@ "@types/jest": "^29.5.6", "@types/node": "^20.8.8", "@types/papaparse": "^5.3.10", - "@types/react": "^18.2.21", + "@types/react": "^18.2.33", "@types/react-dom": "^18.2.14", "@types/uuid": "^9.0.6", "@types/validator": "^13.11.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c49ba02..81ae97ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,43 +25,43 @@ dependencies: version: 5.4.2(prisma@5.4.2) '@radix-ui/react-alert-dialog': specifier: ^1.0.5 - version: 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-checkbox': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-collapsible': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-dialog': specifier: ^1.0.5 - version: 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-dropdown-menu': specifier: ^2.0.6 - version: 2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + version: 2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-label': specifier: ^2.0.2 - version: 2.0.2(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + version: 2.0.2(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-progress': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-select': specifier: ^2.0.0 - version: 2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + version: 2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-slot': specifier: ^1.0.2 - version: 1.0.2(@types/react@18.2.21)(react@18.2.0) + version: 1.0.2(@types/react@18.2.33)(react@18.2.0) '@radix-ui/react-switch': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-tabs': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-toast': specifier: ^1.1.5 - version: 1.1.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + version: 1.1.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-tooltip': specifier: ^1.0.7 - version: 1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@t3-oss/env-nextjs': specifier: ^0.7.1 version: 0.7.1(typescript@5.2.2)(zod@3.22.4) @@ -91,7 +91,7 @@ dependencies: version: 10.41.0(@trpc/server@10.41.0) '@trpc/next': specifier: ^10.41.0 - version: 10.41.0(@tanstack/react-query@4.36.1)(@trpc/client@10.41.0)(@trpc/react-query@10.41.0)(@trpc/server@10.41.0)(next@13.5.6)(react-dom@18.2.0)(react@18.2.0) + version: 10.41.0(@tanstack/react-query@4.36.1)(@trpc/client@10.41.0)(@trpc/react-query@10.41.0)(@trpc/server@10.41.0)(next@14.0.0)(react-dom@18.2.0)(react@18.2.0) '@trpc/react-query': specifier: ^10.41.0 version: 10.41.0(@tanstack/react-query@4.36.1)(@trpc/client@10.41.0)(@trpc/server@10.41.0)(react-dom@18.2.0)(react@18.2.0) @@ -100,7 +100,7 @@ dependencies: version: 10.41.0 '@uploadthing/react': specifier: ^5.7.0 - version: 5.7.0(next@13.5.6)(react@18.2.0)(uploadthing@5.7.2)(zod@3.22.4) + version: 5.7.0(next@14.0.0)(react@18.2.0)(uploadthing@5.7.2)(zod@3.22.4) bcrypt: specifier: ^5.1.1 version: 5.1.1 @@ -135,19 +135,19 @@ dependencies: specifier: ^0.286.0 version: 0.286.0(react@18.2.0) next: - specifier: ^13.5.6 - version: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4) + specifier: ^14.0.0 + version: 14.0.0(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4) next-usequerystate: specifier: ^1.8.4 - version: 1.8.4(next@13.5.6) + version: 1.8.4(next@14.0.0) papaparse: specifier: ^5.4.1 version: 5.4.1 react: - specifier: ^18.2.0 + specifier: 18.2.0 version: 18.2.0 react-dom: - specifier: ^18.2.0 + specifier: 18.2.0 version: 18.2.0(react@18.2.0) react-dropzone: specifier: ^14.2.3 @@ -189,19 +189,19 @@ devDependencies: version: 8.2.0 '@storybook/addon-essentials': specifier: ^7.5.1 - version: 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + version: 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-interactions': specifier: ^7.5.1 - version: 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + version: 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-links': specifier: ^7.5.1 version: 7.5.1(react-dom@18.2.0)(react@18.2.0) '@storybook/blocks': specifier: ^7.5.1 - version: 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + version: 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/nextjs': specifier: ^7.5.1 - version: 7.5.1(@swc/core@1.3.94)(@types/react-dom@18.2.14)(@types/react@18.2.21)(esbuild@0.18.20)(next@13.5.6)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4)(typescript@5.2.2)(webpack@5.89.0) + version: 7.5.1(@swc/core@1.3.94)(@types/react-dom@18.2.14)(@types/react@18.2.33)(esbuild@0.18.20)(next@14.0.0)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4)(typescript@5.2.2)(webpack@5.89.0) '@storybook/react': specifier: ^7.5.1 version: 7.5.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) @@ -230,8 +230,8 @@ devDependencies: specifier: ^5.3.10 version: 5.3.10 '@types/react': - specifier: ^18.2.21 - version: 18.2.21 + specifier: ^18.2.33 + version: 18.2.33 '@types/react-dom': specifier: ^18.2.14 version: 18.2.14 @@ -2379,8 +2379,8 @@ packages: tar-fs: 2.1.1 dev: true - /@next/env@13.5.6: - resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} + /@next/env@14.0.0: + resolution: {integrity: sha512-cIKhxkfVELB6hFjYsbtEeTus2mwrTC+JissfZYM0n+8Fv+g8ucUfOlm3VEDtwtwydZ0Nuauv3bl0qF82nnCAqA==} /@next/eslint-plugin-next@13.5.6: resolution: {integrity: sha512-ng7pU/DDsxPgT6ZPvuprxrkeew3XaRf4LAT4FabaEO/hAbvVx4P7wqnqdbTdDn1kgTvsI4tpIgT4Awn/m0bGbg==} @@ -2388,72 +2388,72 @@ packages: glob: 7.1.7 dev: true - /@next/swc-darwin-arm64@13.5.6: - resolution: {integrity: sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA==} + /@next/swc-darwin-arm64@14.0.0: + resolution: {integrity: sha512-HQKi159jCz4SRsPesVCiNN6tPSAFUkOuSkpJsqYTIlbHLKr1mD6be/J0TvWV6fwJekj81bZV9V/Tgx3C2HO9lA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@next/swc-darwin-x64@13.5.6: - resolution: {integrity: sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==} + /@next/swc-darwin-x64@14.0.0: + resolution: {integrity: sha512-4YyQLMSaCgX/kgC1jjF3s3xSoBnwHuDhnF6WA1DWNEYRsbOOPWjcYhv8TKhRe2ApdOam+VfQSffC4ZD+X4u1Cg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@next/swc-linux-arm64-gnu@13.5.6: - resolution: {integrity: sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==} + /@next/swc-linux-arm64-gnu@14.0.0: + resolution: {integrity: sha512-io7fMkJ28Glj7SH8yvnlD6naIhRDnDxeE55CmpQkj3+uaA2Hko6WGY2pT5SzpQLTnGGnviK85cy8EJ2qsETj/g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@next/swc-linux-arm64-musl@13.5.6: - resolution: {integrity: sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==} + /@next/swc-linux-arm64-musl@14.0.0: + resolution: {integrity: sha512-nC2h0l1Jt8LEzyQeSs/BKpXAMe0mnHIMykYALWaeddTqCv5UEN8nGO3BG8JAqW/Y8iutqJsaMe2A9itS0d/r8w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@next/swc-linux-x64-gnu@13.5.6: - resolution: {integrity: sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==} + /@next/swc-linux-x64-gnu@14.0.0: + resolution: {integrity: sha512-Wf+WjXibJQ7hHXOdNOmSMW5bxeJHVf46Pwb3eLSD2L76NrytQlif9NH7JpHuFlYKCQGfKfgSYYre5rIfmnSwQw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@next/swc-linux-x64-musl@13.5.6: - resolution: {integrity: sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==} + /@next/swc-linux-x64-musl@14.0.0: + resolution: {integrity: sha512-WTZb2G7B+CTsdigcJVkRxfcAIQj7Lf0ipPNRJ3vlSadU8f0CFGv/ST+sJwF5eSwIe6dxKoX0DG6OljDBaad+rg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@next/swc-win32-arm64-msvc@13.5.6: - resolution: {integrity: sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==} + /@next/swc-win32-arm64-msvc@14.0.0: + resolution: {integrity: sha512-7R8/x6oQODmNpnWVW00rlWX90sIlwluJwcvMT6GXNIBOvEf01t3fBg0AGURNKdTJg2xNuP7TyLchCL7Lh2DTiw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@next/swc-win32-ia32-msvc@13.5.6: - resolution: {integrity: sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==} + /@next/swc-win32-ia32-msvc@14.0.0: + resolution: {integrity: sha512-RLK1nELvhCnxaWPF07jGU4x3tjbyx2319q43loZELqF0+iJtKutZ+Lk8SVmf/KiJkYBc7Cragadz7hb3uQvz4g==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@next/swc-win32-x64-msvc@13.5.6: - resolution: {integrity: sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==} + /@next/swc-win32-x64-msvc@14.0.0: + resolution: {integrity: sha512-g6hLf1SUko+hnnaywQQZzzb3BRecQsoKkF3o/C+F+dOA4w/noVAJngUVkfwF0+2/8FzNznM7ofM6TGZO9svn7w==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2568,7 +2568,7 @@ packages: dependencies: '@babel/runtime': 7.23.2 - /@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==} peerDependencies: '@types/react': '*' @@ -2583,18 +2583,18 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} peerDependencies: '@types/react': '*' @@ -2608,13 +2608,13 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==} peerDependencies: '@types/react': '*' @@ -2629,20 +2629,20 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} peerDependencies: '@types/react': '*' @@ -2657,20 +2657,20 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} peerDependencies: '@types/react': '*' @@ -2684,16 +2684,16 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.21)(react@18.2.0): + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: '@types/react': '*' @@ -2703,10 +2703,10 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.21 + '@types/react': 18.2.33 react: 18.2.0 - /@radix-ui/react-context@1.0.1(@types/react@18.2.21)(react@18.2.0): + /@radix-ui/react-context@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: '@types/react': '*' @@ -2716,10 +2716,10 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.21 + '@types/react': 18.2.33 react: 18.2.0 - /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} peerDependencies: '@types/react': '*' @@ -2734,26 +2734,26 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.33)(react@18.2.0) dev: false - /@radix-ui/react-direction@1.0.1(@types/react@18.2.21)(react@18.2.0): + /@radix-ui/react-direction@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} peerDependencies: '@types/react': '*' @@ -2763,10 +2763,10 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.21 + '@types/react': 18.2.33 react: 18.2.0 - /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} peerDependencies: '@types/react': '*' @@ -2781,17 +2781,17 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} peerDependencies: '@types/react': '*' @@ -2806,17 +2806,17 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} peerDependencies: '@types/react': '*' @@ -2831,19 +2831,19 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.21)(react@18.2.0): + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: '@types/react': '*' @@ -2853,10 +2853,10 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.21 + '@types/react': 18.2.33 react: 18.2.0 - /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} peerDependencies: '@types/react': '*' @@ -2870,16 +2870,16 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} peerDependencies: '@types/react': '*' @@ -2893,16 +2893,16 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-id@1.0.1(@types/react@18.2.21)(react@18.2.0): + /@radix-ui/react-id@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: '@types/react': '*' @@ -2912,11 +2912,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 react: 18.2.0 - /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} peerDependencies: '@types/react': '*' @@ -2930,14 +2930,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==} peerDependencies: '@types/react': '*' @@ -2952,30 +2952,30 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.33)(react@18.2.0) dev: false - /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} peerDependencies: '@types/react': '*' @@ -2990,22 +2990,22 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.33)(react@18.2.0) '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.21 + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} peerDependencies: '@types/react': '*' @@ -3020,22 +3020,22 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.33)(react@18.2.0) '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.21 + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} peerDependencies: '@types/react': '*' @@ -3049,14 +3049,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} peerDependencies: '@types/react': '*' @@ -3070,14 +3070,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: '@types/react': '*' @@ -3091,15 +3091,15 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: '@types/react': '*' @@ -3113,13 +3113,13 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /@radix-ui/react-progress@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-progress@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-5G6Om/tYSxjSeEdrb1VfKkfZfn/1IlPWd731h2RfPuSbIfNUgfqAwbKfJCg/PP6nuUCTrYzalwHSpSinoWoCag==} peerDependencies: '@types/react': '*' @@ -3133,15 +3133,15 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} peerDependencies: '@types/react': '*' @@ -3156,20 +3156,20 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /@radix-ui/react-select@1.2.2(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-select@1.2.2(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==} peerDependencies: '@types/react': '*' @@ -3185,32 +3185,32 @@ packages: '@babel/runtime': 7.23.2 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.33)(react@18.2.0) dev: true - /@radix-ui/react-select@2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-select@2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==} peerDependencies: '@types/react': '*' @@ -3226,32 +3226,32 @@ packages: '@babel/runtime': 7.23.2 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 aria-hidden: 1.2.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.33)(react@18.2.0) dev: false - /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} peerDependencies: '@types/react': '*' @@ -3265,14 +3265,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@radix-ui/react-slot@1.0.2(@types/react@18.2.21)(react@18.2.0): + /@radix-ui/react-slot@1.0.2(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: '@types/react': '*' @@ -3282,11 +3282,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 react: 18.2.0 - /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-switch@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==} peerDependencies: '@types/react': '*' @@ -3301,19 +3301,19 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==} peerDependencies: '@types/react': '*' @@ -3328,20 +3328,20 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-toast@1.1.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-toast@1.1.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-fRLn227WHIBRSzuRzGJ8W+5YALxofH23y0MlPLddaIpLpCDqdE0NZlS2NRQDRiptfxDeeCjgFIpexB1/zkxDlw==} peerDependencies: '@types/react': '*' @@ -3356,24 +3356,24 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==} peerDependencies: '@types/react': '*' @@ -3388,19 +3388,19 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==} peerDependencies: '@types/react': '*' @@ -3415,15 +3415,15 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@radix-ui/react-toolbar@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-toolbar@1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q==} peerDependencies: '@types/react': '*' @@ -3438,19 +3438,19 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-separator': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-separator': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==} peerDependencies: '@types/react': '*' @@ -3465,24 +3465,24 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.21)(react@18.2.0): + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: '@types/react': '*' @@ -3492,10 +3492,10 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.21 + '@types/react': 18.2.33 react: 18.2.0 - /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.21)(react@18.2.0): + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} peerDependencies: '@types/react': '*' @@ -3505,11 +3505,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 react: 18.2.0 - /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.21)(react@18.2.0): + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} peerDependencies: '@types/react': '*' @@ -3519,11 +3519,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 react: 18.2.0 - /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.21)(react@18.2.0): + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} peerDependencies: '@types/react': '*' @@ -3533,10 +3533,10 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.21 + '@types/react': 18.2.33 react: 18.2.0 - /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.21)(react@18.2.0): + /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} peerDependencies: '@types/react': '*' @@ -3546,10 +3546,10 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@types/react': 18.2.21 + '@types/react': 18.2.33 react: 18.2.0 - /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.21)(react@18.2.0): + /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} peerDependencies: '@types/react': '*' @@ -3560,10 +3560,10 @@ packages: dependencies: '@babel/runtime': 7.23.2 '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.21 + '@types/react': 18.2.33 react: 18.2.0 - /@radix-ui/react-use-size@1.0.1(@types/react@18.2.21)(react@18.2.0): + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} peerDependencies: '@types/react': '*' @@ -3573,11 +3573,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.33)(react@18.2.0) + '@types/react': 18.2.33 react: 18.2.0 - /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} peerDependencies: '@types/react': '*' @@ -3591,8 +3591,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.2 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.21 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.33 '@types/react-dom': 18.2.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -3622,7 +3622,7 @@ packages: '@sinonjs/commons': 3.0.0 dev: true - /@storybook/addon-actions@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-actions@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-GieD3ru6EslKvwol1cE4lvszQCLB/AkQdnLofnqy1nnYso+hRxmPAw9/O+pWfpUBFdjXsQ7GX09+wEUpOJzepw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3634,7 +3634,7 @@ packages: optional: true dependencies: '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/core-events': 7.5.1 '@storybook/global': 5.0.0 '@storybook/manager-api': 7.5.1(react-dom@18.2.0)(react@18.2.0) @@ -3656,7 +3656,7 @@ packages: - '@types/react-dom' dev: true - /@storybook/addon-backgrounds@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-backgrounds@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-XZoyJw/WoUlVvQHPTbSAZjKy2SEUjaSmAWgcRync25vp+q0obthjx6UnZHEUuH8Ud07HA3FYzlFtMicH5y/OIQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3668,7 +3668,7 @@ packages: optional: true dependencies: '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/core-events': 7.5.1 '@storybook/global': 5.0.0 '@storybook/manager-api': 7.5.1(react-dom@18.2.0)(react@18.2.0) @@ -3684,7 +3684,7 @@ packages: - '@types/react-dom' dev: true - /@storybook/addon-controls@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-controls@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Xag1e7TZo04LjUenfobkShpKMxTtwa4xM4bXQA8LjaAGZQ7jipbQ4PE73a17K59S2vqq89VAhkuMJWiyaOFqpw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3695,9 +3695,9 @@ packages: react-dom: optional: true dependencies: - '@storybook/blocks': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/blocks': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/core-common': 7.5.1 '@storybook/core-events': 7.5.1 '@storybook/manager-api': 7.5.1(react-dom@18.2.0)(react@18.2.0) @@ -3716,7 +3716,7 @@ packages: - supports-color dev: true - /@storybook/addon-docs@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-docs@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-+wE67oWIhGK9+kv2sxoY2KDXm3v62RfEgxiksdhtffTP/joOK3p88S0lO+8g0G4xfNGUnBhPtzGMuUxWwaH2Pw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3724,9 +3724,9 @@ packages: dependencies: '@jest/transform': 29.7.0 '@mdx-js/react': 2.3.0(react@18.2.0) - '@storybook/blocks': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/blocks': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/csf-plugin': 7.5.1 '@storybook/csf-tools': 7.5.1 '@storybook/global': 5.0.0 @@ -3750,21 +3750,21 @@ packages: - supports-color dev: true - /@storybook/addon-essentials@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-essentials@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-/jaUZXV+mE/2G5PgEpFKm4lFEHluWn6GFR/pg+hphvHOzBGA3Y75JMgUfJ5CDYHB1dAVSf9JrPOd8Eb1tpESfA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/addon-actions': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-backgrounds': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-controls': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-docs': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-actions': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-backgrounds': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-controls': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-docs': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-highlight': 7.5.1 - '@storybook/addon-measure': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-outline': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-toolbars': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-viewport': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-measure': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-outline': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-toolbars': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-viewport': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/core-common': 7.5.1 '@storybook/manager-api': 7.5.1(react-dom@18.2.0)(react@18.2.0) '@storybook/node-logger': 7.5.1 @@ -3787,7 +3787,7 @@ packages: '@storybook/preview-api': 7.5.1 dev: true - /@storybook/addon-interactions@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-interactions@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-m9yohFYil+UBwYKFxHYdsAsn8PBCPl6HY/FSgfrDc5PiqT1Ya7paXopimyy9ok+VQt/RC8sEWIm809ONEoxosw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3799,7 +3799,7 @@ packages: optional: true dependencies: '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/core-common': 7.5.1 '@storybook/core-events': 7.5.1 '@storybook/global': 5.0.0 @@ -3845,7 +3845,7 @@ packages: ts-dedent: 2.2.0 dev: true - /@storybook/addon-measure@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-measure@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-yR6oELJe0UHYxRijd1YMuGaQRlZ3uABjmrXaFCPnd6agahgTwIJLiK4XamtkVur//LaiJMvtmM2XXrkJ1BvNJw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3857,7 +3857,7 @@ packages: optional: true dependencies: '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/core-events': 7.5.1 '@storybook/global': 5.0.0 '@storybook/manager-api': 7.5.1(react-dom@18.2.0)(react@18.2.0) @@ -3871,7 +3871,7 @@ packages: - '@types/react-dom' dev: true - /@storybook/addon-outline@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-outline@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-IMi5Bo34/Q5YUG5uD8ZUTBwlpGrkDIV+PUgkyNIbmn9OgozoCH80Fs7YlGluRFODQISpHwio9qvSFRGdSNT56A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3883,7 +3883,7 @@ packages: optional: true dependencies: '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/core-events': 7.5.1 '@storybook/global': 5.0.0 '@storybook/manager-api': 7.5.1(react-dom@18.2.0)(react@18.2.0) @@ -3897,7 +3897,7 @@ packages: - '@types/react-dom' dev: true - /@storybook/addon-toolbars@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-toolbars@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-T88hEEQicV6eCovr5TN2nFgKt7wU0o7pAunP5cU01iiVRj63+oQiVIBB8Xtm4tN+/DsqtyP0BTa6rFwt2ULy8A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3909,7 +3909,7 @@ packages: optional: true dependencies: '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/manager-api': 7.5.1(react-dom@18.2.0)(react@18.2.0) '@storybook/preview-api': 7.5.1 '@storybook/theming': 7.5.1(react-dom@18.2.0)(react@18.2.0) @@ -3920,7 +3920,7 @@ packages: - '@types/react-dom' dev: true - /@storybook/addon-viewport@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@storybook/addon-viewport@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-L57lOGB3LfKgAdLinaZojRQ9W9w2RC0iP9bVaXwrRVeJdpNayfuW4Kh1C8dmacZroB4Zp2U/nEjkSmdcp6uUWg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3932,7 +3932,7 @@ packages: optional: true dependencies: '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/core-events': 7.5.1 '@storybook/global': 5.0.0 '@storybook/manager-api': 7.5.1(react-dom@18.2.0)(react@18.2.0) @@ -3947,7 +3947,7 @@ packages: - '@types/react-dom' dev: true - /@storybook/blocks@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@storybook/blocks@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-7b69p6kDdgmlejEMM2mW6/Lz4OmU/R3Qr+TpKnPcV5iS7ADxRQEQCTEMoQ5RyLJf0vDRh/7Ljn/RMo8Ux3X7JA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3955,7 +3955,7 @@ packages: dependencies: '@storybook/channels': 7.5.1 '@storybook/client-logger': 7.5.1 - '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/components': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/core-events': 7.5.1 '@storybook/csf': 0.1.1 '@storybook/docs-tools': 7.5.1 @@ -4153,14 +4153,14 @@ packages: - supports-color dev: true - /@storybook/components@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + /@storybook/components@7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-fdzzxGBV/Fj9pYwfYL3RZsVUHeBqlfLMBP/L6mPmjaZSwHFqkaRZZUajZc57lCtI+TOy2gY6WH3cPavEtqtgLw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@radix-ui/react-select': 1.2.2(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-toolbar': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-select': 1.2.2(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toolbar': 1.0.4(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/client-logger': 7.5.1 '@storybook/csf': 0.1.1 '@storybook/global': 5.0.0 @@ -4386,7 +4386,7 @@ packages: resolution: {integrity: sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==} dev: true - /@storybook/nextjs@7.5.1(@swc/core@1.3.94)(@types/react-dom@18.2.14)(@types/react@18.2.21)(esbuild@0.18.20)(next@13.5.6)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4)(typescript@5.2.2)(webpack@5.89.0): + /@storybook/nextjs@7.5.1(@swc/core@1.3.94)(@types/react-dom@18.2.14)(@types/react@18.2.33)(esbuild@0.18.20)(next@14.0.0)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4)(typescript@5.2.2)(webpack@5.89.0): resolution: {integrity: sha512-DezMv3UZYzqltzOgLw1TOQOct3IQ9zGffvfP3T/mRQxmW7UOYXDbAtmD/d3Ud6Fi59HuEnu4hEwyJNacZvuNqw==} engines: {node: '>=16.0.0'} peerDependencies: @@ -4419,7 +4419,7 @@ packages: '@babel/preset-react': 7.22.15(@babel/core@7.23.2) '@babel/preset-typescript': 7.23.2(@babel/core@7.23.2) '@babel/runtime': 7.23.2 - '@storybook/addon-actions': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-actions': 7.5.1(@types/react-dom@18.2.14)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0) '@storybook/builder-webpack5': 7.5.1(esbuild@0.18.20)(typescript@5.2.2) '@storybook/core-common': 7.5.1 '@storybook/core-events': 7.5.1 @@ -4433,7 +4433,7 @@ packages: fs-extra: 11.1.1 image-size: 1.0.2 loader-utils: 3.2.1 - next: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4) + next: 14.0.0(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4) node-polyfill-webpack-plugin: 2.0.1(webpack@5.89.0) pnp-webpack-plugin: 1.7.0(typescript@5.2.2) postcss: 8.4.31 @@ -4957,7 +4957,7 @@ packages: '@trpc/server': 10.41.0 dev: false - /@trpc/next@10.41.0(@tanstack/react-query@4.36.1)(@trpc/client@10.41.0)(@trpc/react-query@10.41.0)(@trpc/server@10.41.0)(next@13.5.6)(react-dom@18.2.0)(react@18.2.0): + /@trpc/next@10.41.0(@tanstack/react-query@4.36.1)(@trpc/client@10.41.0)(@trpc/react-query@10.41.0)(@trpc/server@10.41.0)(next@14.0.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-QwvZrvDjRFEzErmLZ4hMdYfX13nsH0SpijjuTNPIlSIyFISCIfDCqmBvWC07O6fCG/swh+XM19FhJN6RMqTlKQ==} peerDependencies: '@tanstack/react-query': ^4.18.0 @@ -4972,7 +4972,7 @@ packages: '@trpc/client': 10.41.0(@trpc/server@10.41.0) '@trpc/react-query': 10.41.0(@tanstack/react-query@4.36.1)(@trpc/client@10.41.0)(@trpc/server@10.41.0)(react-dom@18.2.0)(react@18.2.0) '@trpc/server': 10.41.0 - next: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4) + next: 14.0.0(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-ssr-prepass: 1.5.0(react@18.2.0) @@ -5253,13 +5253,6 @@ packages: dependencies: '@types/react': 18.2.33 - /@types/react@18.2.21: - resolution: {integrity: sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==} - dependencies: - '@types/prop-types': 15.7.9 - '@types/scheduler': 0.16.5 - csstype: 3.1.2 - /@types/react@18.2.33: resolution: {integrity: sha512-v+I7S+hu3PIBoVkKGpSYYpiBT1ijqEzWpzQD62/jm4K74hPpSP7FF9BnKG6+fg2+62weJYkkBWDJlZt5JO/9hg==} dependencies: @@ -5521,7 +5514,7 @@ packages: resolution: {integrity: sha512-UDySsPbdi7wp52WG7mp5CiZwaTvokDubqhm1xhFm73Bqhp0PsGbwSSF5PdCXH4fe8Y4EKGrMyWQ4i1fF9+DVVQ==} dev: false - /@uploadthing/react@5.7.0(next@13.5.6)(react@18.2.0)(uploadthing@5.7.2)(zod@3.22.4): + /@uploadthing/react@5.7.0(next@14.0.0)(react@18.2.0)(uploadthing@5.7.2)(zod@3.22.4): resolution: {integrity: sha512-rSBzoC2eMRM2d6Mpis6RXfo1Y5JsV7oJanTmaVdltFLRxbO/4lwK1kvHM4qwDUvn01UpxBtcVayimMBXNJ0V8Q==} peerDependencies: next: '*' @@ -5534,7 +5527,7 @@ packages: '@uploadthing/shared': 5.2.5(@uploadthing/mime-types@0.2.1)(zod@3.22.4) attr-accept: 2.2.2 file-selector: 0.6.0 - next: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4) + next: 14.0.0(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4) react: 18.2.0 tailwind-merge: 1.14.0 uploadthing: 5.7.2(zod@3.22.4) @@ -10361,18 +10354,18 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /next-usequerystate@1.8.4(next@13.5.6): + /next-usequerystate@1.8.4(next@14.0.0): resolution: {integrity: sha512-V4xMh87cu950Zy1Jpw/H8GwWxAeAmqnLNJ8hAl5bdEWpyZV4UIKdkJePKMCUy1+h254EXGmY83BuCGJOASJRVg==} peerDependencies: next: ^13.4 dependencies: mitt: 3.0.1 - next: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4) + next: 14.0.0(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4) dev: false - /next@13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4): - resolution: {integrity: sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==} - engines: {node: '>=16.14.0'} + /next@14.0.0(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)(sass@1.69.4): + resolution: {integrity: sha512-J0jHKBJpB9zd4+c153sair0sz44mbaCHxggs8ryVXSFBuBqJ8XdE9/ozoV85xGh2VnSjahwntBZZgsihL9QznA==} + engines: {node: '>=18.17.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -10385,7 +10378,7 @@ packages: sass: optional: true dependencies: - '@next/env': 13.5.6 + '@next/env': 14.0.0 '@swc/helpers': 0.5.2 busboy: 1.6.0 caniuse-lite: 1.0.30001553 @@ -10396,15 +10389,15 @@ packages: styled-jsx: 5.1.1(@babel/core@7.23.2)(react@18.2.0) watchpack: 2.4.0 optionalDependencies: - '@next/swc-darwin-arm64': 13.5.6 - '@next/swc-darwin-x64': 13.5.6 - '@next/swc-linux-arm64-gnu': 13.5.6 - '@next/swc-linux-arm64-musl': 13.5.6 - '@next/swc-linux-x64-gnu': 13.5.6 - '@next/swc-linux-x64-musl': 13.5.6 - '@next/swc-win32-arm64-msvc': 13.5.6 - '@next/swc-win32-ia32-msvc': 13.5.6 - '@next/swc-win32-x64-msvc': 13.5.6 + '@next/swc-darwin-arm64': 14.0.0 + '@next/swc-darwin-x64': 14.0.0 + '@next/swc-linux-arm64-gnu': 14.0.0 + '@next/swc-linux-arm64-musl': 14.0.0 + '@next/swc-linux-x64-gnu': 14.0.0 + '@next/swc-linux-x64-musl': 14.0.0 + '@next/swc-win32-arm64-msvc': 14.0.0 + '@next/swc-win32-ia32-msvc': 14.0.0 + '@next/swc-win32-x64-msvc': 14.0.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -11519,7 +11512,7 @@ packages: engines: {node: '>=0.10.0'} dev: true - /react-remove-scroll-bar@2.3.4(@types/react@18.2.21)(react@18.2.0): + /react-remove-scroll-bar@2.3.4(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} engines: {node: '>=10'} peerDependencies: @@ -11529,12 +11522,12 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.21 + '@types/react': 18.2.33 react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.21)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.33)(react@18.2.0) tslib: 2.6.2 - /react-remove-scroll@2.5.5(@types/react@18.2.21)(react@18.2.0): + /react-remove-scroll@2.5.5(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} engines: {node: '>=10'} peerDependencies: @@ -11544,13 +11537,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.21 + '@types/react': 18.2.33 react: 18.2.0 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.21)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.21)(react@18.2.0) + react-remove-scroll-bar: 2.3.4(@types/react@18.2.33)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.33)(react@18.2.0) tslib: 2.6.2 - use-callback-ref: 1.3.0(@types/react@18.2.21)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.21)(react@18.2.0) + use-callback-ref: 1.3.0(@types/react@18.2.33)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.33)(react@18.2.0) /react-ssr-prepass@1.5.0(react@18.2.0): resolution: {integrity: sha512-yFNHrlVEReVYKsLI5lF05tZoHveA5pGzjFbFJY/3pOqqjGOmMmqx83N4hIjN2n6E1AOa+eQEUxs3CgRnPmT0RQ==} @@ -11560,7 +11553,7 @@ packages: react: 18.2.0 dev: false - /react-style-singleton@2.2.1(@types/react@18.2.21)(react@18.2.0): + /react-style-singleton@2.2.1(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -11570,7 +11563,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.21 + '@types/react': 18.2.33 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 @@ -13069,7 +13062,7 @@ packages: qs: 6.11.2 dev: true - /use-callback-ref@1.3.0(@types/react@18.2.21)(react@18.2.0): + /use-callback-ref@1.3.0(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} engines: {node: '>=10'} peerDependencies: @@ -13079,7 +13072,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.21 + '@types/react': 18.2.33 react: 18.2.0 tslib: 2.6.2 @@ -13094,7 +13087,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /use-sidecar@1.1.2(@types/react@18.2.21)(react@18.2.0): + /use-sidecar@1.1.2(@types/react@18.2.33)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -13104,7 +13097,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.21 + '@types/react': 18.2.33 detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.6.2 diff --git a/server/trpc.ts b/server/trpc.ts index f696b142..c2133cfe 100644 --- a/server/trpc.ts +++ b/server/trpc.ts @@ -1,8 +1,12 @@ import { TRPCError, initTRPC } from '@trpc/server'; -import { type createTRPCContext } from './context'; +import { createInnerTRPCContext, type createTRPCContext } from './context'; import superjson from 'superjson'; import { env } from '~/env.mjs'; import { ZodError } from 'zod'; +import { headers } from 'next/headers'; +import { experimental_createServerActionHandler } from '@trpc/next/app-dir/server'; +import { getServerSession } from '~/utils/auth'; +import 'server-only'; const t = initTRPC.context().create({ transformer: superjson, @@ -42,18 +46,19 @@ const enforceDevEnvironment = t.middleware(({ ctx, next }) => { }); }); -// /** -// * Helper to create validated server actions from trpc procedures, or build inline actions using the -// * reusable procedure builders. -// */ -// export const createAction = experimental_createServerActionHandler(t, { -// createContext() { -// const ctx = createInnerTRPCContext({ -// headers: headers(), -// }); -// return ctx; -// }, -// }); +/** + * Helper to create validated server actions from trpc procedures, or build inline actions using the + * reusable procedure builders. + */ +export const createAction = experimental_createServerActionHandler(t, { + async createContext() { + const ctx = createInnerTRPCContext({ + session: await getServerSession(), + headers: headers(), + }); + return ctx; + }, +}); export const router = t.router; export const middleware = t.middleware; From d154758563486889fc87493889dc2d0286353aa2 Mon Sep 17 00:00:00 2001 From: Joshua Melville Date: Mon, 30 Oct 2023 14:53:28 +0200 Subject: [PATCH 08/14] add useTransition to useOptomistic use --- components/AnonymousRecruitmentSwitch/Switch.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/components/AnonymousRecruitmentSwitch/Switch.tsx b/components/AnonymousRecruitmentSwitch/Switch.tsx index 20c94e3d..5abad780 100644 --- a/components/AnonymousRecruitmentSwitch/Switch.tsx +++ b/components/AnonymousRecruitmentSwitch/Switch.tsx @@ -2,13 +2,14 @@ import { Switch as SwitchUI } from '~/components/ui/switch'; import { setAnonymousRecruitment } from './action'; -import { useOptimistic } from 'react'; +import { useOptimistic, useTransition } from 'react'; const Switch = ({ allowAnonymousRecruitment, }: { allowAnonymousRecruitment: boolean; }) => { + const [isPending, startTransition] = useTransition(); const [ optimisticAllowAnonymousRecruitment, setOptimisticAllowAnonymousRecruitment, @@ -29,9 +30,11 @@ const Switch = ({ { - setOptimisticAllowAnonymousRecruitment(value); - await setAnonymousRecruitment(value); + onCheckedChange={(value) => { + startTransition(async () => { + setOptimisticAllowAnonymousRecruitment(value); + await setAnonymousRecruitment(value); + }); }} />
From f83984ce6a5fca9d71c2339c00aa0b25797f086f Mon Sep 17 00:00:00 2001 From: Joshua Melville Date: Mon, 30 Oct 2023 15:31:52 +0200 Subject: [PATCH 09/14] implement server actions reset flow and revert tRPC for getting session in root layout --- .../dashboard/_components/ResetButton.tsx | 32 ++++--------------- .../OnboardSteps/Documentation.tsx | 20 +++--------- app/(onboard)/_components/SignInForm.tsx | 10 +++++- app/(onboard)/layout.tsx | 4 +-- app/(onboard)/setup/page.tsx | 11 +++++-- app/layout.tsx | 12 ++++--- components/ui/SubmitButton.tsx | 17 ++++++++++ server/routers/session.ts | 4 --- 8 files changed, 55 insertions(+), 55 deletions(-) create mode 100644 components/ui/SubmitButton.tsx diff --git a/app/(dashboard)/dashboard/_components/ResetButton.tsx b/app/(dashboard)/dashboard/_components/ResetButton.tsx index d15b2f77..ac20d2f6 100644 --- a/app/(dashboard)/dashboard/_components/ResetButton.tsx +++ b/app/(dashboard)/dashboard/_components/ResetButton.tsx @@ -1,31 +1,13 @@ -'use client'; - -import { Loader2 } from 'lucide-react'; -import { useRouter } from 'next/navigation'; -import { useState } from 'react'; -import { api } from '~/trpc/client'; -import { Button } from '~/components/ui/Button'; +import { resetAppSettings } from '~/app/_actions'; +import SubmitButton from '~/components/ui/SubmitButton'; const ResetButton = () => { - const [loading, setLoading] = useState(false); - const router = useRouter(); - const { mutateAsync: resetConfigured } = api.appSettings.reset.useMutation(); - - const reset = async () => { - setLoading(true); - await resetConfigured(); - router.refresh(); - }; - return ( - +
+ + Reset all app data + +
); }; diff --git a/app/(onboard)/_components/OnboardSteps/Documentation.tsx b/app/(onboard)/_components/OnboardSteps/Documentation.tsx index 0e4c2898..68f22f28 100644 --- a/app/(onboard)/_components/OnboardSteps/Documentation.tsx +++ b/app/(onboard)/_components/OnboardSteps/Documentation.tsx @@ -1,25 +1,11 @@ -'use client'; - import { Card, CardContent, CardHeader, CardTitle } from '~/components/ui/card'; import { FileText, Loader2, MonitorPlay } from 'lucide-react'; import { FancyButton } from '~/components/ui/FancyButton'; import { useFormStatus } from 'react-dom'; import { setAppConfigured } from '~/app/_actions'; +import SubmitButton from '~/components/ui/SubmitButton'; function Documentation() { - const { pending: loading } = useFormStatus(); - - if (loading) { - return ( -
-
-

Finalizing setup...

- -
-
- ); - } - return (
@@ -61,7 +47,9 @@ function Documentation() {
- Go to the dashboard! + + Go to the dashboard! +
diff --git a/app/(onboard)/_components/SignInForm.tsx b/app/(onboard)/_components/SignInForm.tsx index f4295100..c1297579 100644 --- a/app/(onboard)/_components/SignInForm.tsx +++ b/app/(onboard)/_components/SignInForm.tsx @@ -45,7 +45,15 @@ export default function SignInForm({ callbackUrl }: { callbackUrl?: Route }) { if (result.session) { if (callbackUrl) { - router.push(callbackUrl); + // For some reason, using the router causes the component to re-render + // which in turn causes a flash. Using window.location.replace() does + // not cause this issue. + + // router.replace(callbackUrl); + window.location.replace(callbackUrl); + } else { + // router.replace('/dashboard'); + window.location.replace('/dashboard'); } } }, diff --git a/app/(onboard)/layout.tsx b/app/(onboard)/layout.tsx index db822022..8364ed9a 100644 --- a/app/(onboard)/layout.tsx +++ b/app/(onboard)/layout.tsx @@ -6,7 +6,7 @@ import Link from 'next/link'; export default function Layout({ children }: PropsWithChildren) { return ( <> -
+
-
+
diff --git a/app/(onboard)/setup/page.tsx b/app/(onboard)/setup/page.tsx index 54c1bf78..ae643268 100644 --- a/app/(onboard)/setup/page.tsx +++ b/app/(onboard)/setup/page.tsx @@ -6,7 +6,7 @@ import OnboardSteps from '../_components/Sidebar'; import { parseAsInteger, useQueryState } from 'next-usequerystate'; import { userFormClasses } from '../_shared'; import { useSession } from '~/providers/SessionProvider'; -import React, { useCallback, useEffect } from 'react'; +import React, { useEffect } from 'react'; import type { Route } from 'next'; import { api } from '~/trpc/client'; import dynamic from 'next/dynamic'; @@ -63,7 +63,9 @@ function Page() { // eslint-disable-next-line no-console .catch((e) => console.error(e)); } + }, [data, router]); + useEffect(() => { if (isLoading) { return; } @@ -72,7 +74,12 @@ function Page() { setCurrentStep(1).catch(() => {}); return; } - }, [isLoading, data, router, pathname, session, currentStep, setCurrentStep]); + + if (session && currentStep === 1) { + setCurrentStep(2).catch(() => {}); + return; + } + }, [isLoading, session, currentStep, setCurrentStep]); const cardClasses = cn(userFormClasses, 'flex-row bg-transparent p-0 gap-6'); const mainClasses = cn('bg-white flex w-full p-12 rounded-xl'); diff --git a/app/layout.tsx b/app/layout.tsx index 02f58f04..fb1436ae 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -5,7 +5,8 @@ import RedirectWrapper from '~/components/RedirectWrapper'; import { getServerSession } from '~/utils/auth'; import { api } from '~/trpc/server'; import { Toaster } from '~/components/ui/toaster'; -import { revalidateTag } from 'next/cache'; +import { redirect } from 'next/navigation'; +import { revalidatePath, revalidateTag } from 'next/cache'; export const metadata = { title: 'Network Canvas Fresco', @@ -15,21 +16,22 @@ export const metadata = { export const dynamic = 'force-dynamic'; async function RootLayout({ children }: { children: React.ReactNode }) { - const session = await api.session.get.query(); + const session = await getServerSession(); const appSettings = await api.appSettings.get.query(); // If this is the first run, app settings must be created if (!appSettings) { await api.appSettings.create.mutate(); - return; + revalidateTag('appSettings.get'); + revalidatePath('/'); } return ( {children} diff --git a/components/ui/SubmitButton.tsx b/components/ui/SubmitButton.tsx new file mode 100644 index 00000000..b1ceb6b2 --- /dev/null +++ b/components/ui/SubmitButton.tsx @@ -0,0 +1,17 @@ +'use client'; + +import { useFormStatus } from 'react-dom'; +import { Button, type ButtonProps } from './Button'; +import { Loader2 } from 'lucide-react'; + +function SubmitButton(props: ButtonProps) { + const status = useFormStatus(); + return ( + + ); +} + +export default SubmitButton; diff --git a/server/routers/session.ts b/server/routers/session.ts index e2f16669..deefeb34 100644 --- a/server/routers/session.ts +++ b/server/routers/session.ts @@ -24,8 +24,6 @@ export const signOutProc = async ({ ctx }: { ctx: Context }) => { authRequest.setSession(null); - revalidateTag('session.get'); - return { success: true, }; @@ -86,8 +84,6 @@ export const sessionRouter = router({ authRequest.setSession(session); - revalidateTag('session.get'); - return { error: null, session, From ad91c5806ff8673717ebbbf5c24b0ae543044f06 Mon Sep 17 00:00:00 2001 From: Joshua Melville Date: Mon, 30 Oct 2023 15:41:15 +0200 Subject: [PATCH 10/14] tweak navbar style and add signOut method to useSession hook --- .../dashboard/_components/NavigationBar.tsx | 2 +- .../dashboard/_components/UserMenu.tsx | 17 +++-------------- providers/SessionProvider.tsx | 15 +++++++++++---- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/app/(dashboard)/dashboard/_components/NavigationBar.tsx b/app/(dashboard)/dashboard/_components/NavigationBar.tsx index c2387b06..73f71179 100644 --- a/app/(dashboard)/dashboard/_components/NavigationBar.tsx +++ b/app/(dashboard)/dashboard/_components/NavigationBar.tsx @@ -35,7 +35,7 @@ export function NavigationBar() { const pathname = usePathname(); return ( -
From a61aeda70b69070331ce93763c71e59efb1e3fc0 Mon Sep 17 00:00:00 2001 From: Joshua Melville Date: Wed, 1 Nov 2023 20:08:02 +0200 Subject: [PATCH 14/14] remove engines from package.json --- package.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/package.json b/package.json index 6395bdb6..d503480c 100644 --- a/package.json +++ b/package.json @@ -3,10 +3,6 @@ "version": "0.1.0", "private": true, "packageManager": "pnpm@8.9.0", - "engines": { - "node": ">=18.16.0", - "pnpm": ">=8.6.3" - }, "scripts": { "build": "next build", "dev": "next dev",