From ce99aa250eb67c919c3875f70e5b796437aa1f0d Mon Sep 17 00:00:00 2001 From: eduardozgz Date: Fri, 19 Jul 2024 19:09:49 +0200 Subject: [PATCH] Setup i18n for website --- apps/bot/src/@types/resources.d.ts | 2 - apps/bot/src/locales/en-US/main.json | 2 - apps/bot/src/locales/es-ES/main.json | 5 +- apps/bot/src/locales/ru/main.json | 5 +- apps/website/package.json | 12 +- apps/website/src/@types/i18next.d.ts | 8 + apps/website/src/@types/resources.d.ts | 32 + .../src/app/components/LanguageSelector.tsx | 36 + apps/website/src/app/components/NavBar.tsx | 11 +- apps/website/src/app/error.tsx | 46 +- apps/website/src/app/layout.tsx | 3 +- apps/website/src/hooks/useBreakpoint copy.ts | 16 - apps/website/src/hooks/useConfirmOnLeave.ts | 7 +- apps/website/src/i18n/client.ts | 86 ++ apps/website/src/i18n/locales/en-US/main.json | 28 + apps/website/src/i18n/locales/es-ES/main.json | 1 + apps/website/src/i18n/locales/ru/main.json | 1 + apps/website/src/i18n/server.ts | 32 + apps/website/src/i18n/settings.ts | 21 + package.json | 3 +- packages/ui/package.json | 1 + packages/ui/src/dropdown-menu.tsx | 200 +++++ pnpm-lock.yaml | 741 ++++++++++++++++-- turbo.json | 4 + 24 files changed, 1195 insertions(+), 108 deletions(-) create mode 100644 apps/website/src/@types/i18next.d.ts create mode 100644 apps/website/src/@types/resources.d.ts create mode 100644 apps/website/src/app/components/LanguageSelector.tsx delete mode 100644 apps/website/src/hooks/useBreakpoint copy.ts create mode 100644 apps/website/src/i18n/client.ts create mode 100644 apps/website/src/i18n/locales/en-US/main.json create mode 100644 apps/website/src/i18n/locales/es-ES/main.json create mode 100644 apps/website/src/i18n/locales/ru/main.json create mode 100644 apps/website/src/i18n/server.ts create mode 100644 apps/website/src/i18n/settings.ts create mode 100644 packages/ui/src/dropdown-menu.tsx diff --git a/apps/bot/src/@types/resources.d.ts b/apps/bot/src/@types/resources.d.ts index ae3925617..748efa017 100644 --- a/apps/bot/src/@types/resources.d.ts +++ b/apps/bot/src/@types/resources.d.ts @@ -1,7 +1,5 @@ interface Resources { "main": { - "langCode": "en-US", - "langName": "English, US", "interaction": { "commandHandler": { "error": { diff --git a/apps/bot/src/locales/en-US/main.json b/apps/bot/src/locales/en-US/main.json index 21560e60f..ee870152c 100644 --- a/apps/bot/src/locales/en-US/main.json +++ b/apps/bot/src/locales/en-US/main.json @@ -1,6 +1,4 @@ { - "langCode": "en-US", - "langName": "English, US", "interaction": { "commandHandler": { "error": { diff --git a/apps/bot/src/locales/es-ES/main.json b/apps/bot/src/locales/es-ES/main.json index 374d0d0ea..0967ef424 100644 --- a/apps/bot/src/locales/es-ES/main.json +++ b/apps/bot/src/locales/es-ES/main.json @@ -1,4 +1 @@ -{ - "langCode": "es-ES", - "langName": "Español" -} +{} diff --git a/apps/bot/src/locales/ru/main.json b/apps/bot/src/locales/ru/main.json index 8e5a20bff..0967ef424 100644 --- a/apps/bot/src/locales/ru/main.json +++ b/apps/bot/src/locales/ru/main.json @@ -1,4 +1 @@ -{ - "langCode": "ru", - "langName": "Русский" -} +{} diff --git a/apps/website/package.json b/apps/website/package.json index 57e484f32..76f748497 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -4,14 +4,15 @@ "private": true, "type": "module", "scripts": { - "build": "pnpm with-env next build --experimental-build-mode compile", + "build": "pnpm run generate-i18next-res; pnpm with-env next build --experimental-build-mode compile", "clean": "git clean -xdf .next .turbo node_modules", "dev": "pnpm with-env next dev", "format": "prettier --check . --ignore-path ../../.gitignore", "lint": "eslint", "start": "pnpm with-env next start", "typecheck": "tsc --noEmit", - "with-env": "dotenv -e ../../.env --" + "with-env": "dotenv -e ../../.env --", + "generate-i18next-res": "i18next-resources-for-ts interface -i ./src/i18n/locales/en-US -o ./src/@types/resources.d.ts" }, "dependencies": { "@discordjs/rest": "^2.3.0", @@ -28,7 +29,11 @@ "@trpc/react-query": "next", "@trpc/server": "next", "@twemoji/api": "^15.1.0", + "accept-language": "^3.0.18", "discord-api-types": "^0.37.83", + "i18next": "^23.11.5", + "i18next-browser-languagedetector": "^8.0.0", + "i18next-resources-to-backend": "^1.2.1", "ioredis": "^5.4.1", "iron-session": "^8.0.1", "is-hotkey": "^0.2.0", @@ -39,7 +44,9 @@ "node-loader": "^2.0.0", "prismjs": "^1.29.0", "react": "^18.3.1", + "react-cookie": "^7.1.4", "react-dom": "18.2.0", + "react-i18next": "^15.0.0", "server-only": "^0.0.1", "slate": "^0.103.0", "slate-history": "^0.100.0", @@ -63,6 +70,7 @@ "@types/uuid": "^9.0.8", "dotenv-cli": "^7.4.1", "eslint": "^9.2.0", + "i18next-resources-for-ts": "^1.5.0", "jiti": "^1.21.0", "prettier": "^3.2.5", "tailwindcss": "^3.4.3", diff --git a/apps/website/src/@types/i18next.d.ts b/apps/website/src/@types/i18next.d.ts new file mode 100644 index 000000000..cae9456dc --- /dev/null +++ b/apps/website/src/@types/i18next.d.ts @@ -0,0 +1,8 @@ +import type Resources from "./resources"; + +declare module "i18next" { + interface CustomTypeOptions { + defaultNS: "main"; + resources: Resources; + } +} diff --git a/apps/website/src/@types/resources.d.ts b/apps/website/src/@types/resources.d.ts new file mode 100644 index 000000000..4a90f7aa6 --- /dev/null +++ b/apps/website/src/@types/resources.d.ts @@ -0,0 +1,32 @@ +interface Resources { + "main": { + "hooks": { + "useConfirmOnLeave": "You have unsaved changes - are you sure you wish to leave this page?" + }, + "components": { + "NavBar": { + "supportEntry": "Support", + "dashboardEntry": "Dashboard", + "accountEntry": "Account" + } + }, + "pages": { + "error": { + "errors": { + "NotAuthenticated": "You are not logged in.", + "NotAuthorized": "You are not authorized to access this page.", + "NotFound": "The page you were looking for could not be found.", + "InternalServerError": "An unexpected error occurred." + }, + "nav": { + "homeBtn": "Go home", + "tryAgainBtn": "Try again", + "supportBtn": "Get support", + "backBtn": "Go back" + } + } + } + } +} + +export default Resources; diff --git a/apps/website/src/app/components/LanguageSelector.tsx b/apps/website/src/app/components/LanguageSelector.tsx new file mode 100644 index 000000000..ae82379ea --- /dev/null +++ b/apps/website/src/app/components/LanguageSelector.tsx @@ -0,0 +1,36 @@ +import { Globe2Icon } from "lucide-react"; + +import { Button } from "@mc/ui/button"; +import { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuTrigger, +} from "@mc/ui/dropdown-menu"; + +import { useTranslation } from "~/i18n/client"; +import { languageEntries } from "~/i18n/settings"; + +export function LanguageSelector() { + const [_t, i18n] = useTranslation(); + return ( + + + + + + {Object.entries(languageEntries).map(([code, label]) => ( + i18n.changeLanguage(code)} + > + {label} + + ))} + + + ); +} diff --git a/apps/website/src/app/components/NavBar.tsx b/apps/website/src/app/components/NavBar.tsx index 406f430e8..2f06390c3 100644 --- a/apps/website/src/app/components/NavBar.tsx +++ b/apps/website/src/app/components/NavBar.tsx @@ -6,14 +6,16 @@ import { usePathname } from "next/navigation"; import { cn } from "@mc/ui"; +import { useTranslation } from "~/i18n/client"; import { Routes } from "~/other/routes"; import { BotIcon } from "./BotIcon"; +import { LanguageSelector } from "./LanguageSelector"; const major = Major_Mono_Display({ subsets: ["latin"], weight: "400" }); export default function NavBar() { const pathname = usePathname(); - + const [t] = useTranslation(); return (
); diff --git a/apps/website/src/app/error.tsx b/apps/website/src/app/error.tsx index 1980335ac..d55df8139 100644 --- a/apps/website/src/app/error.tsx +++ b/apps/website/src/app/error.tsx @@ -5,20 +5,21 @@ import { useRouter } from "next/navigation"; import { Button } from "@mc/ui/button"; +import { useTranslation } from "~/i18n/client"; import { Routes } from "~/other/routes"; import { Errors } from "./errors"; -const errorCodes = { +const errorCodes: Record = { [Errors.NotAuthenticated]: "401", [Errors.NotAuthorized]: "403", [Errors.NotFound]: "404", }; const errorMessages = { - [Errors.NotAuthenticated]: "You are not logged in.", - [Errors.NotAuthorized]: "You are not authorized to access this page.", - [Errors.NotFound]: "The page you were looking for could not be found.", -}; + [Errors.NotAuthenticated]: "pages.error.errors.NotAuthenticated", + [Errors.NotAuthorized]: "pages.error.errors.NotAuthorized", + [Errors.NotFound]: "pages.error.errors.NotFound", +} as const; export default function Error({ error, @@ -28,23 +29,22 @@ export default function Error({ reset?: () => void; }) { const router = useRouter(); + const [t] = useTranslation(); - let code = "500"; - let message = "An unexpected error occurred."; - const digest = error.digest; + const code = errorCodes[error.message] ?? "500"; + let message = t("pages.error.errors.InternalServerError"); - for (const [errorKey, errorMessage] of Object.entries(errorMessages)) { - if (error.message === errorKey) { - message = errorMessage; - break; - } - } + const digest = error.digest; - for (const [errorKey, errorCode] of Object.entries(errorCodes)) { - if (error.message === errorKey) { - code = errorCode; - break; - } + if (error.message in errorMessages) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + //@ts-ignore + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const tKey = errorMessages[error.message]; + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + //@ts-ignore + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + message = t(tKey); } return ( @@ -59,21 +59,21 @@ export default function Error({
{reset && ( )}
diff --git a/apps/website/src/app/layout.tsx b/apps/website/src/app/layout.tsx index 496e26a57..4f570f970 100644 --- a/apps/website/src/app/layout.tsx +++ b/apps/website/src/app/layout.tsx @@ -14,14 +14,13 @@ export const metadata = { title: "Member Counter", }; -// TODO setup i18next export default function RootLayout({ children, }: { children: React.ReactNode; }) { return ( - + { const handleBeforeUnload = (e: BeforeUnloadEvent) => { @@ -34,7 +35,7 @@ function useConfirmOnLeave(shouldConfirm: boolean) { proceed(); } }, - [shouldConfirm], + [shouldConfirm, warningText], ); useInterceptAppRouter("back", handleRouterChange); diff --git a/apps/website/src/i18n/client.ts b/apps/website/src/i18n/client.ts new file mode 100644 index 000000000..129d431ce --- /dev/null +++ b/apps/website/src/i18n/client.ts @@ -0,0 +1,86 @@ +"use client"; + +import type { KeyPrefix } from "i18next"; +import type { + FallbackNs, + UseTranslationOptions, + UseTranslationResponse, +} from "react-i18next"; +import { useEffect, useState } from "react"; +import acceptLanguage from "accept-language"; +import i18next, { dir } from "i18next"; +import LanguageDetector from "i18next-browser-languagedetector"; +import resourcesToBackend from "i18next-resources-to-backend"; +import { useCookies } from "react-cookie"; +import { + initReactI18next, + useTranslation as useTranslationOrg, +} from "react-i18next"; + +import type Resources from "~/@types/resources"; +import { + cookieName, + defaultNS, + fallbackLng, + getOptions, + languages, +} from "./settings"; + +acceptLanguage.languages([...languages]); + +const runsOnServerSide = typeof window === "undefined"; + +void i18next + .use(initReactI18next) + .use(LanguageDetector) + .use( + resourcesToBackend( + (language: string, namespace: string) => + import(`./locales/${language}/${namespace}.json`), + ), + ) + .init({ + ...getOptions(), + lng: undefined, // let detect the language on client side + detection: { + order: ["cookie", "navigator"], + lookupCookie: cookieName, + }, + preload: runsOnServerSide ? languages : [], + }); + +function useTranslation< + Ns extends keyof Resources = "main", + KPrefix extends KeyPrefix> = undefined, +>( + ns?: Ns, + options?: UseTranslationOptions, +): UseTranslationResponse, KPrefix>; +function useTranslation(ns = defaultNS, options = {}) { + const [_cookies, setCookie] = useCookies([cookieName]); + const ret = useTranslationOrg(ns, options); + const retDef = useTranslationOrg(ns, { ...options, lng: fallbackLng }); + + const { i18n } = ret; + + document.documentElement.lang = ret[1].resolvedLanguage ?? fallbackLng; + document.documentElement.dir = dir(document.documentElement.lang); + + useEffect(() => { + setCookie(cookieName, i18n.language, { + path: "/", + sameSite: true, + expires: new Date(new Date().getTime() + 5 * 365 * 24 * 60 * 60 * 1000), + }); + }, [i18n.language, setCookie]); + + const [isClient, setIsClient] = useState(false); + + useEffect(() => { + setIsClient(true); + }, []); + + return isClient ? ret : retDef; +} + +export { useTranslation }; diff --git a/apps/website/src/i18n/locales/en-US/main.json b/apps/website/src/i18n/locales/en-US/main.json new file mode 100644 index 000000000..b09b58b85 --- /dev/null +++ b/apps/website/src/i18n/locales/en-US/main.json @@ -0,0 +1,28 @@ +{ + "hooks": { + "useConfirmOnLeave": "You have unsaved changes - are you sure you wish to leave this page?" + }, + "components": { + "NavBar": { + "supportEntry": "Support", + "dashboardEntry": "Dashboard", + "accountEntry": "Account" + } + }, + "pages": { + "error": { + "errors": { + "NotAuthenticated": "You are not logged in.", + "NotAuthorized": "You are not authorized to access this page.", + "NotFound": "The page you were looking for could not be found.", + "InternalServerError": "An unexpected error occurred." + }, + "nav": { + "homeBtn": "Go home", + "tryAgainBtn": "Try again", + "supportBtn": "Get support", + "backBtn": "Go back" + } + } + } +} diff --git a/apps/website/src/i18n/locales/es-ES/main.json b/apps/website/src/i18n/locales/es-ES/main.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/src/i18n/locales/es-ES/main.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/src/i18n/locales/ru/main.json b/apps/website/src/i18n/locales/ru/main.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/website/src/i18n/locales/ru/main.json @@ -0,0 +1 @@ +{} diff --git a/apps/website/src/i18n/server.ts b/apps/website/src/i18n/server.ts new file mode 100644 index 000000000..d769ea3ef --- /dev/null +++ b/apps/website/src/i18n/server.ts @@ -0,0 +1,32 @@ +import { cookies } from "next/headers"; +import acceptLanguage from "accept-language"; +import { createInstance } from "i18next"; +import resourcesToBackend from "i18next-resources-to-backend"; +import { initReactI18next } from "react-i18next/initReactI18next"; + +import { cookieName, fallbackLng, getOptions, languages } from "./settings"; + +acceptLanguage.languages([...languages]); + +const initI18next = async (lng: string) => { + const i18nInstance = createInstance(); + await i18nInstance + .use(initReactI18next) + .use( + resourcesToBackend( + (language: string, namespace: string) => + import(`./locales/${language}/${namespace}.json`), + ), + ) + .init(getOptions(lng)); + return i18nInstance; +}; + +export async function translation() { + const lng = + acceptLanguage.get(cookies().get(cookieName)?.value) ?? fallbackLng; + + const i18nextInstance = await initI18next(lng); + + return [i18nextInstance.getFixedT(lng), i18nextInstance]; +} diff --git a/apps/website/src/i18n/settings.ts b/apps/website/src/i18n/settings.ts new file mode 100644 index 000000000..862dfaef7 --- /dev/null +++ b/apps/website/src/i18n/settings.ts @@ -0,0 +1,21 @@ +import type Resources from "~/@types/resources"; + +export const fallbackLng = "en-US"; +export const languages = [fallbackLng, "es-ES", "ru"] as const; +export const languageEntries: Record<(typeof languages)[number], string> = { + "en-US": "🇺🇸 English (US)", + "es-ES": "🇪🇸 Español", + ru: "🇷🇺 Русский", +}; +export const defaultNS: keyof Resources = "main"; +export const cookieName = "language"; + +export function getOptions(lng = fallbackLng) { + return { + supportedLngs: languages, + lng, + fallbackLng, + fallbackNS: defaultNS, + defaultNS, + }; +} diff --git a/package.json b/package.json index 2592b8211..783195f78 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "lint:ws": "pnpm dlx sherif@latest", "postinstall": "pnpm lint:ws", "typecheck": "turbo typecheck", - "ui-add": "pnpm -F ui ui-add" + "ui-add": "pnpm -F ui ui-add", + "generate-i18next-res": "turbo generate-i18next-res" }, "devDependencies": { "@mc/prettier-config": "workspace:*", diff --git a/packages/ui/package.json b/packages/ui/package.json index 0342843ec..b206af896 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -19,6 +19,7 @@ "dependencies": { "@radix-ui/react-checkbox": "^1.0.4", "@radix-ui/react-dialog": "^1.0.5", + "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.0.2", "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-portal": "^1.0.4", diff --git a/packages/ui/src/dropdown-menu.tsx b/packages/ui/src/dropdown-menu.tsx new file mode 100644 index 000000000..7df2cdbd3 --- /dev/null +++ b/packages/ui/src/dropdown-menu.tsx @@ -0,0 +1,200 @@ +"use client"; + +import * as React from "react"; +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; +import { Check, ChevronRight, Circle } from "lucide-react"; + +import { cn } from "@mc/ui"; + +const DropdownMenu = DropdownMenuPrimitive.Root; + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; + +const DropdownMenuGroup = DropdownMenuPrimitive.Group; + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal; + +const DropdownMenuSub = DropdownMenuPrimitive.Sub; + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)); +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName; + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName; + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)); +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName; + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ); +}; +DropdownMenuShortcut.displayName = "DropdownMenuShortcut"; + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index da33a15a1..9e1bac10f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -146,19 +146,31 @@ importers: version: 5.40.0(react@18.3.1) '@trpc/client': specifier: next - version: 11.0.0-rc.460(@trpc/server@11.0.0-rc.460) + version: 11.0.0-rc.466(@trpc/server@11.0.0-rc.466) '@trpc/react-query': specifier: next - version: 11.0.0-rc.460(@tanstack/react-query@5.40.0(react@18.3.1))(@trpc/client@11.0.0-rc.460(@trpc/server@11.0.0-rc.460))(@trpc/server@11.0.0-rc.460)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) + version: 11.0.0-rc.466(@tanstack/react-query@5.40.0(react@18.3.1))(@trpc/client@11.0.0-rc.466(@trpc/server@11.0.0-rc.466))(@trpc/server@11.0.0-rc.466)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) '@trpc/server': specifier: next - version: 11.0.0-rc.460 + version: 11.0.0-rc.466 '@twemoji/api': specifier: ^15.1.0 version: 15.1.0 + accept-language: + specifier: ^3.0.18 + version: 3.0.18 discord-api-types: specifier: ^0.37.83 version: 0.37.83 + i18next: + specifier: ^23.11.5 + version: 23.11.5 + i18next-browser-languagedetector: + specifier: ^8.0.0 + version: 8.0.0 + i18next-resources-to-backend: + specifier: ^1.2.1 + version: 1.2.1 ioredis: specifier: ^5.4.1 version: 5.4.1 @@ -189,9 +201,15 @@ importers: react: specifier: ^18.3.1 version: 18.3.1 + react-cookie: + specifier: ^7.1.4 + version: 7.1.4(react@18.3.1) react-dom: specifier: 18.2.0 version: 18.2.0(react@18.3.1) + react-i18next: + specifier: ^15.0.0 + version: 15.0.0(i18next@23.11.5)(react-dom@18.2.0(react@18.3.1))(react@18.3.1) server-only: specifier: ^0.0.1 version: 0.0.1 @@ -256,6 +274,9 @@ importers: eslint: specifier: ^9.2.0 version: 9.2.0 + i18next-resources-for-ts: + specifier: ^1.5.0 + version: 1.5.0 jiti: specifier: ^1.21.0 version: 1.21.0 @@ -285,10 +306,10 @@ importers: version: 1.2.1(ioredis@5.4.1) '@trpc/client': specifier: next - version: 11.0.0-rc.460(@trpc/server@11.0.0-rc.460) + version: 11.0.0-rc.466(@trpc/server@11.0.0-rc.466) '@trpc/server': specifier: next - version: 11.0.0-rc.460 + version: 11.0.0-rc.466 discord.js: specifier: ^14.15.2 version: 14.15.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) @@ -503,7 +524,7 @@ importers: version: 11.0.0-next-beta.216 '@trpc/server': specifier: next - version: 11.0.0-rc.460 + version: 11.0.0-rc.466 ioredis: specifier: ^5.4.1 version: 5.4.1 @@ -547,6 +568,9 @@ importers: '@radix-ui/react-dialog': specifier: ^1.0.5 version: 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.1 + version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-label': specifier: ^2.0.2 version: 2.0.2(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -851,6 +875,10 @@ packages: resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.24.8': + resolution: {integrity: sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==} + engines: {node: '>=6.9.0'} + '@babel/template@7.24.0': resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} @@ -1264,6 +1292,9 @@ packages: '@radix-ui/primitive@1.0.1': resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + '@radix-ui/primitive@1.1.0': + resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} + '@radix-ui/react-arrow@1.0.3': resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} peerDependencies: @@ -1277,6 +1308,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-arrow@1.1.0': + resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-checkbox@1.0.4': resolution: {integrity: sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==} peerDependencies: @@ -1303,6 +1347,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-collection@1.1.0': + resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-compose-refs@1.0.1': resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: @@ -1312,6 +1369,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-compose-refs@1.1.0': + resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-context@1.0.1': resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: @@ -1321,6 +1387,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-context@1.1.0': + resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-dialog@1.0.5': resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} peerDependencies: @@ -1343,6 +1418,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-direction@1.1.0': + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-dismissable-layer@1.0.5': resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} peerDependencies: @@ -1356,6 +1440,32 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-dismissable-layer@1.1.0': + resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.1': + resolution: {integrity: sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-focus-guards@1.0.1': resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: @@ -1365,6 +1475,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-focus-guards@1.1.0': + resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-focus-scope@1.0.4': resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} peerDependencies: @@ -1378,6 +1497,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-focus-scope@1.1.0': + resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-id@1.0.1': resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: @@ -1387,6 +1519,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-label@2.0.2': resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} peerDependencies: @@ -1400,6 +1541,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-menu@2.1.1': + resolution: {integrity: sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-popover@1.0.7': resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==} peerDependencies: @@ -1426,6 +1580,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-popper@1.2.0': + resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-portal@1.0.4': resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} peerDependencies: @@ -1439,6 +1606,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-portal@1.1.1': + resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-presence@1.0.1': resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: @@ -1452,6 +1632,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-presence@1.1.0': + resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-primitive@1.0.3': resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: @@ -1465,6 +1658,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-primitive@2.0.0': + resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-roving-focus@1.0.4': resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} peerDependencies: @@ -1478,6 +1684,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-roving-focus@1.1.0': + resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-select@2.0.0': resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==} peerDependencies: @@ -1513,6 +1732,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-slot@1.1.0': + resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-switch@1.0.3': resolution: {integrity: sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==} peerDependencies: @@ -1587,6 +1815,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-controllable-state@1.0.1': resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} peerDependencies: @@ -1596,6 +1833,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-escape-keydown@1.0.3': resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} peerDependencies: @@ -1605,6 +1851,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-layout-effect@1.0.1': resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} peerDependencies: @@ -1614,6 +1869,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-previous@1.0.1': resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} peerDependencies: @@ -1632,6 +1896,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-rect@1.1.0': + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-size@1.0.1': resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} peerDependencies: @@ -1641,6 +1914,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-size@1.1.0': + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-visually-hidden@1.0.3': resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} peerDependencies: @@ -1657,6 +1939,9 @@ packages: '@radix-ui/rect@1.0.1': resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} + '@radix-ui/rect@1.1.0': + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + '@rollup/rollup-android-arm-eabi@4.18.0': resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} cpu: [arm] @@ -1801,25 +2086,25 @@ packages: '@total-typescript/ts-reset@0.5.1': resolution: {integrity: sha512-AqlrT8YA1o7Ff5wPfMOL0pvL+1X+sw60NN6CcOCqs658emD6RfiXhF7Gu9QcfKBH7ELY2nInLhKSCWVoNL70MQ==} - '@trpc/client@11.0.0-rc.460': - resolution: {integrity: sha512-d5NIxO1cTRcVTsDka0O0kg85agJuyexpGZJu/lO6pI8wtN6+8rIBM+4c1R3COXvBAd73DE+q+mnIUhgOS4BhmQ==} + '@trpc/client@11.0.0-rc.466': + resolution: {integrity: sha512-8nEYgDPvTrXzn00FgLEOU/BHtH89LVQ0JTiW2efa4wW2XIrj3Nv/QKCRkNXV6yu7VSefwU+p2PulUL6TjNlzAg==} peerDependencies: - '@trpc/server': 11.0.0-rc.460+ab0de4748 + '@trpc/server': 11.0.0-rc.466+1e8344ea7 '@trpc/core@11.0.0-next-beta.216': resolution: {integrity: sha512-dmdSFeSzArkmdZvnymoQwAju0QBODC3PhLgBKTYgVIj0HATE/OJsPAKOxiqdcgm3YyN/zABm+ntiYmjLBJzTCA==} - '@trpc/react-query@11.0.0-rc.460': - resolution: {integrity: sha512-ELw6zKIsp4oN6E4YEVt+l6cyP6FyGP/6TZWOCpf+LLhR6swZuLWpkmmfIgqRPHosAxs4utkN51v9ykfyrWtkNg==} + '@trpc/react-query@11.0.0-rc.466': + resolution: {integrity: sha512-nt0hcskUrr1+kj8kRRhucB6h+VuK55By7ZR1oxaIGdbPygwfXoi2n4+s3t7kjZsJzugKDWtDnwJGfGFaUIP62A==} peerDependencies: '@tanstack/react-query': ^5.49.2 - '@trpc/client': 11.0.0-rc.460+ab0de4748 - '@trpc/server': 11.0.0-rc.460+ab0de4748 + '@trpc/client': 11.0.0-rc.466+1e8344ea7 + '@trpc/server': 11.0.0-rc.466+1e8344ea7 react: '>=18.2.0' react-dom: '>=18.2.0' - '@trpc/server@11.0.0-rc.460': - resolution: {integrity: sha512-BLApP+f54rQx11Mb7riRojPQt4se/V7le7ad/EBDCqzFN7hCVml2aH4enEcePjxsX6z0aWOftm/OriZ7ZYZ5sg==} + '@trpc/server@11.0.0-rc.466': + resolution: {integrity: sha512-/40QZXyZCc3HvgJbQ2+IqCGm4m+fJs7q7gMp6nLiuPB3FIJJeV0r+w1M/NGcG5avbCJ3A5Qy45s4N1glcMv1ug==} '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -1861,6 +2146,9 @@ packages: '@twurple/common@7.1.0': resolution: {integrity: sha512-kz3J9J116+aOdyhCzRQwaxFC5eAewwQ9Iv2UmPHXYqRfbgKay6TsL27vk+Q2HygBCvx/8OWpX3pdSo3V/VPmoA==} + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -1876,6 +2164,9 @@ packages: '@types/glob@7.2.0': resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + '@types/hoist-non-react-statics@3.3.5': + resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} @@ -2049,6 +2340,9 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + accept-language@3.0.18: + resolution: {integrity: sha512-sUofgqBPzgfcF20sPoBYGQ1IhQLt2LSkxTnlQSuLF3n5gPEqd5AimbvOvHEi0T1kLMiGVqPWzI5a9OteBRth3A==} + acorn-import-assertions@1.9.0: resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: @@ -2203,6 +2497,10 @@ packages: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} + bcp47@1.1.2: + resolution: {integrity: sha512-JnkkL4GUpOvvanH9AZPX38CxhiLsXMBicBY2IAtqiVN8YulGDQybUydWA4W6yAMtw6iShtw+8HEF6cfrTHU+UQ==} + engines: {node: '>=0.10'} + big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -3014,6 +3312,12 @@ packages: header-case@1.0.1: resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + html-parse-stringify@3.0.1: + resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} @@ -3036,10 +3340,16 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + i18next-browser-languagedetector@8.0.0: + resolution: {integrity: sha512-zhXdJXTTCoG39QsrOCiOabnWj2jecouOqbchu3EfhtSHxIB5Uugnm9JaizenOy39h7ne3+fLikIjeW88+rgszw==} + i18next-resources-for-ts@1.5.0: resolution: {integrity: sha512-gzVYct/sMeeOzomK0+8nl7YSr61xiDzf4Kg51g7StBaXAaKE/Vb1CLNHZ8dY56sYz6qmbwHRYHqMPanGi0go4w==} hasBin: true + i18next-resources-to-backend@1.2.1: + resolution: {integrity: sha512-okHbVA+HZ7n1/76MsfhPqDou0fptl2dAlhRDu2ideXloRRduzHsqDOznJBef+R3DFZnbvWoBW+KxJ7fnFjd6Yw==} + i18next@23.11.5: resolution: {integrity: sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==} @@ -3908,6 +4218,11 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true + react-cookie@7.1.4: + resolution: {integrity: sha512-wDxxa/HYaSXSMlyWJvJ5uZTzIVtQTPf1gMksFgwAz/2/W3lCtY8r4OChCXMPE7wax0PAdMY97UkNJedGv7KnDw==} + peerDependencies: + react: '>= 16.3.0' + react-dom@18.2.0: resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: @@ -3918,6 +4233,19 @@ packages: peerDependencies: react: ^18.3.1 + react-i18next@15.0.0: + resolution: {integrity: sha512-2O3IgF4zivg57Q6p6i+ChDgJ371IDcEWbuWC6gvoh5NbkDMs0Q+O7RPr4v61+Se32E0V+LmtwePAeqWZW0bi6g==} + peerDependencies: + i18next: '>= 23.2.3' + react: '>= 16.8.0' + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -3941,6 +4269,16 @@ packages: '@types/react': optional: true + react-remove-scroll@2.5.7: + resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + react-resizable-panels@2.0.19: resolution: {integrity: sha512-v3E41kfKSuCPIvJVb4nL4mIZjjKIn/gh6YqZF/gDfQDolv/8XnhJBek4EiV2gOr3hhc5A3kOGOayk3DhanpaQw==} peerDependencies: @@ -4201,6 +4539,10 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + stack-trace@0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} @@ -4551,6 +4893,9 @@ packages: resolution: {integrity: sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==} engines: {node: '>=18.0'} + universal-cookie@7.1.4: + resolution: {integrity: sha512-Q+DVJsdykStWRMtXr2Pdj3EF98qZHUH/fXv/gwFz/unyToy1Ek1w5GsWt53Pf38tT8Gbcy5QNsj61Xe9TggP4g==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -4624,6 +4969,10 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + watchpack@2.4.1: resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} engines: {node: '>=10.13.0'} @@ -4869,6 +5218,10 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 + '@babel/runtime@7.24.8': + dependencies: + regenerator-runtime: 0.14.1 + '@babel/template@7.24.0': dependencies: '@babel/code-frame': 7.24.2 @@ -5240,15 +5593,17 @@ snapshots: '@radix-ui/number@1.0.1': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 '@radix-ui/primitive@1.0.1': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 + + '@radix-ui/primitive@1.1.0': {} '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -5256,6 +5611,15 @@ snapshots: '@types/react': 18.3.1 '@types/react-dom': 18.3.0 + '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + '@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.5 @@ -5275,7 +5639,7 @@ snapshots: '@radix-ui/react-collection@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -5286,16 +5650,40 @@ snapshots: '@types/react': 18.3.1 '@types/react-dom': 18.3.0 + '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + '@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.1)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.1 + + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.1)(react@18.3.1)': + dependencies: react: 18.3.1 optionalDependencies: '@types/react': 18.3.1 '@radix-ui/react-context@1.0.1(@types/react@18.3.1)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.1 + + '@radix-ui/react-context@1.1.0(@types/react@18.3.1)(react@18.3.1)': + dependencies: react: 18.3.1 optionalDependencies: '@types/react': 18.3.1 @@ -5325,14 +5713,20 @@ snapshots: '@radix-ui/react-direction@1.0.1(@types/react@18.3.1)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.1 + + '@radix-ui/react-direction@1.1.0(@types/react@18.3.1)(react@18.3.1)': + dependencies: react: 18.3.1 optionalDependencies: '@types/react': 18.3.1 '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -5344,16 +5738,50 @@ snapshots: '@types/react': 18.3.1 '@types/react-dom': 18.3.0 + '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + '@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.1)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.1 + + '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.1)(react@18.3.1)': + dependencies: react: 18.3.1 optionalDependencies: '@types/react': 18.3.1 '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) @@ -5363,14 +5791,32 @@ snapshots: '@types/react': 18.3.1 '@types/react-dom': 18.3.0 + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + '@radix-ui/react-id@1.0.1(@types/react@18.3.1)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) react: 18.3.1 optionalDependencies: '@types/react': 18.3.1 + '@radix-ui/react-id@1.1.0(@types/react@18.3.1)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.1)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.1 + '@radix-ui/react-label@2.0.2(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.5 @@ -5381,6 +5827,32 @@ snapshots: '@types/react': 18.3.1 '@types/react-dom': 18.3.0 + '@radix-ui/react-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.1)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.1)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + '@radix-ui/react-popover@1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.5 @@ -5407,7 +5879,7 @@ snapshots: '@radix-ui/react-popper@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 '@floating-ui/react-dom': 2.0.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) @@ -5424,6 +5896,24 @@ snapshots: '@types/react': 18.3.1 '@types/react-dom': 18.3.0 + '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.0.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + '@radix-ui/react-portal@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.5 @@ -5434,9 +5924,19 @@ snapshots: '@types/react': 18.3.1 '@types/react-dom': 18.3.0 + '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + '@radix-ui/react-presence@1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) react: 18.3.1 @@ -5445,9 +5945,19 @@ snapshots: '@types/react': 18.3.1 '@types/react-dom': 18.3.0 + '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 '@radix-ui/react-slot': 1.0.2(@types/react@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -5455,9 +5965,18 @@ snapshots: '@types/react': 18.3.1 '@types/react-dom': 18.3.0 + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + '@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.1)(react@18.3.1) @@ -5473,6 +5992,23 @@ snapshots: '@types/react': 18.3.1 '@types/react-dom': 18.3.0 + '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.1 + '@types/react-dom': 18.3.0 + '@radix-ui/react-select@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.5 @@ -5521,6 +6057,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.1 + '@radix-ui/react-slot@1.1.0(@types/react@18.3.1)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.1)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.1 + '@radix-ui/react-switch@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.5 @@ -5605,60 +6148,100 @@ snapshots: '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.1)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.1 + + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.1)(react@18.3.1)': + dependencies: react: 18.3.1 optionalDependencies: '@types/react': 18.3.1 '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.1)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) react: 18.3.1 optionalDependencies: '@types/react': 18.3.1 + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.1)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.1)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.1 + '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.1)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.1)(react@18.3.1) react: 18.3.1 optionalDependencies: '@types/react': 18.3.1 + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.1)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.1)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.1 + '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.1)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.1 + + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.1)(react@18.3.1)': + dependencies: react: 18.3.1 optionalDependencies: '@types/react': 18.3.1 '@radix-ui/react-use-previous@1.0.1(@types/react@18.3.1)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 react: 18.3.1 optionalDependencies: '@types/react': 18.3.1 '@radix-ui/react-use-rect@1.0.1(@types/react@18.3.1)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 '@radix-ui/rect': 1.0.1 react: 18.3.1 optionalDependencies: '@types/react': 18.3.1 + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.1)(react@18.3.1)': + dependencies: + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.1 + '@radix-ui/react-use-size@1.0.1(@types/react@18.3.1)(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.1)(react@18.3.1) react: 18.3.1 optionalDependencies: '@types/react': 18.3.1 + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.1)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.1)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.1 + '@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -5668,7 +6251,9 @@ snapshots: '@radix-ui/rect@1.0.1': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.8 + + '@radix-ui/rect@1.1.0': {} '@rollup/rollup-android-arm-eabi@4.18.0': optional: true @@ -5768,21 +6353,21 @@ snapshots: '@total-typescript/ts-reset@0.5.1': {} - '@trpc/client@11.0.0-rc.460(@trpc/server@11.0.0-rc.460)': + '@trpc/client@11.0.0-rc.466(@trpc/server@11.0.0-rc.466)': dependencies: - '@trpc/server': 11.0.0-rc.460 + '@trpc/server': 11.0.0-rc.466 '@trpc/core@11.0.0-next-beta.216': {} - '@trpc/react-query@11.0.0-rc.460(@tanstack/react-query@5.40.0(react@18.3.1))(@trpc/client@11.0.0-rc.460(@trpc/server@11.0.0-rc.460))(@trpc/server@11.0.0-rc.460)(react-dom@18.2.0(react@18.3.1))(react@18.3.1)': + '@trpc/react-query@11.0.0-rc.466(@tanstack/react-query@5.40.0(react@18.3.1))(@trpc/client@11.0.0-rc.466(@trpc/server@11.0.0-rc.466))(@trpc/server@11.0.0-rc.466)(react-dom@18.2.0(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/react-query': 5.40.0(react@18.3.1) - '@trpc/client': 11.0.0-rc.460(@trpc/server@11.0.0-rc.460) - '@trpc/server': 11.0.0-rc.460 + '@trpc/client': 11.0.0-rc.466(@trpc/server@11.0.0-rc.466) + '@trpc/server': 11.0.0-rc.466 react: 18.3.1 react-dom: 18.2.0(react@18.3.1) - '@trpc/server@11.0.0-rc.460': {} + '@trpc/server@11.0.0-rc.466': {} '@tsconfig/node10@1.0.11': {} @@ -5880,6 +6465,8 @@ snapshots: klona: 2.0.6 tslib: 2.6.2 + '@types/cookie@0.6.0': {} + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 8.56.10 @@ -5899,6 +6486,11 @@ snapshots: '@types/minimatch': 5.1.2 '@types/node': 20.12.13 + '@types/hoist-non-react-statics@3.3.5': + dependencies: + '@types/react': 18.3.1 + hoist-non-react-statics: 3.3.2 + '@types/http-cache-semantics@4.0.4': {} '@types/inquirer@6.5.0': @@ -6123,6 +6715,11 @@ snapshots: '@xtuc/long@4.2.2': {} + accept-language@3.0.18: + dependencies: + bcp47: 1.1.2 + stable: 0.1.8 + acorn-import-assertions@1.9.0(acorn@8.11.3): dependencies: acorn: 8.11.3 @@ -6298,6 +6895,8 @@ snapshots: basic-ftp@5.0.5: {} + bcp47@1.1.2: {} + big.js@5.2.2: {} binary-extensions@2.3.0: {} @@ -7338,6 +7937,14 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + html-parse-stringify@3.0.1: + dependencies: + void-elements: 3.1.0 + htmlparser2@8.0.2: dependencies: domelementtype: 2.3.0 @@ -7368,11 +7975,19 @@ snapshots: human-signals@2.1.0: {} + i18next-browser-languagedetector@8.0.0: + dependencies: + '@babel/runtime': 7.24.8 + i18next-resources-for-ts@1.5.0: dependencies: '@babel/runtime': 7.24.5 yaml: 2.4.2 + i18next-resources-to-backend@1.2.1: + dependencies: + '@babel/runtime': 7.24.5 + i18next@23.11.5: dependencies: '@babel/runtime': 7.24.5 @@ -8194,6 +8809,13 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 + react-cookie@7.1.4(react@18.3.1): + dependencies: + '@types/hoist-non-react-statics': 3.3.5 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + universal-cookie: 7.1.4 + react-dom@18.2.0(react@18.3.1): dependencies: loose-envify: 1.4.0 @@ -8206,6 +8828,15 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 + react-i18next@15.0.0(i18next@23.11.5)(react-dom@18.2.0(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.8 + html-parse-stringify: 3.0.1 + i18next: 23.11.5 + react: 18.3.1 + optionalDependencies: + react-dom: 18.2.0(react@18.3.1) + react-is@16.13.1: {} react-remove-scroll-bar@2.3.6(@types/react@18.3.1)(react@18.3.1): @@ -8227,6 +8858,17 @@ snapshots: optionalDependencies: '@types/react': 18.3.1 + react-remove-scroll@2.5.7(@types/react@18.3.1)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.1)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.1)(react@18.3.1) + tslib: 2.6.2 + use-callback-ref: 1.3.2(@types/react@18.3.1)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.1)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.1 + react-resizable-panels@2.0.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 @@ -8538,6 +9180,8 @@ snapshots: sprintf-js@1.1.3: {} + stable@0.1.8: {} + stack-trace@0.0.10: {} standard-as-callback@2.1.0: {} @@ -8916,6 +9560,11 @@ snapshots: undici@6.13.0: {} + universal-cookie@7.1.4: + dependencies: + '@types/cookie': 0.6.0 + cookie: 0.6.0 + universalify@0.1.2: {} universalify@2.0.1: {} @@ -8979,6 +9628,8 @@ snapshots: - '@types/react' - '@types/react-dom' + void-elements@3.1.0: {} + watchpack@2.4.1: dependencies: glob-to-regexp: 0.4.1 diff --git a/turbo.json b/turbo.json index 249022d8a..873ba8207 100644 --- a/turbo.json +++ b/turbo.json @@ -39,6 +39,10 @@ "dependsOn": ["^topo"], "outputs": ["node_modules/.cache/tsbuildinfo.json"] }, + "generate-i18next-res": { + "outputs": ["src/@types/resources.d.ts"], + "inputs": ["src/**/locales/en-US/*"] + }, "clean": { "cache": false },