From 1384c67aa787a4dd035bba5ecce7abdd239d7ace Mon Sep 17 00:00:00 2001 From: Petter Hancock Date: Sat, 11 Oct 2025 19:11:57 +0200 Subject: [PATCH] feat: migrate from react router to tanstack router --- .gitignore | 3 + apps/web/package.json | 2 + .../app-session/UseAppSessionContent.ts | 6 +- apps/web/src/classes/auth/AuthStatus.ts | 2 +- apps/web/src/core/App.tsx | 11 +- apps/web/src/core/AppProviders.tsx | 12 +- apps/web/src/core/auth/AuthInitializer.tsx | 40 ++ apps/web/src/core/auth/AuthProvider.tsx | 21 +- apps/web/src/core/auth/AuthReducer.tsx | 13 +- apps/web/src/core/auth/UseAuth.ts | 6 + apps/web/src/core/routes/AppRoutes.tsx | 57 +- apps/web/src/pages/about/UseAboutPage.ts | 6 +- .../pages/about/modal/UseAboutModalPage.ts | 6 +- .../forgot-password/UseForgotPasswordPage.ts | 6 +- apps/web/src/pages/login/UseLoginPage.ts | 10 +- .../src/pages/not-found/UseNotFoundPage.ts | 4 +- apps/web/src/pages/sign-up/UseSignUpPage.ts | 6 +- apps/web/src/routeTree.gen.ts | 240 ++++++++ apps/web/src/routes/$.tsx | 11 + apps/web/src/routes/__root.tsx | 22 + apps/web/src/routes/_authenticated.tsx | 26 + apps/web/src/routes/_authenticated/index.tsx | 15 + .../web/src/routes/_authenticated/version.tsx | 17 + apps/web/src/routes/_public.tsx | 24 + apps/web/src/routes/_public/about.tsx | 32 + .../src/routes/_public/forgot-password.tsx | 11 + apps/web/src/routes/_public/login.tsx | 11 + apps/web/src/routes/_public/sign-up.tsx | 11 + apps/web/vite.config.ts | 10 +- package.json | 4 + pnpm-lock.yaml | 560 ++++++++++++++---- 31 files changed, 1019 insertions(+), 186 deletions(-) create mode 100644 apps/web/src/core/auth/AuthInitializer.tsx create mode 100644 apps/web/src/routeTree.gen.ts create mode 100644 apps/web/src/routes/$.tsx create mode 100644 apps/web/src/routes/__root.tsx create mode 100644 apps/web/src/routes/_authenticated.tsx create mode 100644 apps/web/src/routes/_authenticated/index.tsx create mode 100644 apps/web/src/routes/_authenticated/version.tsx create mode 100644 apps/web/src/routes/_public.tsx create mode 100644 apps/web/src/routes/_public/about.tsx create mode 100644 apps/web/src/routes/_public/forgot-password.tsx create mode 100644 apps/web/src/routes/_public/login.tsx create mode 100644 apps/web/src/routes/_public/sign-up.tsx diff --git a/.gitignore b/.gitignore index 09266fdb0..9da5954e5 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,6 @@ storybook-static/ *.njsproj *.sln *.sw? + +# Ai +.claude/ \ No newline at end of file diff --git a/apps/web/package.json b/apps/web/package.json index 0dae32b2d..6b9a2dc6e 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -28,6 +28,7 @@ "@package/ui": "workspace:*", "@tanstack/react-form": "1.23.7", "@tanstack/react-query": "5.83.0", + "@tanstack/react-router": "^1.103.2", "clsx": "2.1.1", "immer": "10.1.1", "jotai": "2.13.1", @@ -46,6 +47,7 @@ "@package/storybook": "workspace:*", "@storybook/react": "catalog:storybook", "@tailwindcss/vite": "catalog:tailwind", + "@tanstack/router-plugin": "^1.103.0", "@vitejs/plugin-basic-ssl": "catalog:vite", "@vitejs/plugin-react": "catalog:vite", "babel-plugin-react-compiler": "catalog:react19", diff --git a/apps/web/src/classes/app-session/UseAppSessionContent.ts b/apps/web/src/classes/app-session/UseAppSessionContent.ts index 124d28e9c..4bd96330b 100644 --- a/apps/web/src/classes/app-session/UseAppSessionContent.ts +++ b/apps/web/src/classes/app-session/UseAppSessionContent.ts @@ -1,10 +1,10 @@ import { useMemo } from "react"; import { useFetchPersonalProfileQuery } from "@package/api"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "@tanstack/react-router"; import type { IAppSessionContent } from "./IAppSessionContent"; import { useAuth } from "~/core/auth/UseAuth"; -export function useAppSessionContent(aboutRoute: string = "/about"): IAppSessionContent { +export function useAppSessionContent(aboutRoute: string = "/version"): IAppSessionContent { const navigate = useNavigate(); const { logout } = useAuth(); const { data: profileInfo } = useFetchPersonalProfileQuery(); @@ -30,7 +30,7 @@ export function useAppSessionContent(aboutRoute: string = "/about"): IAppSession } function handleOnAbout(): void { - navigate(aboutRoute); + navigate({ to: aboutRoute as "/version" }); } return { diff --git a/apps/web/src/classes/auth/AuthStatus.ts b/apps/web/src/classes/auth/AuthStatus.ts index d0eeb6741..d691d1a26 100644 --- a/apps/web/src/classes/auth/AuthStatus.ts +++ b/apps/web/src/classes/auth/AuthStatus.ts @@ -1 +1 @@ -export type AuthStatus = "idle" | "authenticating" | "authenticated"; +export type AuthStatus = "idle" | "authenticating" | "authenticated" | "unauthenticated"; diff --git a/apps/web/src/core/App.tsx b/apps/web/src/core/App.tsx index 3ec5c47fb..07665393d 100644 --- a/apps/web/src/core/App.tsx +++ b/apps/web/src/core/App.tsx @@ -2,6 +2,7 @@ import { type ReactElement, useEffect } from "react"; import { AppProviders } from "./AppProviders"; import { AppTheme } from "./AppTheme"; import { AppRoutes } from "./routes/AppRoutes"; +import { RouteLoading } from "./routes/logic/RouteLoading"; export function App(): ReactElement { function handlePreloadError(): void { @@ -18,10 +19,12 @@ export function App(): ReactElement { }, []); return ( - - - - + }> + {() => ( + + + + )} ); } diff --git a/apps/web/src/core/AppProviders.tsx b/apps/web/src/core/AppProviders.tsx index 2a4d69c40..adef27e8d 100644 --- a/apps/web/src/core/AppProviders.tsx +++ b/apps/web/src/core/AppProviders.tsx @@ -1,19 +1,21 @@ -import type { ReactElement } from "react"; +import type { ReactElement, ReactNode } from "react"; import { HeroUIProvider } from "@heroui/react"; import { ToastProvider } from "@heroui/toast"; import { validateCrypto } from "@package/react"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { AppLocales } from "./AppLocales"; +import { AuthInitializer } from "./auth/AuthInitializer"; import { AuthProvider } from "./auth/AuthProvider"; import { PwaProviderModule } from "~/components/modules/pwa-provider-module/PwaProviderModule"; const queryClient = new QueryClient(); export interface AppProvidersProps { - children: ReactElement; + children: (authStatus: "authenticated" | "unauthenticated") => ReactNode; + loadingFallback?: ReactNode; } -export function AppProviders({ children }: AppProvidersProps): ReactElement { +export function AppProviders({ children, loadingFallback }: AppProvidersProps): ReactElement { // eslint-disable-next-line @typescript-eslint/no-unused-expressions typeof window !== "undefined" && validateCrypto(); return ( @@ -22,7 +24,9 @@ export function AppProviders({ children }: AppProvidersProps): ReactElement { - {children} + + {(authStatus) => {children(authStatus)}} + diff --git a/apps/web/src/core/auth/AuthInitializer.tsx b/apps/web/src/core/auth/AuthInitializer.tsx new file mode 100644 index 000000000..93c90b1b2 --- /dev/null +++ b/apps/web/src/core/auth/AuthInitializer.tsx @@ -0,0 +1,40 @@ +import type { ReactElement, ReactNode } from "react"; +import { useState, useEffect } from "react"; +import { usePostRefreshTokenMutate } from "@package/api"; + +export interface AuthInitializerProps { + children: (authStatus: "authenticated" | "unauthenticated") => ReactNode; + fallback?: ReactNode; +} + +/** + * Component that initializes authentication by attempting to refresh the token. + * Only renders children once auth status has been determined. + */ +export function AuthInitializer({ children, fallback = null }: AuthInitializerProps): ReactElement { + const [authStatus, setAuthStatus] = useState<"authenticated" | "unauthenticated" | null>(null); + const { mutateAsync: refreshToken } = usePostRefreshTokenMutate(); + + useEffect(() => { + async function initializeAuth(): Promise { + try { + // Attempt to refresh token on app load to check if user is logged in + await refreshToken(); + setAuthStatus("authenticated"); + } catch { + // If refresh fails, user is not authenticated + setAuthStatus("unauthenticated"); + } + } + + void initializeAuth(); + }, [refreshToken]); + + // Show fallback while determining auth status + if (authStatus === null) { + return <>{fallback}; + } + + // Once auth status is determined, render children with the status + return <>{children(authStatus)}; +} diff --git a/apps/web/src/core/auth/AuthProvider.tsx b/apps/web/src/core/auth/AuthProvider.tsx index 2fb3fdcfa..1bc0ed673 100644 --- a/apps/web/src/core/auth/AuthProvider.tsx +++ b/apps/web/src/core/auth/AuthProvider.tsx @@ -1,33 +1,22 @@ import type { ReactNode, ReactElement } from "react"; import { useReducer } from "react"; -import { usePostRefreshTokenMutate } from "@package/api"; -import { useRunOnce } from "@package/react"; import { AuthContext } from "./AuthContext"; import { AuthReducer } from "./AuthReducer"; import type { AuthState } from "~/classes/auth/AuthState"; export interface AuthProviderProps { children: ReactNode; + initialAuthStatus?: AuthState["status"]; } const initialState: AuthState = { status: "idle", }; -export function AuthProvider({ children }: AuthProviderProps): ReactElement { - const [state, dispatch] = useReducer(AuthReducer, initialState); - const { mutateAsync: refreshToken } = usePostRefreshTokenMutate(); - - useRunOnce({ - func: async () => { - try { - // Run once on app load to check if the user is logged in - await refreshToken(); - dispatch({ type: "auth/login" }); - } catch { - dispatch({ type: "auth/logout" }); - } - }, +export function AuthProvider({ children, initialAuthStatus = "idle" }: AuthProviderProps): ReactElement { + const [state, dispatch] = useReducer(AuthReducer, { + ...initialState, + status: initialAuthStatus, }); return ( diff --git a/apps/web/src/core/auth/AuthReducer.tsx b/apps/web/src/core/auth/AuthReducer.tsx index 53b6f9802..925a65f4c 100644 --- a/apps/web/src/core/auth/AuthReducer.tsx +++ b/apps/web/src/core/auth/AuthReducer.tsx @@ -2,7 +2,11 @@ import { produce } from "immer"; import type { AuthState } from "~/classes/auth/AuthState"; import type { AuthStatus } from "~/classes/auth/AuthStatus"; -type AuthActions = { type: "auth/loading" } | { type: "auth/login" } | { type: "auth/logout" }; +type AuthActions = + | { type: "auth/loading" } + | { type: "auth/login" } + | { type: "auth/logout" } + | { type: "auth/initialized"; authenticated: boolean }; export interface AuthReducerProps extends AuthState {} @@ -11,13 +15,16 @@ export function AuthReducer(baseState: AuthReducerProps, action: AuthActions): A return produce(baseState, (draft) => { switch (type) { case "auth/loading": - draft.status = "idle"; + draft.status = "authenticating"; break; case "auth/login": draft.status = "authenticated"; break; case "auth/logout": - draft.status = "authenticating"; + draft.status = "unauthenticated"; + break; + case "auth/initialized": + draft.status = action.authenticated ? "authenticated" : "unauthenticated"; break; } }); diff --git a/apps/web/src/core/auth/UseAuth.ts b/apps/web/src/core/auth/UseAuth.ts index 28f59e7de..112a9159b 100644 --- a/apps/web/src/core/auth/UseAuth.ts +++ b/apps/web/src/core/auth/UseAuth.ts @@ -1,6 +1,7 @@ import { useContext } from "react"; import type { LoginData } from "@package/api"; import { usePostLoginMutate, usePostLogoutMutate } from "@package/api"; +import { useNavigate, useRouter } from "@tanstack/react-router"; import { AuthContext } from "./AuthContext"; import type { AuthStatus } from "./AuthReducer"; @@ -11,6 +12,8 @@ export function useAuth(): { loginLoading: boolean; logoutLoading: boolean; } { + const router = useRouter(); + const navigate = useNavigate(); const { state: { status }, dispatch, @@ -30,6 +33,9 @@ export function useAuth(): { dispatch({ type: "auth/logout", }); + router.invalidate().finally(() => { + navigate({ to: "/" }); + }); } return { diff --git a/apps/web/src/core/routes/AppRoutes.tsx b/apps/web/src/core/routes/AppRoutes.tsx index 52e96167b..53e8edf32 100644 --- a/apps/web/src/core/routes/AppRoutes.tsx +++ b/apps/web/src/core/routes/AppRoutes.tsx @@ -1,33 +1,38 @@ import type { ReactElement } from "react"; +import type { QueryClient } from "@tanstack/react-query"; import { useQueryClient } from "@tanstack/react-query"; -import { RouterProvider, Route, createHashRouter, createRoutesFromElements, Outlet } from "react-router-dom"; -import { PrivateRouteLogic } from "./logic/PrivateRouteLogic"; -import { PublicRouteLogic } from "./logic/PublicRouteLogic"; -import { PrivateRoutes } from "./PrivateRoutes"; -import { PublicRoutes } from "./PublicRoutes"; +import { RouterProvider, createHashHistory, createRouter } from "@tanstack/react-router"; +import { routeTree } from "../../routeTree.gen"; +import { useAuth } from "../auth/UseAuth"; +import type { AuthStatus } from "~/classes/auth/AuthStatus"; + +export interface RouterContext { + queryClient: QueryClient; + authStatus: AuthStatus; +} + +const hashHistory = createHashHistory(); + +const router = createRouter({ + routeTree, + history: hashHistory, + context: { + queryClient: undefined!, + authStatus: undefined!, + }, + defaultPreload: "intent", + defaultPreloadStaleTime: 0, +}); + +declare module "@tanstack/react-router" { + interface Register { + router: typeof router; + } +} export function AppRoutes(): ReactElement { const queryClient = useQueryClient(); + const { status } = useAuth(); - return ( - }> - }> - {PublicRoutes(queryClient).map((route) => ( - - ))} - - }> - {PrivateRoutes(queryClient).map((route) => ( - - ))} - - import("../../pages/not-found/NotFoundRoute")} /> - - ) - )} - /> - ); + return ; } diff --git a/apps/web/src/pages/about/UseAboutPage.ts b/apps/web/src/pages/about/UseAboutPage.ts index 044b8649d..10c81ba82 100644 --- a/apps/web/src/pages/about/UseAboutPage.ts +++ b/apps/web/src/pages/about/UseAboutPage.ts @@ -1,13 +1,13 @@ -import { useNavigate } from "react-router-dom"; +import { useRouter } from "@tanstack/react-router"; import type { AboutViewProps } from "~/components/views/about/AboutView"; import { useAppInfo } from "~/core/config/UseAppInfo"; export function useAboutPage(serverVersion: string): AboutViewProps { const { appName } = useAppInfo(); - const navigate = useNavigate(); + const router = useRouter(); function handleOnBack(): void { - navigate(-1); + router.history.back(); } return { appVersion: import.meta.env.VITE_APP_VERSION, serverVersion, appName, onBack: handleOnBack }; diff --git a/apps/web/src/pages/about/modal/UseAboutModalPage.ts b/apps/web/src/pages/about/modal/UseAboutModalPage.ts index cb2689724..8e47e8eaa 100644 --- a/apps/web/src/pages/about/modal/UseAboutModalPage.ts +++ b/apps/web/src/pages/about/modal/UseAboutModalPage.ts @@ -1,13 +1,13 @@ -import { useNavigate } from "react-router-dom"; +import { useRouter } from "@tanstack/react-router"; import { useAboutPage } from "../UseAboutPage"; import type { AboutModalProps } from "~/components/feedback/about-modal/AboutModal"; export function useAboutModalPage(serverVersion: string): AboutModalProps { - const navigate = useNavigate(); + const router = useRouter(); const aboutProps = useAboutPage(serverVersion); function handleOnClose(): void { - navigate(-1); + router.history.back(); } return { diff --git a/apps/web/src/pages/forgot-password/UseForgotPasswordPage.ts b/apps/web/src/pages/forgot-password/UseForgotPasswordPage.ts index c9e1cb86d..2c289ffa5 100644 --- a/apps/web/src/pages/forgot-password/UseForgotPasswordPage.ts +++ b/apps/web/src/pages/forgot-password/UseForgotPasswordPage.ts @@ -1,7 +1,7 @@ import { addToast } from "@heroui/react"; import { usePostForgotPasswordMutate } from "@package/api"; +import { useNavigate } from "@tanstack/react-router"; import { useIntl } from "react-intl"; -import { useNavigate } from "react-router-dom"; import type { FormForgotPassword } from "~/components/forms/forgot-password/ForgotPasswordForm"; import type { ForgotPasswordViewProps } from "~/components/views/forgot-password/ForgotPasswordView"; import { useAppInfo } from "~/core/config/UseAppInfo"; @@ -14,7 +14,7 @@ export function useForgotPasswordPage(): ForgotPasswordViewProps { function handleOnBack(): void { console.log("handleBack"); - navigate("/login"); + navigate({ to: "/login" }); } async function handleOnSubmit(data: FormForgotPassword): Promise { @@ -22,7 +22,7 @@ export function useForgotPasswordPage(): ForgotPasswordViewProps { try { await submit(email); - navigate("/"); + navigate({ to: "/" }); } catch { addToast({ title: intl.formatMessage({ diff --git a/apps/web/src/pages/login/UseLoginPage.ts b/apps/web/src/pages/login/UseLoginPage.ts index d6cfc2e80..4921720c8 100644 --- a/apps/web/src/pages/login/UseLoginPage.ts +++ b/apps/web/src/pages/login/UseLoginPage.ts @@ -1,6 +1,6 @@ import { useState } from "react"; +import { useNavigate } from "@tanstack/react-router"; import { useIntl } from "react-intl"; -import { useNavigate } from "react-router-dom"; import type { LoginViewProps } from "../../components/views/login/LoginView"; import type { FormLogin } from "~/components/forms/login/LoginForm"; import { useAuth } from "~/core/auth/UseAuth"; @@ -22,7 +22,7 @@ export function useLoginPage(): LoginViewProps { password: data.password, rememberMe: data.remember, }); - navigate("/"); + navigate({ to: "/" }); } catch { setLoginError( intl.formatMessage({ @@ -35,15 +35,15 @@ export function useLoginPage(): LoginViewProps { } function handleOnAbout(): void { - navigate("/about"); + navigate({ to: "/about" }); } function handleForgotPassword(): void { - navigate("/forgot-password", { state: { something: "Incoming!" } }); + navigate({ to: "/forgot-password" }); } function handleSignUp(): void { - navigate("/sign-up"); + navigate({ to: "/sign-up" }); } return { diff --git a/apps/web/src/pages/not-found/UseNotFoundPage.ts b/apps/web/src/pages/not-found/UseNotFoundPage.ts index f98beaa2c..1d52920fd 100644 --- a/apps/web/src/pages/not-found/UseNotFoundPage.ts +++ b/apps/web/src/pages/not-found/UseNotFoundPage.ts @@ -1,4 +1,4 @@ -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "@tanstack/react-router"; export function useNotFoundPage(): { handleClick: () => void; @@ -6,7 +6,7 @@ export function useNotFoundPage(): { const navigate = useNavigate(); function handleClick(): void { - navigate("/login"); + navigate({ to: "/login" }); } return { diff --git a/apps/web/src/pages/sign-up/UseSignUpPage.ts b/apps/web/src/pages/sign-up/UseSignUpPage.ts index 1c56e71b8..4d59261b9 100644 --- a/apps/web/src/pages/sign-up/UseSignUpPage.ts +++ b/apps/web/src/pages/sign-up/UseSignUpPage.ts @@ -1,7 +1,7 @@ import { addToast } from "@heroui/react"; import { usePostSelfRegister } from "@package/api"; +import { useNavigate } from "@tanstack/react-router"; import { useIntl } from "react-intl"; -import { useNavigate } from "react-router-dom"; import type { FormSignUp } from "~/components/forms/sign-up/SignUpForm"; import type { SignUpViewProps } from "~/components/views/sign-up/SignUpView"; import { useAppInfo } from "~/core/config/UseAppInfo"; @@ -13,13 +13,13 @@ export function useSignUpPage(): SignUpViewProps { const { isPending, mutateAsync: submit } = usePostSelfRegister(); function handleOnBack(): void { - navigate("/login"); + navigate({ to: "/login" }); } async function handleOnSubmit(data: FormSignUp): Promise { try { await submit(data); - navigate("/"); + navigate({ to: "/" }); } catch { addToast({ title: intl.formatMessage({ diff --git a/apps/web/src/routeTree.gen.ts b/apps/web/src/routeTree.gen.ts new file mode 100644 index 000000000..fddb7a3da --- /dev/null +++ b/apps/web/src/routeTree.gen.ts @@ -0,0 +1,240 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from './routes/__root' +import { Route as PublicRouteImport } from './routes/_public' +import { Route as AuthenticatedRouteImport } from './routes/_authenticated' +import { Route as SplatRouteImport } from './routes/$' +import { Route as AuthenticatedIndexRouteImport } from './routes/_authenticated/index' +import { Route as PublicSignUpRouteImport } from './routes/_public/sign-up' +import { Route as PublicLoginRouteImport } from './routes/_public/login' +import { Route as PublicForgotPasswordRouteImport } from './routes/_public/forgot-password' +import { Route as PublicAboutRouteImport } from './routes/_public/about' +import { Route as AuthenticatedVersionRouteImport } from './routes/_authenticated/version' + +const PublicRoute = PublicRouteImport.update({ + id: '/_public', + getParentRoute: () => rootRouteImport, +} as any) +const AuthenticatedRoute = AuthenticatedRouteImport.update({ + id: '/_authenticated', + getParentRoute: () => rootRouteImport, +} as any) +const SplatRoute = SplatRouteImport.update({ + id: '/$', + path: '/$', + getParentRoute: () => rootRouteImport, +} as any) +const AuthenticatedIndexRoute = AuthenticatedIndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => AuthenticatedRoute, +} as any) +const PublicSignUpRoute = PublicSignUpRouteImport.update({ + id: '/sign-up', + path: '/sign-up', + getParentRoute: () => PublicRoute, +} as any) +const PublicLoginRoute = PublicLoginRouteImport.update({ + id: '/login', + path: '/login', + getParentRoute: () => PublicRoute, +} as any) +const PublicForgotPasswordRoute = PublicForgotPasswordRouteImport.update({ + id: '/forgot-password', + path: '/forgot-password', + getParentRoute: () => PublicRoute, +} as any) +const PublicAboutRoute = PublicAboutRouteImport.update({ + id: '/about', + path: '/about', + getParentRoute: () => PublicRoute, +} as any) +const AuthenticatedVersionRoute = AuthenticatedVersionRouteImport.update({ + id: '/version', + path: '/version', + getParentRoute: () => AuthenticatedRoute, +} as any) + +export interface FileRoutesByFullPath { + '/$': typeof SplatRoute + '/version': typeof AuthenticatedVersionRoute + '/about': typeof PublicAboutRoute + '/forgot-password': typeof PublicForgotPasswordRoute + '/login': typeof PublicLoginRoute + '/sign-up': typeof PublicSignUpRoute + '/': typeof AuthenticatedIndexRoute +} +export interface FileRoutesByTo { + '/$': typeof SplatRoute + '/version': typeof AuthenticatedVersionRoute + '/about': typeof PublicAboutRoute + '/forgot-password': typeof PublicForgotPasswordRoute + '/login': typeof PublicLoginRoute + '/sign-up': typeof PublicSignUpRoute + '/': typeof AuthenticatedIndexRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/$': typeof SplatRoute + '/_authenticated': typeof AuthenticatedRouteWithChildren + '/_public': typeof PublicRouteWithChildren + '/_authenticated/version': typeof AuthenticatedVersionRoute + '/_public/about': typeof PublicAboutRoute + '/_public/forgot-password': typeof PublicForgotPasswordRoute + '/_public/login': typeof PublicLoginRoute + '/_public/sign-up': typeof PublicSignUpRoute + '/_authenticated/': typeof AuthenticatedIndexRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/$' + | '/version' + | '/about' + | '/forgot-password' + | '/login' + | '/sign-up' + | '/' + fileRoutesByTo: FileRoutesByTo + to: + | '/$' + | '/version' + | '/about' + | '/forgot-password' + | '/login' + | '/sign-up' + | '/' + id: + | '__root__' + | '/$' + | '/_authenticated' + | '/_public' + | '/_authenticated/version' + | '/_public/about' + | '/_public/forgot-password' + | '/_public/login' + | '/_public/sign-up' + | '/_authenticated/' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + SplatRoute: typeof SplatRoute + AuthenticatedRoute: typeof AuthenticatedRouteWithChildren + PublicRoute: typeof PublicRouteWithChildren +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/_public': { + id: '/_public' + path: '' + fullPath: '' + preLoaderRoute: typeof PublicRouteImport + parentRoute: typeof rootRouteImport + } + '/_authenticated': { + id: '/_authenticated' + path: '' + fullPath: '' + preLoaderRoute: typeof AuthenticatedRouteImport + parentRoute: typeof rootRouteImport + } + '/$': { + id: '/$' + path: '/$' + fullPath: '/$' + preLoaderRoute: typeof SplatRouteImport + parentRoute: typeof rootRouteImport + } + '/_authenticated/': { + id: '/_authenticated/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof AuthenticatedIndexRouteImport + parentRoute: typeof AuthenticatedRoute + } + '/_public/sign-up': { + id: '/_public/sign-up' + path: '/sign-up' + fullPath: '/sign-up' + preLoaderRoute: typeof PublicSignUpRouteImport + parentRoute: typeof PublicRoute + } + '/_public/login': { + id: '/_public/login' + path: '/login' + fullPath: '/login' + preLoaderRoute: typeof PublicLoginRouteImport + parentRoute: typeof PublicRoute + } + '/_public/forgot-password': { + id: '/_public/forgot-password' + path: '/forgot-password' + fullPath: '/forgot-password' + preLoaderRoute: typeof PublicForgotPasswordRouteImport + parentRoute: typeof PublicRoute + } + '/_public/about': { + id: '/_public/about' + path: '/about' + fullPath: '/about' + preLoaderRoute: typeof PublicAboutRouteImport + parentRoute: typeof PublicRoute + } + '/_authenticated/version': { + id: '/_authenticated/version' + path: '/version' + fullPath: '/version' + preLoaderRoute: typeof AuthenticatedVersionRouteImport + parentRoute: typeof AuthenticatedRoute + } + } +} + +interface AuthenticatedRouteChildren { + AuthenticatedVersionRoute: typeof AuthenticatedVersionRoute + AuthenticatedIndexRoute: typeof AuthenticatedIndexRoute +} + +const AuthenticatedRouteChildren: AuthenticatedRouteChildren = { + AuthenticatedVersionRoute: AuthenticatedVersionRoute, + AuthenticatedIndexRoute: AuthenticatedIndexRoute, +} + +const AuthenticatedRouteWithChildren = AuthenticatedRoute._addFileChildren( + AuthenticatedRouteChildren, +) + +interface PublicRouteChildren { + PublicAboutRoute: typeof PublicAboutRoute + PublicForgotPasswordRoute: typeof PublicForgotPasswordRoute + PublicLoginRoute: typeof PublicLoginRoute + PublicSignUpRoute: typeof PublicSignUpRoute +} + +const PublicRouteChildren: PublicRouteChildren = { + PublicAboutRoute: PublicAboutRoute, + PublicForgotPasswordRoute: PublicForgotPasswordRoute, + PublicLoginRoute: PublicLoginRoute, + PublicSignUpRoute: PublicSignUpRoute, +} + +const PublicRouteWithChildren = + PublicRoute._addFileChildren(PublicRouteChildren) + +const rootRouteChildren: RootRouteChildren = { + SplatRoute: SplatRoute, + AuthenticatedRoute: AuthenticatedRouteWithChildren, + PublicRoute: PublicRouteWithChildren, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() diff --git a/apps/web/src/routes/$.tsx b/apps/web/src/routes/$.tsx new file mode 100644 index 000000000..23ac3b649 --- /dev/null +++ b/apps/web/src/routes/$.tsx @@ -0,0 +1,11 @@ +import type { ReactElement } from "react"; +import { createFileRoute } from "@tanstack/react-router"; +import { NotFoundPage } from "~/pages/not-found/NotFoundPage"; + +export const Route = createFileRoute("/$")({ + component: NotFoundPageRoute, +}); + +function NotFoundPageRoute(): ReactElement { + return ; +} diff --git a/apps/web/src/routes/__root.tsx b/apps/web/src/routes/__root.tsx new file mode 100644 index 000000000..a0b2e5ec1 --- /dev/null +++ b/apps/web/src/routes/__root.tsx @@ -0,0 +1,22 @@ +import type { ReactElement } from "react"; +import type { QueryClient } from "@tanstack/react-query"; +import { Outlet, createRootRouteWithContext } from "@tanstack/react-router"; +import type { AuthStatus } from "~/classes/auth/AuthStatus"; +import { RouteProviders } from "~/core/routes/RouteProviders"; + +export interface RouterContext { + queryClient: QueryClient; + authStatus: AuthStatus; +} + +export const Route = createRootRouteWithContext()({ + component: RootComponent, +}); + +function RootComponent(): ReactElement { + return ( + + + + ); +} diff --git a/apps/web/src/routes/_authenticated.tsx b/apps/web/src/routes/_authenticated.tsx new file mode 100644 index 000000000..e07d53ef2 --- /dev/null +++ b/apps/web/src/routes/_authenticated.tsx @@ -0,0 +1,26 @@ +import type { ReactElement } from "react"; +import { Suspense } from "react"; +import { Outlet, createFileRoute, redirect } from "@tanstack/react-router"; +import { RouteLoading } from "~/core/routes/logic/RouteLoading"; + +export const Route = createFileRoute("/_authenticated")({ + beforeLoad: async ({ context }) => { + const { authStatus } = context; + + // Redirect to login if user is not authenticated + if (authStatus === "unauthenticated" || authStatus === "authenticating") { + throw redirect({ + to: "/login", + }); + } + }, + component: AuthenticatedLayout, +}); + +function AuthenticatedLayout(): ReactElement { + return ( + }> + + + ); +} diff --git a/apps/web/src/routes/_authenticated/index.tsx b/apps/web/src/routes/_authenticated/index.tsx new file mode 100644 index 000000000..2980d49e8 --- /dev/null +++ b/apps/web/src/routes/_authenticated/index.tsx @@ -0,0 +1,15 @@ +import type { ReactElement } from "react"; +import { createFileRoute } from "@tanstack/react-router"; +import { loader } from "~/pages/home/HomeLoader"; +import { HomePage, type HomePageProps } from "~/pages/home/HomePage"; + +export const Route = createFileRoute("/_authenticated/")({ + loader: (): HomePageProps => loader(), + component: HomePageRoute, + errorComponent: ({ error }) =>
Error loading home page: {error.message}
, +}); + +function HomePageRoute(): ReactElement { + const data = Route.useLoaderData(); + return ; +} diff --git a/apps/web/src/routes/_authenticated/version.tsx b/apps/web/src/routes/_authenticated/version.tsx new file mode 100644 index 000000000..197b81444 --- /dev/null +++ b/apps/web/src/routes/_authenticated/version.tsx @@ -0,0 +1,17 @@ +import type { ReactElement } from "react"; +import { createFileRoute } from "@tanstack/react-router"; +import { loader } from "~/pages/about/AboutLoader"; +import { AboutModalPage } from "~/pages/about/modal/AboutModalPage"; + +export const Route = createFileRoute("/_authenticated/version")({ + loader: async ({ context }) => { + const { queryClient } = context; + return loader(queryClient); + }, + component: VersionModalRoute, +}); + +function VersionModalRoute(): ReactElement { + const data = Route.useLoaderData(); + return ; +} diff --git a/apps/web/src/routes/_public.tsx b/apps/web/src/routes/_public.tsx new file mode 100644 index 000000000..fdc5eb9ee --- /dev/null +++ b/apps/web/src/routes/_public.tsx @@ -0,0 +1,24 @@ +import type { ReactElement } from "react"; +import { Suspense } from "react"; +import { Outlet, createFileRoute, redirect } from "@tanstack/react-router"; +import { RouteLoading } from "~/core/routes/logic/RouteLoading"; + +export const Route = createFileRoute("/_public")({ + beforeLoad: ({ context }) => { + const { authStatus } = context; + if (authStatus === "authenticated") { + throw redirect({ + to: "/", + }); + } + }, + component: PublicLayout, +}); + +function PublicLayout(): ReactElement { + return ( + }> + + + ); +} diff --git a/apps/web/src/routes/_public/about.tsx b/apps/web/src/routes/_public/about.tsx new file mode 100644 index 000000000..1467a4613 --- /dev/null +++ b/apps/web/src/routes/_public/about.tsx @@ -0,0 +1,32 @@ +import type { ReactElement } from "react"; +import { createFileRoute } from "@tanstack/react-router"; +import { useIntl } from "react-intl"; +import { loader } from "~/pages/about/AboutLoader"; +import { AboutPage } from "~/pages/about/AboutPage"; + +export const Route = createFileRoute("/_public/about")({ + loader: async ({ context }) => { + const { queryClient } = context; + return loader(queryClient); + }, + component: AboutPageRoute, + errorComponent: AboutPageError, +}); + +function AboutPageRoute(): ReactElement { + const data = Route.useLoaderData(); + return ; +} + +function AboutPageError(): ReactElement { + const intl = useIntl(); + return ( + + ); +} diff --git a/apps/web/src/routes/_public/forgot-password.tsx b/apps/web/src/routes/_public/forgot-password.tsx new file mode 100644 index 000000000..e45947021 --- /dev/null +++ b/apps/web/src/routes/_public/forgot-password.tsx @@ -0,0 +1,11 @@ +import type { ReactElement } from "react"; +import { createFileRoute } from "@tanstack/react-router"; +import { ForgotPasswordPage } from "~/pages/forgot-password/ForgotPasswordPage"; + +export const Route = createFileRoute("/_public/forgot-password")({ + component: ForgotPasswordPageRoute, +}); + +function ForgotPasswordPageRoute(): ReactElement { + return ; +} diff --git a/apps/web/src/routes/_public/login.tsx b/apps/web/src/routes/_public/login.tsx new file mode 100644 index 000000000..3dbe079bc --- /dev/null +++ b/apps/web/src/routes/_public/login.tsx @@ -0,0 +1,11 @@ +import type { ReactElement } from "react"; +import { createFileRoute } from "@tanstack/react-router"; +import { LoginPage } from "~/pages/login/LoginPage"; + +export const Route = createFileRoute("/_public/login")({ + component: LoginPageRoute, +}); + +function LoginPageRoute(): ReactElement { + return ; +} diff --git a/apps/web/src/routes/_public/sign-up.tsx b/apps/web/src/routes/_public/sign-up.tsx new file mode 100644 index 000000000..d28aba2a7 --- /dev/null +++ b/apps/web/src/routes/_public/sign-up.tsx @@ -0,0 +1,11 @@ +import type { ReactElement } from "react"; +import { createFileRoute } from "@tanstack/react-router"; +import { SignUpPage } from "~/pages/sign-up/SignUpPage"; + +export const Route = createFileRoute("/_public/sign-up")({ + component: SignUpPageRoute, +}); + +function SignUpPageRoute(): ReactElement { + return ; +} diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index 893778e34..2d065f519 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -1,3 +1,4 @@ +import { TanStackRouterVite } from "@tanstack/router-plugin/vite"; import { createBaseConfig, createPWAConfig, createReactConfig, mergeConfigs } from "@config/vite"; import basicSsl from "@vitejs/plugin-basic-ssl"; import { defineConfig, loadEnv, mergeConfig } from "vite"; @@ -6,7 +7,14 @@ import proxy from "vite-plugin-http2-proxy"; // https://vitejs.dev/config/ export default defineConfig(({ mode, command }) => { const env = loadEnv(mode, process.cwd(), ""); - const config = mergeConfigs([createBaseConfig(), createReactConfig(), createPWAConfig()]); + const config = mergeConfigs([ + createBaseConfig(), + createReactConfig(), + createPWAConfig(), + { + plugins: [TanStackRouterVite()], + }, + ]); switch (command) { case "build": diff --git a/package.json b/package.json index 4df47c206..e9a5992d1 100644 --- a/package.json +++ b/package.json @@ -59,5 +59,9 @@ "*.ts": "prettier --write", "*.tsx": "prettier --write", "*.scss": "prettier --write" + }, + "dependencies": { + "@tanstack/react-router": "^1.132.47", + "@tanstack/router-plugin": "^1.132.51" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f9d85334d..bc9b38481 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -180,6 +180,13 @@ catalogs: importers: .: + dependencies: + '@tanstack/react-router': + specifier: ^1.132.47 + version: 1.133.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-plugin': + specifier: ^1.132.51 + version: 1.133.22(@tanstack/react-router@1.133.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) devDependencies: '@commitlint/cli': specifier: 20.1.0 @@ -216,7 +223,7 @@ importers: version: 1.6.1 tsup: specifier: 8.5.0 - version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1) + version: 8.5.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) turbo: specifier: 2.5.8 version: 2.5.8 @@ -295,52 +302,52 @@ importers: version: link:../../packages/storybook '@storybook/addon-a11y': specifier: catalog:storybook - version: 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))) + version: 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))) '@storybook/addon-docs': specifier: catalog:storybook - version: 9.1.13(@types/react@19.2.2)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))) + version: 9.1.13(@types/react@19.2.2)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))) '@storybook/addon-themes': specifier: catalog:storybook - version: 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))) + version: 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))) '@storybook/addon-vitest': specifier: catalog:storybook - version: 9.1.13(@vitest/browser@3.2.4)(@vitest/runner@3.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(vitest@3.2.4) + version: 9.1.13(@vitest/browser@3.2.4)(@vitest/runner@3.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(vitest@3.2.4) '@storybook/builder-vite': specifier: catalog:storybook - version: 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) '@storybook/react': specifier: catalog:storybook - version: 9.1.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.9.3) + version: 9.1.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.9.3) '@storybook/react-vite': specifier: catalog:storybook - version: 9.1.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.44.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.9.3)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 9.1.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.44.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.9.3)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) '@tailwindcss/vite': specifier: catalog:tailwind - version: 4.1.14(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 4.1.14(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitejs/plugin-react': specifier: catalog:vite - version: 4.7.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/browser': specifier: catalog:vitest - version: 3.2.4(playwright@1.56.1)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4) + version: 3.2.4(playwright@1.56.1)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) '@vitest/coverage-v8': specifier: catalog:vitest version: 3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4) storybook: specifier: catalog:storybook - version: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) tailwindcss: specifier: catalog:tailwind version: 4.1.14 vite: specifier: catalog:vite - version: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) vite-tsconfig-paths: specifier: catalog:vite - version: 5.1.4(typescript@5.9.3)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: catalog:vitest - version: 3.2.4(@types/node@22.18.10)(@vitest/browser@3.2.4)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 3.2.4(@types/node@22.18.10)(@vitest/browser@3.2.4)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) apps/web: dependencies: @@ -371,6 +378,9 @@ importers: '@tanstack/react-query': specifier: 5.83.0 version: 5.83.0(react@19.2.0) + '@tanstack/react-router': + specifier: ^1.103.2 + version: 1.133.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) clsx: specifier: 2.1.1 version: 2.1.1 @@ -416,22 +426,25 @@ importers: version: link:../../packages/storybook '@storybook/react': specifier: catalog:storybook - version: 9.1.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.9.3) + version: 9.1.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.9.3) '@tailwindcss/vite': specifier: catalog:tailwind - version: 4.1.14(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 4.1.14(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/router-plugin': + specifier: ^1.103.0 + version: 1.133.22(@tanstack/react-router@1.133.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitejs/plugin-basic-ssl': specifier: catalog:vite - version: 2.1.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 2.1.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitejs/plugin-react': specifier: catalog:vite - version: 4.7.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) babel-plugin-react-compiler: specifier: catalog:react19 version: 19.1.0-rc.3 storybook: specifier: catalog:storybook - version: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) tailwindcss: specifier: catalog:tailwind version: 4.1.14 @@ -443,19 +456,19 @@ importers: version: 3.1.1(react@19.2.0) vite: specifier: catalog:vite - version: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) vite-plugin-http2-proxy: specifier: catalog:vite - version: 0.5.1(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 0.5.1(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) vite-plugin-pwa: specifier: catalog:vite - version: 1.1.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) + version: 1.1.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) vite-tsconfig-paths: specifier: catalog:vite - version: 5.1.4(typescript@5.9.3)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: catalog:vitest - version: 3.2.4(@types/node@22.18.10)(@vitest/browser@3.2.4)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 3.2.4(@types/node@22.18.10)(@vitest/browser@3.2.4)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) workbox-window: specifier: 7.3.0 version: 7.3.0 @@ -497,7 +510,7 @@ importers: version: 7.0.0(eslint@9.38.0(jiti@2.6.1)) eslint-plugin-storybook: specifier: catalog:eslint - version: 9.1.13(eslint@9.38.0(jiti@2.6.1))(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.9.3) + version: 9.1.13(eslint@9.38.0(jiti@2.6.1))(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.9.3) typescript-eslint: specifier: catalog:eslint version: 8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) @@ -532,22 +545,22 @@ importers: dependencies: '@tailwindcss/vite': specifier: catalog:tailwind - version: 4.1.14(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 4.1.14(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitejs/plugin-react': specifier: catalog:vite - version: 4.7.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) vite: specifier: catalog:vite - version: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) vite-plugin-http2-proxy: specifier: catalog:vite - version: 0.5.1(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 0.5.1(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) vite-plugin-pwa: specifier: catalog:vite - version: 1.1.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) + version: 1.1.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) vite-tsconfig-paths: specifier: catalog:vite - version: 5.1.4(typescript@5.9.3)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) devDependencies: '@config/barrelsby': specifier: workspace:* @@ -601,7 +614,7 @@ importers: version: 2.8.1 vite: specifier: catalog:vite - version: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) packages/mocks: devDependencies: @@ -662,7 +675,7 @@ importers: dependencies: '@storybook/react': specifier: catalog:storybook - version: 9.1.13(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.9.3) + version: 9.1.13(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.9.3) react: specifier: '>=19.0.0' version: 19.1.0 @@ -736,10 +749,10 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: catalog:vite - version: 4.7.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/browser': specifier: catalog:vitest - version: 3.2.4(playwright@1.56.1)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4) + version: 3.2.4(playwright@1.56.1)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) '@vitest/coverage-v8': specifier: catalog:vitest version: 3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4) @@ -751,13 +764,13 @@ importers: version: 4.1.14 vite: specifier: catalog:vite - version: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) vite-tsconfig-paths: specifier: catalog:vite - version: 5.1.4(typescript@5.9.3)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: catalog:vitest - version: 3.2.4(@types/node@22.18.10)(@vitest/browser@3.2.4)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + version: 3.2.4(@types/node@22.18.10)(@vitest/browser@3.2.4)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) packages: @@ -954,6 +967,18 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} @@ -1248,6 +1273,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.28.0': + resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-escapes@7.27.1': resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} engines: {node: '>=6.9.0'} @@ -1283,6 +1314,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + '@babel/preset-typescript@7.27.1': + resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/register@7.21.0': resolution: {integrity: sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw==} engines: {node: '>=6.9.0'} @@ -3254,6 +3291,10 @@ packages: '@tanstack/form-core@1.24.3': resolution: {integrity: sha512-e+HzSD49NWr4aIqJWtPPzmi+/phBJAP3nSPN8dvxwmJWqAxuB/cH138EcmCFf3+oA7j3BXvwvTY0I+8UweGPjQ==} + '@tanstack/history@1.133.19': + resolution: {integrity: sha512-Y866qBVVprdQkmO0/W1AFBI8tiQy398vFeIwP+VrRWCOzs3VecxSVzAvaOM4iHfkJz81fFAZMhLLjDVoPikD+w==} + engines: {node: '>=12'} + '@tanstack/query-core@5.83.0': resolution: {integrity: sha512-0M8dA+amXUkyz5cVUm/B+zSk3xkQAcuXuz5/Q/LveT4ots2rBpPTZOzd7yJa2Utsf8D2Upl5KyjhHRY+9lB/XA==} @@ -3271,6 +3312,13 @@ packages: peerDependencies: react: ^18 || ^19 + '@tanstack/react-router@1.133.22': + resolution: {integrity: sha512-0tg2yoXVMvvgR3UdOhEX9ICmgZ/Ou/I8VOl07exSYEJYfyCr5nhtB/62F9NGbuUZVrJnCzc8Rz0e4/MYU18pIg==} + engines: {node: '>=12'} + peerDependencies: + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' + '@tanstack/react-store@0.7.7': resolution: {integrity: sha512-qqT0ufegFRDGSof9D/VqaZgjNgp4tRPHZIJq2+QIHkMUtHjaJ0lYrrXjeIUJvjnTbgPfSD1XgOMEt0lmANn6Zg==} peerDependencies: @@ -3283,12 +3331,49 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@tanstack/router-core@1.133.20': + resolution: {integrity: sha512-cO8E6XA0vMX2BaPZck9kfgXK76e6Lqo13GmXEYxtXshmW8cIlgcLHhBDKnI/sCjIy9OPY2sV1qrGHtcxJy/4ew==} + engines: {node: '>=12'} + + '@tanstack/router-generator@1.133.20': + resolution: {integrity: sha512-63lhmNNoVfqTgnSx5MUnEl/QBKSN6hA1sWLhZSQhCjLp9lrWbCXM8l9QpG3Tgzq/LdX7jjDMf783sUL4p4NbYw==} + engines: {node: '>=12'} + + '@tanstack/router-plugin@1.133.22': + resolution: {integrity: sha512-VVUazrxqFyon9bFSFY2mysgTbQAH5BV8kP8Gq1IHd7AxlboRW9tnj6TQcy8KGgG/KPCbKB9CFZtvSheKqrAVQg==} + engines: {node: '>=12'} + peerDependencies: + '@rsbuild/core': '>=1.0.2' + '@tanstack/react-router': ^1.133.22 + vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' + vite-plugin-solid: ^2.11.10 + webpack: '>=5.92.0' + peerDependenciesMeta: + '@rsbuild/core': + optional: true + '@tanstack/react-router': + optional: true + vite: + optional: true + vite-plugin-solid: + optional: true + webpack: + optional: true + + '@tanstack/router-utils@1.133.19': + resolution: {integrity: sha512-WEp5D2gPxvlLDRXwD/fV7RXjYtqaqJNXKB/L6OyZEbT+9BG/Ib2d7oG9GSUZNNMGPGYAlhBUOi3xutySsk6rxA==} + engines: {node: '>=12'} + '@tanstack/store@0.7.7': resolution: {integrity: sha512-xa6pTan1bcaqYDS9BDpSiS63qa6EoDkPN9RsRaxHuDdVDNntzq3xNwR5YKTU/V3SkSyC9T4YVOPh2zRQN0nhIQ==} '@tanstack/virtual-core@3.11.3': resolution: {integrity: sha512-v2mrNSnMwnPJtcVqNvV0c5roGCBqeogN8jDtgtuHCphdwBasOZ17x8UV8qpHUh+u0MLfX43c0uUHKje0s+Zb0w==} + '@tanstack/virtual-file-routes@1.133.19': + resolution: {integrity: sha512-IKwZENsK7owmW1Lm5FhuHegY/SyQ8KqtL/7mTSnzoKJgfzhrrf9qwKB1rmkKkt+svUuy/Zw3uVEpZtUzQruWtA==} + engines: {node: '>=12'} + '@testing-library/dom@10.4.0': resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} @@ -3637,9 +3722,17 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -3734,6 +3827,9 @@ packages: resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} + babel-dead-code-elimination@1.0.10: + resolution: {integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==} + babel-plugin-polyfill-corejs2@0.4.13: resolution: {integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==} peerDependencies: @@ -3773,6 +3869,10 @@ packages: resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} engines: {node: '>=12.0.0'} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -3895,6 +3995,10 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -4069,6 +4173,9 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-es@2.0.0: + resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} + cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} @@ -4256,6 +4363,10 @@ packages: dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -4774,6 +4885,9 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + git-raw-commits@4.0.0: resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} engines: {node: '>=16'} @@ -5043,6 +5157,10 @@ packages: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + is-boolean-object@1.2.2: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} @@ -5223,6 +5341,10 @@ packages: isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isbot@5.1.31: + resolution: {integrity: sha512-DPgQshehErHAqSCKDb3rNW03pa2wS/v5evvUqtxt6TTnHRqAG8FdzcSSJs9656pK6Y+NT7K9R4acEYXLHYfpUQ==} + engines: {node: '>=18'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -5815,6 +5937,10 @@ packages: normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + normalize-url@4.5.1: resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} engines: {node: '>=8'} @@ -6338,6 +6464,10 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -6400,6 +6530,9 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} @@ -6516,6 +6649,16 @@ packages: serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + seroval-plugins@1.3.3: + resolution: {integrity: sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.3.2: + resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} + engines: {node: '>=10'} + serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} @@ -6646,6 +6789,10 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} @@ -6885,6 +7032,9 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -7016,6 +7166,11 @@ packages: typescript: optional: true + tsx@4.20.6: + resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} + engines: {node: '>=18.0.0'} + hasBin: true + turbo-darwin-64@2.5.8: resolution: {integrity: sha512-Dh5bCACiHO8rUXZLpKw+m3FiHtAp2CkanSyJre+SInEvEr5kIxjGvCK/8MFX8SFRjQuhjtvpIvYYZJB4AGCxNQ==} cpu: [x64] @@ -7172,6 +7327,10 @@ packages: resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} engines: {node: '>=14.0.0'} + unplugin@2.3.10: + resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==} + engines: {node: '>=18.12.0'} + upath@1.2.0: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} engines: {node: '>=4'} @@ -7898,6 +8057,16 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -8210,6 +8379,17 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -8315,6 +8495,17 @@ snapshots: '@babel/types': 7.28.1 esutils: 2.0.3 + '@babel/preset-typescript@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color + '@babel/register@7.21.0(@babel/core@7.22.1)': dependencies: '@babel/core': 7.22.1 @@ -10903,12 +11094,12 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.9.3)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.9.3)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: glob: 10.4.5 magic-string: 0.30.19 react-docgen-typescript: 2.4.0(typescript@5.9.3) - vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: typescript: 5.9.3 @@ -12764,55 +12955,55 @@ snapshots: '@sindresorhus/is@0.14.0': {} - '@storybook/addon-a11y@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))': + '@storybook/addon-a11y@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))': dependencies: '@storybook/global': 5.0.0 axe-core: 4.10.3 - storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) - '@storybook/addon-docs@9.1.13(@types/react@19.2.2)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))': + '@storybook/addon-docs@9.1.13(@types/react@19.2.2)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))': dependencies: '@mdx-js/react': 3.1.0(@types/react@19.2.2)(react@19.2.0) - '@storybook/csf-plugin': 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))) + '@storybook/csf-plugin': 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))) '@storybook/icons': 1.4.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@storybook/react-dom-shim': 9.1.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))) + '@storybook/react-dom-shim': 9.1.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-themes@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))': + '@storybook/addon-themes@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))': dependencies: - storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) ts-dedent: 2.2.0 - '@storybook/addon-vitest@9.1.13(@vitest/browser@3.2.4)(@vitest/runner@3.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(vitest@3.2.4)': + '@storybook/addon-vitest@9.1.13(@vitest/browser@3.2.4)(@vitest/runner@3.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(vitest@3.2.4)': dependencies: '@storybook/global': 5.0.0 '@storybook/icons': 1.4.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) prompts: 2.4.2 - storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) ts-dedent: 2.2.0 optionalDependencies: - '@vitest/browser': 3.2.4(playwright@1.56.1)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.2.4(playwright@1.56.1)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) '@vitest/runner': 3.2.4 - vitest: 3.2.4(@types/node@22.18.10)(@vitest/browser@3.2.4)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 3.2.4(@types/node@22.18.10)(@vitest/browser@3.2.4)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - react - react-dom - '@storybook/builder-vite@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@storybook/builder-vite@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@storybook/csf-plugin': 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))) - storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@storybook/csf-plugin': 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))) + storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) ts-dedent: 2.2.0 - vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) - '@storybook/csf-plugin@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))': + '@storybook/csf-plugin@9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))': dependencies: - storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) unplugin: 1.16.1 '@storybook/global@5.0.0': {} @@ -12822,55 +13013,55 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@storybook/react-dom-shim@9.1.13(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))': + '@storybook/react-dom-shim@9.1.13(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))': dependencies: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) - '@storybook/react-dom-shim@9.1.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))': + '@storybook/react-dom-shim@9.1.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))': dependencies: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) - '@storybook/react-vite@9.1.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.44.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.9.3)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@storybook/react-vite@9.1.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.44.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.9.3)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.9.3)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.9.3)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) '@rollup/pluginutils': 5.2.0(rollup@4.44.0) - '@storybook/builder-vite': 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) - '@storybook/react': 9.1.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.9.3) + '@storybook/builder-vite': 9.1.13(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) + '@storybook/react': 9.1.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.9.3) find-up: 7.0.0 magic-string: 0.30.19 react: 19.2.0 react-docgen: 8.0.0 react-dom: 19.2.0(react@19.2.0) resolve: 1.22.10 - storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) tsconfig-paths: 4.2.0 - vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - rollup - supports-color - typescript - '@storybook/react@9.1.13(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.9.3)': + '@storybook/react@9.1.13(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.9.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 9.1.13(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))) + '@storybook/react-dom-shim': 9.1.13(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) optionalDependencies: typescript: 5.9.3 - '@storybook/react@9.1.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.9.3)': + '@storybook/react@9.1.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.9.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 9.1.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))) + '@storybook/react-dom-shim': 9.1.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) optionalDependencies: typescript: 5.9.3 @@ -12962,12 +13153,12 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.1.14 - '@tailwindcss/vite@4.1.14(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@tailwindcss/vite@4.1.14(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@tailwindcss/node': 4.1.14 '@tailwindcss/oxide': 4.1.14 tailwindcss: 4.1.14 - vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) '@tanstack/devtools-event-client@0.3.3': {} @@ -12976,6 +13167,8 @@ snapshots: '@tanstack/devtools-event-client': 0.3.3 '@tanstack/store': 0.7.7 + '@tanstack/history@1.133.19': {} + '@tanstack/query-core@5.83.0': {} '@tanstack/react-form@1.23.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': @@ -12993,6 +13186,17 @@ snapshots: '@tanstack/query-core': 5.83.0 react: 19.2.0 + '@tanstack/react-router@1.133.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@tanstack/history': 1.133.19 + '@tanstack/react-store': 0.7.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-core': 1.133.20 + isbot: 5.1.31 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + '@tanstack/react-store@0.7.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@tanstack/store': 0.7.7 @@ -13012,10 +13216,70 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) + '@tanstack/router-core@1.133.20': + dependencies: + '@tanstack/history': 1.133.19 + '@tanstack/store': 0.7.7 + cookie-es: 2.0.0 + seroval: 1.3.2 + seroval-plugins: 1.3.3(seroval@1.3.2) + tiny-invariant: 1.3.3 + tiny-warning: 1.0.3 + + '@tanstack/router-generator@1.133.20': + dependencies: + '@tanstack/router-core': 1.133.20 + '@tanstack/router-utils': 1.133.19 + '@tanstack/virtual-file-routes': 1.133.19 + prettier: 3.6.2 + recast: 0.23.11 + source-map: 0.7.6 + tsx: 4.20.6 + zod: 3.25.76 + transitivePeerDependencies: + - supports-color + + '@tanstack/router-plugin@1.133.22(@tanstack/react-router@1.133.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + '@tanstack/router-core': 1.133.20 + '@tanstack/router-generator': 1.133.20 + '@tanstack/router-utils': 1.133.19 + '@tanstack/virtual-file-routes': 1.133.19 + babel-dead-code-elimination: 1.0.10 + chokidar: 3.6.0 + unplugin: 2.3.10 + zod: 3.25.76 + optionalDependencies: + '@tanstack/react-router': 1.133.22(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + + '@tanstack/router-utils@1.133.19': + dependencies: + '@babel/core': 7.28.0 + '@babel/generator': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/preset-typescript': 7.27.1(@babel/core@7.28.0) + ansis: 4.2.0 + diff: 8.0.2 + pathe: 2.0.3 + tinyglobby: 0.2.15 + transitivePeerDependencies: + - supports-color + '@tanstack/store@0.7.7': {} '@tanstack/virtual-core@3.11.3': {} + '@tanstack/virtual-file-routes@1.133.19': {} + '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.27.1 @@ -13295,11 +13559,11 @@ snapshots: '@typescript-eslint/types': 8.46.1 eslint-visitor-keys: 4.2.1 - '@vitejs/plugin-basic-ssl@2.1.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@vitejs/plugin-basic-ssl@2.1.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) - '@vitejs/plugin-react@4.7.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@vitejs/plugin-react@4.7.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) @@ -13307,20 +13571,20 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/browser@3.2.4(playwright@1.56.1)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4)': + '@vitest/browser@3.2.4(playwright@1.56.1)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/mocker': 3.2.4(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/utils': 3.2.4 magic-string: 0.30.17 sirv: 3.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.18.10)(@vitest/browser@3.2.4)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 3.2.4(@types/node@22.18.10)(@vitest/browser@3.2.4)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) ws: 8.18.2 optionalDependencies: playwright: 1.56.1 @@ -13345,9 +13609,9 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.18.10)(@vitest/browser@3.2.4)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vitest: 3.2.4(@types/node@22.18.10)(@vitest/browser@3.2.4)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 3.2.4(playwright@1.56.1)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.2.4(playwright@1.56.1)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) transitivePeerDependencies: - supports-color @@ -13359,13 +13623,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -13460,8 +13724,15 @@ snapshots: ansi-styles@6.2.1: {} + ansis@4.2.0: {} + any-promise@1.3.0: {} + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -13583,6 +13854,15 @@ snapshots: axe-core@4.10.3: {} + babel-dead-code-elimination@1.0.10: + dependencies: + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.28.0): dependencies: '@babel/compat-data': 7.27.5 @@ -13634,6 +13914,8 @@ snapshots: dependencies: open: 8.4.2 + binary-extensions@2.3.0: {} + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -13804,6 +14086,18 @@ snapshots: check-error@2.1.1: {} + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -13958,6 +14252,8 @@ snapshots: convert-source-map@2.0.0: {} + cookie-es@2.0.0: {} + cookie-signature@1.0.6: {} cookie@0.5.0: {} @@ -14116,6 +14412,8 @@ snapshots: asap: 2.0.6 wrappy: 1.0.2 + diff@8.0.2: {} + doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -14452,11 +14750,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@9.1.13(eslint@9.38.0(jiti@2.6.1))(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)))(typescript@5.9.3): + eslint-plugin-storybook@9.1.13(eslint@9.38.0(jiti@2.6.1))(storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.9.3): dependencies: '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) eslint: 9.38.0(jiti@2.6.1) - storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + storybook: 9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - supports-color - typescript @@ -14830,6 +15128,10 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 + get-tsconfig@4.13.0: + dependencies: + resolve-pkg-maps: 1.0.0 + git-raw-commits@4.0.0: dependencies: dargs: 8.1.0 @@ -15129,6 +15431,10 @@ snapshots: dependencies: has-bigints: 1.1.0 + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + is-boolean-object@1.2.2: dependencies: call-bound: 1.0.4 @@ -15282,6 +15588,8 @@ snapshots: isarray@2.0.5: {} + isbot@5.1.31: {} + isexe@2.0.0: {} isobject@3.0.1: {} @@ -15828,6 +16136,8 @@ snapshots: semver: 5.7.2 validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} + normalize-url@4.5.1: {} object-assign@4.1.1: {} @@ -16088,12 +16398,13 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.1): + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.6.1 postcss: 8.5.6 + tsx: 4.20.6 yaml: 2.8.1 postcss-selector-parser@6.0.10: @@ -16314,6 +16625,10 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + readdirp@4.1.2: {} recast@0.23.11: @@ -16386,6 +16701,8 @@ snapshots: resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} + resolve@1.22.10: dependencies: is-core-module: 2.16.1 @@ -16534,6 +16851,12 @@ snapshots: dependencies: randombytes: 2.1.0 + seroval-plugins@1.3.3(seroval@1.3.2): + dependencies: + seroval: 1.3.2 + + seroval@1.3.2: {} + serve-static@1.15.0: dependencies: encodeurl: 1.0.2 @@ -16676,6 +16999,8 @@ snapshots: source-map@0.6.1: {} + source-map@0.7.6: {} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 @@ -16713,13 +17038,13 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): + storybook@9.1.13(@testing-library/dom@10.4.0)(prettier@3.6.2)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@storybook/global': 5.0.0 '@testing-library/jest-dom': 6.6.3 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/spy': 3.2.4 better-opn: 3.0.2 esbuild: 0.25.5 @@ -16967,6 +17292,8 @@ snapshots: tiny-invariant@1.3.3: {} + tiny-warning@1.0.3: {} + tinybench@2.9.0: {} tinycolor2@1.6.0: {} @@ -17050,7 +17377,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.0(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.1): + tsup@8.5.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1): dependencies: bundle-require: 5.1.0(esbuild@0.25.5) cac: 6.7.14 @@ -17061,7 +17388,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.1) + postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1) resolve-from: 5.0.0 rollup: 4.44.0 source-map: 0.8.0-beta.0 @@ -17078,6 +17405,13 @@ snapshots: - tsx - yaml + tsx@4.20.6: + dependencies: + esbuild: 0.25.5 + get-tsconfig: 4.13.0 + optionalDependencies: + fsevents: 2.3.3 + turbo-darwin-64@2.5.8: optional: true @@ -17222,6 +17556,13 @@ snapshots: acorn: 8.15.0 webpack-virtual-modules: 0.6.2 + unplugin@2.3.10: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.15.0 + picomatch: 4.0.3 + webpack-virtual-modules: 0.6.2 + upath@1.2.0: {} update-browserslist-db@1.1.3(browserslist@4.25.0): @@ -17356,13 +17697,13 @@ snapshots: vary@1.1.2: {} - vite-node@3.2.4(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vite-node@3.2.4(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -17377,34 +17718,34 @@ snapshots: - tsx - yaml - vite-plugin-http2-proxy@0.5.1(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): + vite-plugin-http2-proxy@0.5.1(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)): dependencies: http2-proxy: 5.0.53 - vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) - vite-plugin-pwa@1.1.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): + vite-plugin-pwa@1.1.0(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): dependencies: debug: 4.4.1 pretty-bytes: 6.1.1 tinyglobby: 0.2.15 - vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) workbox-build: 7.3.0(@types/babel__core@7.20.5) workbox-window: 7.3.0 transitivePeerDependencies: - supports-color - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.5 fdir: 6.5.0(picomatch@4.0.3) @@ -17418,13 +17759,14 @@ snapshots: jiti: 2.6.1 lightningcss: 1.30.1 terser: 5.43.1 + tsx: 4.20.6 yaml: 2.8.1 - vitest@3.2.4(@types/node@22.18.10)(@vitest/browser@3.2.4)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1): + vitest@3.2.4(@types/node@22.18.10)(@vitest/browser@3.2.4)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -17442,12 +17784,12 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1) + vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.18.10 - '@vitest/browser': 3.2.4(playwright@1.56.1)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.2.4(playwright@1.56.1)(vite@7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) transitivePeerDependencies: - jiti - less