├── .dockerignore
├── .github
└── workflows
│ └── deploy.yml
├── .gitignore
├── .vscode
├── extensions.json
└── settings.json
├── Dockerfile
├── README.md
├── app
├── app.css
├── entry.server.tsx
├── root.tsx
├── routes.ts
├── routes
│ └── home.tsx
└── welcome
│ ├── logo-dark.svg
│ ├── logo-light.svg
│ └── welcome.tsx
├── deno.json
├── deno.lock
├── package.json
├── public
└── favicon.ico
├── react-router.config.ts
├── server.production.ts
└── vite.config.ts
/.dockerignore:
--------------------------------------------------------------------------------
1 | .react-router
2 | build
3 | node_modules
4 | README.md
5 |
--------------------------------------------------------------------------------
/.github/workflows/deploy.yml:
--------------------------------------------------------------------------------
1 | name: Deploy
2 | on:
3 | push:
4 | branches: main
5 | pull_request:
6 | branches: main
7 |
8 | jobs:
9 | deploy:
10 | name: Deploy
11 | runs-on: ubuntu-latest
12 |
13 | permissions:
14 | id-token: write # Needed for auth with Deno Deploy
15 | contents: read # Needed to clone the repository
16 |
17 | steps:
18 | - name: Clone repository
19 | uses: actions/checkout@v4
20 |
21 | - name: Install Deno
22 | uses: denoland/setup-deno@v2
23 | with:
24 | deno-version: v2.x
25 |
26 | - name: Install dependencies
27 | run: "deno install"
28 |
29 | - name: Build step
30 | run: "deno task build"
31 |
32 | - name: Upload to Deno Deploy
33 | uses: denoland/deployctl@v1
34 | with:
35 | project: "huge-badger-89"
36 | entrypoint: "server.production.ts"
37 | root: ""
38 | include: |
39 | deno.json
40 | deno.lock
41 | build
42 | package.json
43 | server.production.ts
44 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .env
2 | !.env.example
3 | .DS_Store
4 | .react-router
5 | build
6 | node_modules
7 | *.tsbuildinfo
8 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": ["denoland.vscode-deno"]
3 | }
4 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "deno.enable": true,
3 | "deno.lint": true,
4 | "editor.defaultFormatter": "denoland.vscode-deno"
5 | }
6 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM denoland/deno:2.1.4 AS build-env
2 | COPY . /app/
3 | WORKDIR /app
4 | RUN deno install
5 | RUN deno task build
6 | RUN deno compile -A --output ./server ./server.production.ts
7 |
8 | FROM gcr.io/distroless/cc:nonroot
9 | COPY --from=build-env /app/build/client/ /app/build/client/
10 | COPY --from=build-env /app/server /app/server
11 | WORKDIR /app
12 | CMD ["/app/server"]
13 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # NOTES
2 |
3 | This template has been tested with Deno v2.2.1+.
4 | [Live deployment here](https://huge-badger-89.deno.dev/) hosted on
5 | [Deno Deploy](https://deno.com/deploy).
6 |
7 | ## Using this template
8 |
9 | Run the following command:
10 |
11 | ```zsh
12 | deno init --npm react-router --no-install --template redabacha/react-router-deno-template
13 | ```
14 |
15 | And then run `deno install` in the created directory.
16 |
17 | ## Using JSR and HTTPS imports in `app/`
18 |
19 | Thanks to the [@deno/vite-plugin](https://github.com/denoland/deno-vite-plugin),
20 | it's possible to use packages from JSR and imports from HTTPS URLs (via the
21 | [deno.json `imports` field](https://docs.deno.com/runtime/fundamentals/modules/#managing-third-party-modules-and-libraries))
22 | within the `app/` directory which will get included in the server and/or browser
23 | bundles as needed.
24 |
25 | # Welcome to React Router!
26 |
27 | A modern, production-ready template for building full-stack React applications
28 | using React Router.
29 |
30 | ## Features
31 |
32 | - 🚀 Server-side rendering
33 | - ⚡️ Hot Module Replacement (HMR)
34 | - 📦 Asset bundling and optimization
35 | - 🔄 Data loading and mutations
36 | - 🔒 TypeScript by default
37 | - 🎉 TailwindCSS for styling
38 | - 📖 [React Router docs](https://reactrouter.com/)
39 |
40 | ## Getting Started
41 |
42 | ### Installation
43 |
44 | Install the dependencies:
45 |
46 | ```bash
47 | deno install
48 | ```
49 |
50 | ### Development
51 |
52 | Start the development server with HMR:
53 |
54 | ```bash
55 | deno task dev
56 | ```
57 |
58 | Your application will be available at `http://localhost:5173`.
59 |
60 | ## Building for Production
61 |
62 | Create a production build:
63 |
64 | ```bash
65 | deno task build
66 | ```
67 |
68 | ## Deployment
69 |
70 | ### Deno Deploy
71 |
72 | Deployment can be done using the
73 | [deployctl](https://github.com/denoland/deployctl) CLI:
74 |
75 | ```bash
76 | deployctl deploy --entrypoint ./server.production.ts
77 | ```
78 |
79 | ### Docker Deployment
80 |
81 | To build and run using Docker:
82 |
83 | ```bash
84 | docker build -t my-app .
85 |
86 | # Run the container
87 | docker run --init -p 8000:8000 my-app
88 | ```
89 |
90 | The containerized application can be deployed to any platform that supports
91 | Docker, including:
92 |
93 | - AWS ECS
94 | - Google Cloud Run
95 | - Azure Container Apps
96 | - Digital Ocean App Platform
97 | - Fly.io
98 | - Railway
99 |
100 | ### DIY Deployment
101 |
102 | If you're familiar with deploying Deno applications, the built-in app server is
103 | production-ready.
104 |
105 | Make sure to deploy the output of `deno task build`
106 |
107 | ```
108 | ├── package.json
109 | ├── deno.json
110 | ├── deno.lock
111 | ├── build/
112 | │ ├── client/ # Static assets
113 | │ └── server/ # Server-side code
114 | ├── server.production.ts # Entrypoint
115 | ```
116 |
117 | ## Styling
118 |
119 | This template comes with [Tailwind CSS](https://tailwindcss.com/) already
120 | configured for a simple default starting experience. You can use whatever CSS
121 | framework you prefer.
122 |
123 | ---
124 |
125 | Built with ❤️ using React Router.
126 |
--------------------------------------------------------------------------------
/app/app.css:
--------------------------------------------------------------------------------
1 | @import "tailwindcss";
2 |
3 | @theme {
4 | --font-sans:
5 | "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji",
6 | "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
7 | }
8 |
9 | html,
10 | body {
11 | @apply bg-white dark:bg-gray-950;
12 |
13 | @media (prefers-color-scheme: dark) {
14 | color-scheme: dark;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/app/entry.server.tsx:
--------------------------------------------------------------------------------
1 | import { isbot } from "isbot";
2 | import { renderToReadableStream } from "react-dom/server";
3 | import type { AppLoadContext, EntryContext } from "react-router";
4 | import { ServerRouter } from "react-router";
5 |
6 | // Reject all pending promises from handler functions after 10 seconds
7 | export const streamTimeout = 5_000;
8 |
9 | export default async function handleRequest(
10 | request: Request,
11 | responseStatusCode: number,
12 | responseHeaders: Headers,
13 | routerContext: EntryContext,
14 | _loadContext: AppLoadContext,
15 | ) {
16 | let shellRendered = false;
17 | const userAgent = request.headers.get("user-agent");
18 |
19 | const controller = new AbortController();
20 | setTimeout(() => {
21 | // Abort the rendering stream after the `streamTimeout` so it has time to
22 | // flush down the rejected boundaries
23 | controller.abort();
24 | }, streamTimeout + 1000);
25 |
26 | const body = await renderToReadableStream(
27 | ,
28 | {
29 | onError(error: unknown) {
30 | responseStatusCode = 500;
31 | // Log streaming rendering errors from inside the shell. Don't log
32 | // errors encountered during initial shell rendering since they'll
33 | // reject and get logged in handleDocumentRequest.
34 | if (shellRendered) {
35 | console.error(error);
36 | }
37 | },
38 | signal: controller.signal,
39 | },
40 | );
41 | shellRendered = true;
42 |
43 | // Ensure requests from bots and SPA Mode renders wait for all content to load before responding
44 | // https://react.dev/reference/react-dom/server/renderToReadableStream#waiting-for-all-content-to-load-for-crawlers-and-static-generation
45 | if ((userAgent && isbot(userAgent)) || routerContext.isSpaMode) {
46 | await body.allReady;
47 | }
48 |
49 | responseHeaders.set("Content-Type", "text/html");
50 | return new Response(body, {
51 | headers: responseHeaders,
52 | status: responseStatusCode,
53 | });
54 | }
55 |
--------------------------------------------------------------------------------
/app/root.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | isRouteErrorResponse,
3 | Links,
4 | Meta,
5 | Outlet,
6 | Scripts,
7 | ScrollRestoration,
8 | } from "react-router";
9 |
10 | import type { Route } from "./+types/root.ts";
11 | import "./app.css";
12 |
13 | export const links: Route.LinksFunction = () => [
14 | { rel: "preconnect", href: "https://fonts.googleapis.com" },
15 | {
16 | rel: "preconnect",
17 | href: "https://fonts.gstatic.com",
18 | crossOrigin: "anonymous",
19 | },
20 | {
21 | rel: "stylesheet",
22 | href:
23 | "https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap",
24 | },
25 | ];
26 |
27 | export function Layout({ children }: { children: React.ReactNode }) {
28 | return (
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 | {children}
38 |
39 |
40 |
41 |
42 | );
43 | }
44 |
45 | export default function App() {
46 | return ;
47 | }
48 |
49 | export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) {
50 | let message = "Oops!";
51 | let details = "An unexpected error occurred.";
52 | let stack: string | undefined;
53 |
54 | if (isRouteErrorResponse(error)) {
55 | message = error.status === 404 ? "404" : "Error";
56 | details = error.status === 404
57 | ? "The requested page could not be found."
58 | : error.statusText || details;
59 | } else if (import.meta.env.DEV && error && error instanceof Error) {
60 | details = error.message;
61 | stack = error.stack;
62 | }
63 |
64 | return (
65 |
66 | {message}
67 | {details}
68 | {stack && (
69 |
70 | {stack}
71 |
72 | )}
73 |
74 | );
75 | }
76 |
--------------------------------------------------------------------------------
/app/routes.ts:
--------------------------------------------------------------------------------
1 | import { index, type RouteConfig } from "@react-router/dev/routes";
2 |
3 | export default [index("routes/home.tsx")] satisfies RouteConfig;
4 |
--------------------------------------------------------------------------------
/app/routes/home.tsx:
--------------------------------------------------------------------------------
1 | import { Welcome } from "~/welcome/welcome.tsx";
2 | import type { Route } from "./+types/home.ts";
3 |
4 | export function meta({}: Route.MetaArgs) {
5 | return [
6 | { title: "New React Router App" },
7 | { name: "description", content: "Welcome to React Router!" },
8 | ];
9 | }
10 |
11 | export function loader() {
12 | return {
13 | message: `Hello from Deno ${
14 | Deno.version.deno ? `v${Deno.version.deno}` : "Deploy"
15 | }`,
16 | };
17 | }
18 |
19 | export default function Home({ loaderData }: Route.ComponentProps) {
20 | return ;
21 | }
22 |
--------------------------------------------------------------------------------
/app/welcome/logo-dark.svg:
--------------------------------------------------------------------------------
1 |
24 |
--------------------------------------------------------------------------------
/app/welcome/logo-light.svg:
--------------------------------------------------------------------------------
1 |
24 |
--------------------------------------------------------------------------------
/app/welcome/welcome.tsx:
--------------------------------------------------------------------------------
1 | import logoDark from "./logo-dark.svg";
2 | import logoLight from "./logo-light.svg";
3 |
4 | export function Welcome({ message }: { message: string }) {
5 | return (
6 |
7 |
8 |
9 |
10 |

15 |

20 |
21 |
22 |
23 |
44 |
45 |
46 |
47 | );
48 | }
49 |
50 | const resources = [
51 | {
52 | href: "https://reactrouter.com/docs",
53 | text: "React Router Docs",
54 | icon: (
55 |
69 | ),
70 | },
71 | {
72 | href: "https://rmx.as/discord",
73 | text: "Join Discord",
74 | icon: (
75 |
88 | ),
89 | },
90 | ];
91 |
--------------------------------------------------------------------------------
/deno.json:
--------------------------------------------------------------------------------
1 | {
2 | "tasks": {
3 | "build": "NODE_ENV=production react-router build",
4 | "dev": "react-router dev",
5 | "format": "deno fmt",
6 | "lint": "deno lint",
7 | "start": "deno run -A ./server.production.ts",
8 | "typecheck": {
9 | "command": "deno check --node-modules-dir=auto '**/*'",
10 | "dependencies": ["typegen"]
11 | },
12 | "typegen": "react-router typegen"
13 | },
14 | "compilerOptions": {
15 | "lib": ["deno.window", "dom"],
16 | "jsx": "react-jsx",
17 | "jsxImportSource": "react",
18 | "jsxImportSourceTypes": "@types/react",
19 | "rootDirs": [".", "./.react-router/types"],
20 | "types": ["vite/client"]
21 | },
22 | "unstable": ["sloppy-imports"],
23 | "exclude": ["build/"],
24 | "nodeModulesDir": "manual",
25 | "imports": {
26 | "~/": "./app/",
27 | "@std/http": "jsr:@std/http@^1.0.11",
28 | "@std/path": "jsr:@std/path@^1.0.8"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/deno.lock:
--------------------------------------------------------------------------------
1 | {
2 | "version": "4",
3 | "specifiers": {
4 | "jsr:@std/cli@^1.0.12": "1.0.13",
5 | "jsr:@std/encoding@^1.0.7": "1.0.7",
6 | "jsr:@std/fmt@^1.0.5": "1.0.5",
7 | "jsr:@std/html@^1.0.3": "1.0.3",
8 | "jsr:@std/http@^1.0.11": "1.0.13",
9 | "jsr:@std/media-types@^1.1.0": "1.1.0",
10 | "jsr:@std/net@^1.0.4": "1.0.4",
11 | "jsr:@std/path@^1.0.8": "1.0.8",
12 | "jsr:@std/streams@^1.0.9": "1.0.9",
13 | "npm:@deno/vite-plugin@^1.0.2": "1.0.4_vite@6.1.1__@types+node@22.13.5__lightningcss@1.29.1_@types+node@22.13.5",
14 | "npm:@react-router/dev@*": "7.2.0_react-router@7.2.0__react@19.0.0__react-dom@19.0.0___react@19.0.0_vite@6.1.1__@types+node@22.13.5__lightningcss@1.29.1_@babel+core@7.26.9_react@19.0.0_react-dom@19.0.0__react@19.0.0_@types+node@22.13.5",
15 | "npm:@tailwindcss/vite@^4.0.8": "4.0.8_vite@6.1.1__@types+node@22.13.5__lightningcss@1.29.1_@types+node@22.13.5_lightningcss@1.29.1",
16 | "npm:@types/node@^22.10.2": "22.13.5",
17 | "npm:@types/react-dom@^19.0.2": "19.0.4_@types+react@19.0.10",
18 | "npm:@types/react@^19.0.2": "19.0.10",
19 | "npm:isbot@^5.1.18": "5.1.23",
20 | "npm:react-dom@19": "19.0.0_react@19.0.0",
21 | "npm:react-router@*": "7.2.0_react@19.0.0_react-dom@19.0.0__react@19.0.0",
22 | "npm:react@19": "19.0.0",
23 | "npm:tailwindcss@^4.0.8": "4.0.8",
24 | "npm:vite@^6.0.5": "6.1.1_@types+node@22.13.5_lightningcss@1.29.1"
25 | },
26 | "jsr": {
27 | "@std/cli@1.0.13": {
28 | "integrity": "5db2d95ab2dca3bca9fb6ad3c19908c314e93d6391c8b026725e4892d4615a69"
29 | },
30 | "@std/encoding@1.0.7": {
31 | "integrity": "f631247c1698fef289f2de9e2a33d571e46133b38d042905e3eac3715030a82d"
32 | },
33 | "@std/fmt@1.0.5": {
34 | "integrity": "0cfab43364bc36650d83c425cd6d99910fc20c4576631149f0f987eddede1a4d"
35 | },
36 | "@std/html@1.0.3": {
37 | "integrity": "7a0ac35e050431fb49d44e61c8b8aac1ebd55937e0dc9ec6409aa4bab39a7988"
38 | },
39 | "@std/http@1.0.13": {
40 | "integrity": "d29618b982f7ae44380111f7e5b43da59b15db64101198bb5f77100d44eb1e1e",
41 | "dependencies": [
42 | "jsr:@std/cli",
43 | "jsr:@std/encoding",
44 | "jsr:@std/fmt",
45 | "jsr:@std/html",
46 | "jsr:@std/media-types",
47 | "jsr:@std/net",
48 | "jsr:@std/path",
49 | "jsr:@std/streams"
50 | ]
51 | },
52 | "@std/media-types@1.1.0": {
53 | "integrity": "c9d093f0c05c3512932b330e3cc1fe1d627b301db33a4c2c2185c02471d6eaa4"
54 | },
55 | "@std/net@1.0.4": {
56 | "integrity": "2f403b455ebbccf83d8a027d29c5a9e3a2452fea39bb2da7f2c04af09c8bc852"
57 | },
58 | "@std/path@1.0.8": {
59 | "integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be"
60 | },
61 | "@std/streams@1.0.9": {
62 | "integrity": "a9d26b1988cdd7aa7b1f4b51e1c36c1557f3f252880fa6cc5b9f37078b1a5035"
63 | }
64 | },
65 | "npm": {
66 | "@ampproject/remapping@2.3.0": {
67 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
68 | "dependencies": [
69 | "@jridgewell/gen-mapping",
70 | "@jridgewell/trace-mapping"
71 | ]
72 | },
73 | "@babel/code-frame@7.26.2": {
74 | "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
75 | "dependencies": [
76 | "@babel/helper-validator-identifier",
77 | "js-tokens",
78 | "picocolors"
79 | ]
80 | },
81 | "@babel/compat-data@7.26.8": {
82 | "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ=="
83 | },
84 | "@babel/core@7.26.9": {
85 | "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==",
86 | "dependencies": [
87 | "@ampproject/remapping",
88 | "@babel/code-frame",
89 | "@babel/generator",
90 | "@babel/helper-compilation-targets",
91 | "@babel/helper-module-transforms",
92 | "@babel/helpers",
93 | "@babel/parser",
94 | "@babel/template",
95 | "@babel/traverse",
96 | "@babel/types",
97 | "convert-source-map",
98 | "debug",
99 | "gensync",
100 | "json5",
101 | "semver@6.3.1"
102 | ]
103 | },
104 | "@babel/generator@7.26.9": {
105 | "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==",
106 | "dependencies": [
107 | "@babel/parser",
108 | "@babel/types",
109 | "@jridgewell/gen-mapping",
110 | "@jridgewell/trace-mapping",
111 | "jsesc"
112 | ]
113 | },
114 | "@babel/helper-annotate-as-pure@7.25.9": {
115 | "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
116 | "dependencies": [
117 | "@babel/types"
118 | ]
119 | },
120 | "@babel/helper-compilation-targets@7.26.5": {
121 | "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==",
122 | "dependencies": [
123 | "@babel/compat-data",
124 | "@babel/helper-validator-option",
125 | "browserslist",
126 | "lru-cache@5.1.1",
127 | "semver@6.3.1"
128 | ]
129 | },
130 | "@babel/helper-create-class-features-plugin@7.26.9_@babel+core@7.26.9": {
131 | "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==",
132 | "dependencies": [
133 | "@babel/core",
134 | "@babel/helper-annotate-as-pure",
135 | "@babel/helper-member-expression-to-functions",
136 | "@babel/helper-optimise-call-expression",
137 | "@babel/helper-replace-supers",
138 | "@babel/helper-skip-transparent-expression-wrappers",
139 | "@babel/traverse",
140 | "semver@6.3.1"
141 | ]
142 | },
143 | "@babel/helper-member-expression-to-functions@7.25.9": {
144 | "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
145 | "dependencies": [
146 | "@babel/traverse",
147 | "@babel/types"
148 | ]
149 | },
150 | "@babel/helper-module-imports@7.25.9": {
151 | "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
152 | "dependencies": [
153 | "@babel/traverse",
154 | "@babel/types"
155 | ]
156 | },
157 | "@babel/helper-module-transforms@7.26.0_@babel+core@7.26.9": {
158 | "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
159 | "dependencies": [
160 | "@babel/core",
161 | "@babel/helper-module-imports",
162 | "@babel/helper-validator-identifier",
163 | "@babel/traverse"
164 | ]
165 | },
166 | "@babel/helper-optimise-call-expression@7.25.9": {
167 | "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
168 | "dependencies": [
169 | "@babel/types"
170 | ]
171 | },
172 | "@babel/helper-plugin-utils@7.26.5": {
173 | "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg=="
174 | },
175 | "@babel/helper-replace-supers@7.26.5_@babel+core@7.26.9": {
176 | "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==",
177 | "dependencies": [
178 | "@babel/core",
179 | "@babel/helper-member-expression-to-functions",
180 | "@babel/helper-optimise-call-expression",
181 | "@babel/traverse"
182 | ]
183 | },
184 | "@babel/helper-skip-transparent-expression-wrappers@7.25.9": {
185 | "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
186 | "dependencies": [
187 | "@babel/traverse",
188 | "@babel/types"
189 | ]
190 | },
191 | "@babel/helper-string-parser@7.25.9": {
192 | "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="
193 | },
194 | "@babel/helper-validator-identifier@7.25.9": {
195 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="
196 | },
197 | "@babel/helper-validator-option@7.25.9": {
198 | "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw=="
199 | },
200 | "@babel/helpers@7.26.9": {
201 | "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==",
202 | "dependencies": [
203 | "@babel/template",
204 | "@babel/types"
205 | ]
206 | },
207 | "@babel/parser@7.26.9": {
208 | "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==",
209 | "dependencies": [
210 | "@babel/types"
211 | ]
212 | },
213 | "@babel/plugin-syntax-decorators@7.25.9_@babel+core@7.26.9": {
214 | "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==",
215 | "dependencies": [
216 | "@babel/core",
217 | "@babel/helper-plugin-utils"
218 | ]
219 | },
220 | "@babel/plugin-syntax-jsx@7.25.9_@babel+core@7.26.9": {
221 | "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
222 | "dependencies": [
223 | "@babel/core",
224 | "@babel/helper-plugin-utils"
225 | ]
226 | },
227 | "@babel/plugin-syntax-typescript@7.25.9_@babel+core@7.26.9": {
228 | "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
229 | "dependencies": [
230 | "@babel/core",
231 | "@babel/helper-plugin-utils"
232 | ]
233 | },
234 | "@babel/plugin-transform-modules-commonjs@7.26.3_@babel+core@7.26.9": {
235 | "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==",
236 | "dependencies": [
237 | "@babel/core",
238 | "@babel/helper-module-transforms",
239 | "@babel/helper-plugin-utils"
240 | ]
241 | },
242 | "@babel/plugin-transform-typescript@7.26.8_@babel+core@7.26.9": {
243 | "integrity": "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==",
244 | "dependencies": [
245 | "@babel/core",
246 | "@babel/helper-annotate-as-pure",
247 | "@babel/helper-create-class-features-plugin",
248 | "@babel/helper-plugin-utils",
249 | "@babel/helper-skip-transparent-expression-wrappers",
250 | "@babel/plugin-syntax-typescript"
251 | ]
252 | },
253 | "@babel/preset-typescript@7.26.0_@babel+core@7.26.9": {
254 | "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==",
255 | "dependencies": [
256 | "@babel/core",
257 | "@babel/helper-plugin-utils",
258 | "@babel/helper-validator-option",
259 | "@babel/plugin-syntax-jsx",
260 | "@babel/plugin-transform-modules-commonjs",
261 | "@babel/plugin-transform-typescript"
262 | ]
263 | },
264 | "@babel/template@7.26.9": {
265 | "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==",
266 | "dependencies": [
267 | "@babel/code-frame",
268 | "@babel/parser",
269 | "@babel/types"
270 | ]
271 | },
272 | "@babel/traverse@7.26.9": {
273 | "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==",
274 | "dependencies": [
275 | "@babel/code-frame",
276 | "@babel/generator",
277 | "@babel/parser",
278 | "@babel/template",
279 | "@babel/types",
280 | "debug",
281 | "globals"
282 | ]
283 | },
284 | "@babel/types@7.26.9": {
285 | "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==",
286 | "dependencies": [
287 | "@babel/helper-string-parser",
288 | "@babel/helper-validator-identifier"
289 | ]
290 | },
291 | "@deno/vite-plugin@1.0.4_vite@6.1.1__@types+node@22.13.5__lightningcss@1.29.1_@types+node@22.13.5": {
292 | "integrity": "sha512-xg8YT8Wn2sGXSnJgiGTpBGX1Dov0c6fd1rAp8VsfrCUtyBRRWzwVMAnd3fQ4yq8h7LSVvJUxEFN4U421k/DQLA==",
293 | "dependencies": [
294 | "vite@6.1.1_@types+node@22.13.5_lightningcss@1.29.1"
295 | ]
296 | },
297 | "@esbuild/aix-ppc64@0.24.2": {
298 | "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="
299 | },
300 | "@esbuild/android-arm64@0.24.2": {
301 | "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg=="
302 | },
303 | "@esbuild/android-arm@0.24.2": {
304 | "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q=="
305 | },
306 | "@esbuild/android-x64@0.24.2": {
307 | "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw=="
308 | },
309 | "@esbuild/darwin-arm64@0.24.2": {
310 | "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA=="
311 | },
312 | "@esbuild/darwin-x64@0.24.2": {
313 | "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA=="
314 | },
315 | "@esbuild/freebsd-arm64@0.24.2": {
316 | "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg=="
317 | },
318 | "@esbuild/freebsd-x64@0.24.2": {
319 | "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q=="
320 | },
321 | "@esbuild/linux-arm64@0.24.2": {
322 | "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg=="
323 | },
324 | "@esbuild/linux-arm@0.24.2": {
325 | "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA=="
326 | },
327 | "@esbuild/linux-ia32@0.24.2": {
328 | "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw=="
329 | },
330 | "@esbuild/linux-loong64@0.24.2": {
331 | "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ=="
332 | },
333 | "@esbuild/linux-mips64el@0.24.2": {
334 | "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw=="
335 | },
336 | "@esbuild/linux-ppc64@0.24.2": {
337 | "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw=="
338 | },
339 | "@esbuild/linux-riscv64@0.24.2": {
340 | "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q=="
341 | },
342 | "@esbuild/linux-s390x@0.24.2": {
343 | "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw=="
344 | },
345 | "@esbuild/linux-x64@0.24.2": {
346 | "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q=="
347 | },
348 | "@esbuild/netbsd-arm64@0.24.2": {
349 | "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw=="
350 | },
351 | "@esbuild/netbsd-x64@0.24.2": {
352 | "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw=="
353 | },
354 | "@esbuild/openbsd-arm64@0.24.2": {
355 | "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A=="
356 | },
357 | "@esbuild/openbsd-x64@0.24.2": {
358 | "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA=="
359 | },
360 | "@esbuild/sunos-x64@0.24.2": {
361 | "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig=="
362 | },
363 | "@esbuild/win32-arm64@0.24.2": {
364 | "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ=="
365 | },
366 | "@esbuild/win32-ia32@0.24.2": {
367 | "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA=="
368 | },
369 | "@esbuild/win32-x64@0.24.2": {
370 | "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg=="
371 | },
372 | "@isaacs/cliui@8.0.2": {
373 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
374 | "dependencies": [
375 | "string-width@5.1.2",
376 | "string-width-cjs@npm:string-width@4.2.3",
377 | "strip-ansi@7.1.0",
378 | "strip-ansi-cjs@npm:strip-ansi@6.0.1",
379 | "wrap-ansi@8.1.0",
380 | "wrap-ansi-cjs@npm:wrap-ansi@7.0.0"
381 | ]
382 | },
383 | "@jridgewell/gen-mapping@0.3.8": {
384 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
385 | "dependencies": [
386 | "@jridgewell/set-array",
387 | "@jridgewell/sourcemap-codec",
388 | "@jridgewell/trace-mapping"
389 | ]
390 | },
391 | "@jridgewell/resolve-uri@3.1.2": {
392 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="
393 | },
394 | "@jridgewell/set-array@1.2.1": {
395 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="
396 | },
397 | "@jridgewell/sourcemap-codec@1.5.0": {
398 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
399 | },
400 | "@jridgewell/trace-mapping@0.3.25": {
401 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
402 | "dependencies": [
403 | "@jridgewell/resolve-uri",
404 | "@jridgewell/sourcemap-codec"
405 | ]
406 | },
407 | "@mjackson/node-fetch-server@0.2.0": {
408 | "integrity": "sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng=="
409 | },
410 | "@npmcli/git@4.1.0": {
411 | "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==",
412 | "dependencies": [
413 | "@npmcli/promise-spawn",
414 | "lru-cache@7.18.3",
415 | "npm-pick-manifest",
416 | "proc-log",
417 | "promise-inflight",
418 | "promise-retry",
419 | "semver@7.7.1",
420 | "which@3.0.1"
421 | ]
422 | },
423 | "@npmcli/package-json@4.0.1": {
424 | "integrity": "sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q==",
425 | "dependencies": [
426 | "@npmcli/git",
427 | "glob",
428 | "hosted-git-info",
429 | "json-parse-even-better-errors",
430 | "normalize-package-data",
431 | "proc-log",
432 | "semver@7.7.1"
433 | ]
434 | },
435 | "@npmcli/promise-spawn@6.0.2": {
436 | "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==",
437 | "dependencies": [
438 | "which@3.0.1"
439 | ]
440 | },
441 | "@pkgjs/parseargs@0.11.0": {
442 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="
443 | },
444 | "@react-router/dev@7.2.0_react-router@7.2.0__react@19.0.0__react-dom@19.0.0___react@19.0.0_vite@6.1.1__@types+node@22.13.5__lightningcss@1.29.1_@babel+core@7.26.9_react@19.0.0_react-dom@19.0.0__react@19.0.0_@types+node@22.13.5": {
445 | "integrity": "sha512-GzSNGeWuhx6sMsnidCQAlCAephibUMC61xIAdsc6hBXWCJe/T9wUrvtnh2Xbcpr7BRZJtJN4UhI472ZURA6m9w==",
446 | "dependencies": [
447 | "@babel/core",
448 | "@babel/generator",
449 | "@babel/parser",
450 | "@babel/plugin-syntax-decorators",
451 | "@babel/plugin-syntax-jsx",
452 | "@babel/preset-typescript",
453 | "@babel/traverse",
454 | "@babel/types",
455 | "@npmcli/package-json",
456 | "@react-router/node",
457 | "arg",
458 | "babel-dead-code-elimination",
459 | "chokidar",
460 | "dedent",
461 | "es-module-lexer",
462 | "exit-hook",
463 | "fs-extra",
464 | "gunzip-maybe",
465 | "jsesc",
466 | "lodash",
467 | "pathe",
468 | "picocolors",
469 | "picomatch",
470 | "prettier",
471 | "react-refresh",
472 | "react-router",
473 | "semver@7.7.1",
474 | "set-cookie-parser",
475 | "valibot",
476 | "vite@6.1.1_@types+node@22.13.5_lightningcss@1.29.1",
477 | "vite-node"
478 | ]
479 | },
480 | "@react-router/node@7.2.0_react-router@7.2.0__react@19.0.0__react-dom@19.0.0___react@19.0.0_react@19.0.0_react-dom@19.0.0__react@19.0.0": {
481 | "integrity": "sha512-CqBHLwvvV4BB8htmaSwT+SOwX9B4RVOIiEdTlaIp12sNVCGSYDIEGbv3T4Wxeq8p5ynNfhNcdBeXtZ6ZPWVozA==",
482 | "dependencies": [
483 | "@mjackson/node-fetch-server",
484 | "react-router",
485 | "source-map-support",
486 | "stream-slice",
487 | "undici"
488 | ]
489 | },
490 | "@rollup/rollup-android-arm-eabi@4.34.8": {
491 | "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw=="
492 | },
493 | "@rollup/rollup-android-arm64@4.34.8": {
494 | "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q=="
495 | },
496 | "@rollup/rollup-darwin-arm64@4.34.8": {
497 | "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q=="
498 | },
499 | "@rollup/rollup-darwin-x64@4.34.8": {
500 | "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw=="
501 | },
502 | "@rollup/rollup-freebsd-arm64@4.34.8": {
503 | "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA=="
504 | },
505 | "@rollup/rollup-freebsd-x64@4.34.8": {
506 | "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q=="
507 | },
508 | "@rollup/rollup-linux-arm-gnueabihf@4.34.8": {
509 | "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g=="
510 | },
511 | "@rollup/rollup-linux-arm-musleabihf@4.34.8": {
512 | "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA=="
513 | },
514 | "@rollup/rollup-linux-arm64-gnu@4.34.8": {
515 | "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A=="
516 | },
517 | "@rollup/rollup-linux-arm64-musl@4.34.8": {
518 | "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q=="
519 | },
520 | "@rollup/rollup-linux-loongarch64-gnu@4.34.8": {
521 | "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ=="
522 | },
523 | "@rollup/rollup-linux-powerpc64le-gnu@4.34.8": {
524 | "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw=="
525 | },
526 | "@rollup/rollup-linux-riscv64-gnu@4.34.8": {
527 | "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw=="
528 | },
529 | "@rollup/rollup-linux-s390x-gnu@4.34.8": {
530 | "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA=="
531 | },
532 | "@rollup/rollup-linux-x64-gnu@4.34.8": {
533 | "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA=="
534 | },
535 | "@rollup/rollup-linux-x64-musl@4.34.8": {
536 | "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ=="
537 | },
538 | "@rollup/rollup-win32-arm64-msvc@4.34.8": {
539 | "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ=="
540 | },
541 | "@rollup/rollup-win32-ia32-msvc@4.34.8": {
542 | "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w=="
543 | },
544 | "@rollup/rollup-win32-x64-msvc@4.34.8": {
545 | "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g=="
546 | },
547 | "@tailwindcss/node@4.0.8": {
548 | "integrity": "sha512-FKArQpbrbwv08TNT0k7ejYXpF+R8knZFAatNc0acOxbgeqLzwb86r+P3LGOjIeI3Idqe9CVkZrh4GlsJLJKkkw==",
549 | "dependencies": [
550 | "enhanced-resolve",
551 | "jiti",
552 | "tailwindcss"
553 | ]
554 | },
555 | "@tailwindcss/oxide-android-arm64@4.0.8": {
556 | "integrity": "sha512-We7K79+Sm4mwJHk26Yzu/GAj7C7myemm7PeXvpgMxyxO70SSFSL3uCcqFbz9JA5M5UPkrl7N9fkBe/Y0iazqpA=="
557 | },
558 | "@tailwindcss/oxide-darwin-arm64@4.0.8": {
559 | "integrity": "sha512-Lv9Isi2EwkCTG1sRHNDi0uRNN1UGFdEThUAGFrydRmQZnraGLMjN8gahzg2FFnOizDl7LB2TykLUuiw833DSNg=="
560 | },
561 | "@tailwindcss/oxide-darwin-x64@4.0.8": {
562 | "integrity": "sha512-fWfywfYIlSWtKoqWTjukTHLWV3ARaBRjXCC2Eo0l6KVpaqGY4c2y8snUjp1xpxUtpqwMvCvFWFaleMoz1Vhzlw=="
563 | },
564 | "@tailwindcss/oxide-freebsd-x64@4.0.8": {
565 | "integrity": "sha512-SO+dyvjJV9G94bnmq2288Ke0BIdvrbSbvtPLaQdqjqHR83v5L2fWADyFO+1oecHo9Owsk8MxcXh1agGVPIKIqw=="
566 | },
567 | "@tailwindcss/oxide-linux-arm-gnueabihf@4.0.8": {
568 | "integrity": "sha512-ZSHggWiEblQNV69V0qUK5vuAtHP+I+S2eGrKGJ5lPgwgJeAd6GjLsVBN+Mqn2SPVfYM3BOpS9jX/zVg9RWQVDQ=="
569 | },
570 | "@tailwindcss/oxide-linux-arm64-gnu@4.0.8": {
571 | "integrity": "sha512-xWpr6M0OZLDNsr7+bQz+3X7zcnDJZJ1N9gtBWCtfhkEtDjjxYEp+Lr5L5nc/yXlL4MyCHnn0uonGVXy3fhxaVA=="
572 | },
573 | "@tailwindcss/oxide-linux-arm64-musl@4.0.8": {
574 | "integrity": "sha512-5tz2IL7LN58ssGEq7h/staD7pu/izF/KeMWdlJ86WDe2Ah46LF3ET6ZGKTr5eZMrnEA0M9cVFuSPprKRHNgjeg=="
575 | },
576 | "@tailwindcss/oxide-linux-x64-gnu@4.0.8": {
577 | "integrity": "sha512-KSzMkhyrxAQyY2o194NKVKU9j/c+NFSoMvnHWFaNHKi3P1lb+Vq1UC19tLHrmxSkKapcMMu69D7+G1+FVGNDXQ=="
578 | },
579 | "@tailwindcss/oxide-linux-x64-musl@4.0.8": {
580 | "integrity": "sha512-yFYKG5UtHTRimjtqxUWXBgI4Tc6NJe3USjRIVdlTczpLRxq/SFwgzGl5JbatCxgSRDPBFwRrNPxq+ukfQFGdrw=="
581 | },
582 | "@tailwindcss/oxide-win32-arm64-msvc@4.0.8": {
583 | "integrity": "sha512-tndGujmCSba85cRCnQzXgpA2jx5gXimyspsUYae5jlPyLRG0RjXbDshFKOheVXU4TLflo7FSG8EHCBJ0EHTKdQ=="
584 | },
585 | "@tailwindcss/oxide-win32-x64-msvc@4.0.8": {
586 | "integrity": "sha512-T77jroAc0p4EHVVgTUiNeFn6Nj3jtD3IeNId2X+0k+N1XxfNipy81BEkYErpKLiOkNhpNFjPee8/ZVas29b2OQ=="
587 | },
588 | "@tailwindcss/oxide@4.0.8": {
589 | "integrity": "sha512-KfMcuAu/Iw+DcV1e8twrFyr2yN8/ZDC/odIGta4wuuJOGkrkHZbvJvRNIbQNhGh7erZTYV6Ie0IeD6WC9Y8Hcw==",
590 | "dependencies": [
591 | "@tailwindcss/oxide-android-arm64",
592 | "@tailwindcss/oxide-darwin-arm64",
593 | "@tailwindcss/oxide-darwin-x64",
594 | "@tailwindcss/oxide-freebsd-x64",
595 | "@tailwindcss/oxide-linux-arm-gnueabihf",
596 | "@tailwindcss/oxide-linux-arm64-gnu",
597 | "@tailwindcss/oxide-linux-arm64-musl",
598 | "@tailwindcss/oxide-linux-x64-gnu",
599 | "@tailwindcss/oxide-linux-x64-musl",
600 | "@tailwindcss/oxide-win32-arm64-msvc",
601 | "@tailwindcss/oxide-win32-x64-msvc"
602 | ]
603 | },
604 | "@tailwindcss/vite@4.0.8_vite@6.1.1__@types+node@22.13.5__lightningcss@1.29.1_@types+node@22.13.5_lightningcss@1.29.1": {
605 | "integrity": "sha512-+SAq44yLzYlzyrb7QTcFCdU8Xa7FOA0jp+Xby7fPMUie+MY9HhJysM7Vp+vL8qIp8ceQJfLD+FjgJuJ4lL6nyg==",
606 | "dependencies": [
607 | "@tailwindcss/node",
608 | "@tailwindcss/oxide",
609 | "lightningcss",
610 | "tailwindcss",
611 | "vite@6.1.1_@types+node@22.13.5_lightningcss@1.29.1"
612 | ]
613 | },
614 | "@types/cookie@0.6.0": {
615 | "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="
616 | },
617 | "@types/estree@1.0.6": {
618 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="
619 | },
620 | "@types/node@22.13.5": {
621 | "integrity": "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==",
622 | "dependencies": [
623 | "undici-types"
624 | ]
625 | },
626 | "@types/react-dom@19.0.4_@types+react@19.0.10": {
627 | "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==",
628 | "dependencies": [
629 | "@types/react"
630 | ]
631 | },
632 | "@types/react@19.0.10": {
633 | "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==",
634 | "dependencies": [
635 | "csstype"
636 | ]
637 | },
638 | "ansi-regex@5.0.1": {
639 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
640 | },
641 | "ansi-regex@6.1.0": {
642 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="
643 | },
644 | "ansi-styles@4.3.0": {
645 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
646 | "dependencies": [
647 | "color-convert"
648 | ]
649 | },
650 | "ansi-styles@6.2.1": {
651 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="
652 | },
653 | "arg@5.0.2": {
654 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="
655 | },
656 | "babel-dead-code-elimination@1.0.9": {
657 | "integrity": "sha512-JLIhax/xullfInZjtu13UJjaLHDeTzt3vOeomaSUdO/nAMEL/pWC/laKrSvWylXMnVWyL5bpmG9njqBZlUQOdg==",
658 | "dependencies": [
659 | "@babel/core",
660 | "@babel/parser",
661 | "@babel/traverse",
662 | "@babel/types"
663 | ]
664 | },
665 | "balanced-match@1.0.2": {
666 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
667 | },
668 | "brace-expansion@2.0.1": {
669 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
670 | "dependencies": [
671 | "balanced-match"
672 | ]
673 | },
674 | "browserify-zlib@0.1.4": {
675 | "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==",
676 | "dependencies": [
677 | "pako"
678 | ]
679 | },
680 | "browserslist@4.24.4": {
681 | "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
682 | "dependencies": [
683 | "caniuse-lite",
684 | "electron-to-chromium",
685 | "node-releases",
686 | "update-browserslist-db"
687 | ]
688 | },
689 | "buffer-from@1.1.2": {
690 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
691 | },
692 | "cac@6.7.14": {
693 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="
694 | },
695 | "caniuse-lite@1.0.30001700": {
696 | "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ=="
697 | },
698 | "chokidar@4.0.3": {
699 | "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
700 | "dependencies": [
701 | "readdirp"
702 | ]
703 | },
704 | "color-convert@2.0.1": {
705 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
706 | "dependencies": [
707 | "color-name"
708 | ]
709 | },
710 | "color-name@1.1.4": {
711 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
712 | },
713 | "convert-source-map@2.0.0": {
714 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
715 | },
716 | "cookie@1.0.2": {
717 | "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="
718 | },
719 | "core-util-is@1.0.3": {
720 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
721 | },
722 | "cross-spawn@7.0.6": {
723 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
724 | "dependencies": [
725 | "path-key",
726 | "shebang-command",
727 | "which@2.0.2"
728 | ]
729 | },
730 | "csstype@3.1.3": {
731 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
732 | },
733 | "debug@4.4.0": {
734 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
735 | "dependencies": [
736 | "ms"
737 | ]
738 | },
739 | "dedent@1.5.3": {
740 | "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ=="
741 | },
742 | "detect-libc@1.0.3": {
743 | "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="
744 | },
745 | "duplexify@3.7.1": {
746 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
747 | "dependencies": [
748 | "end-of-stream",
749 | "inherits",
750 | "readable-stream",
751 | "stream-shift"
752 | ]
753 | },
754 | "eastasianwidth@0.2.0": {
755 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
756 | },
757 | "electron-to-chromium@1.5.103": {
758 | "integrity": "sha512-P6+XzIkfndgsrjROJWfSvVEgNHtPgbhVyTkwLjUM2HU/h7pZRORgaTlHqfAikqxKmdJMLW8fftrdGWbd/Ds0FA=="
759 | },
760 | "emoji-regex@8.0.0": {
761 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
762 | },
763 | "emoji-regex@9.2.2": {
764 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
765 | },
766 | "end-of-stream@1.4.4": {
767 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
768 | "dependencies": [
769 | "once"
770 | ]
771 | },
772 | "enhanced-resolve@5.18.1": {
773 | "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==",
774 | "dependencies": [
775 | "graceful-fs",
776 | "tapable"
777 | ]
778 | },
779 | "err-code@2.0.3": {
780 | "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="
781 | },
782 | "es-module-lexer@1.6.0": {
783 | "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ=="
784 | },
785 | "esbuild@0.24.2": {
786 | "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==",
787 | "dependencies": [
788 | "@esbuild/aix-ppc64",
789 | "@esbuild/android-arm",
790 | "@esbuild/android-arm64",
791 | "@esbuild/android-x64",
792 | "@esbuild/darwin-arm64",
793 | "@esbuild/darwin-x64",
794 | "@esbuild/freebsd-arm64",
795 | "@esbuild/freebsd-x64",
796 | "@esbuild/linux-arm",
797 | "@esbuild/linux-arm64",
798 | "@esbuild/linux-ia32",
799 | "@esbuild/linux-loong64",
800 | "@esbuild/linux-mips64el",
801 | "@esbuild/linux-ppc64",
802 | "@esbuild/linux-riscv64",
803 | "@esbuild/linux-s390x",
804 | "@esbuild/linux-x64",
805 | "@esbuild/netbsd-arm64",
806 | "@esbuild/netbsd-x64",
807 | "@esbuild/openbsd-arm64",
808 | "@esbuild/openbsd-x64",
809 | "@esbuild/sunos-x64",
810 | "@esbuild/win32-arm64",
811 | "@esbuild/win32-ia32",
812 | "@esbuild/win32-x64"
813 | ]
814 | },
815 | "escalade@3.2.0": {
816 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="
817 | },
818 | "exit-hook@2.2.1": {
819 | "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw=="
820 | },
821 | "foreground-child@3.3.0": {
822 | "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
823 | "dependencies": [
824 | "cross-spawn",
825 | "signal-exit"
826 | ]
827 | },
828 | "fs-extra@10.1.0": {
829 | "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
830 | "dependencies": [
831 | "graceful-fs",
832 | "jsonfile",
833 | "universalify"
834 | ]
835 | },
836 | "fsevents@2.3.3": {
837 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="
838 | },
839 | "function-bind@1.1.2": {
840 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
841 | },
842 | "gensync@1.0.0-beta.2": {
843 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
844 | },
845 | "glob@10.4.5": {
846 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
847 | "dependencies": [
848 | "foreground-child",
849 | "jackspeak",
850 | "minimatch",
851 | "minipass",
852 | "package-json-from-dist",
853 | "path-scurry"
854 | ]
855 | },
856 | "globals@11.12.0": {
857 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
858 | },
859 | "graceful-fs@4.2.11": {
860 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
861 | },
862 | "gunzip-maybe@1.4.2": {
863 | "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==",
864 | "dependencies": [
865 | "browserify-zlib",
866 | "is-deflate",
867 | "is-gzip",
868 | "peek-stream",
869 | "pumpify",
870 | "through2"
871 | ]
872 | },
873 | "hasown@2.0.2": {
874 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
875 | "dependencies": [
876 | "function-bind"
877 | ]
878 | },
879 | "hosted-git-info@6.1.3": {
880 | "integrity": "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==",
881 | "dependencies": [
882 | "lru-cache@7.18.3"
883 | ]
884 | },
885 | "inherits@2.0.4": {
886 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
887 | },
888 | "is-core-module@2.16.1": {
889 | "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
890 | "dependencies": [
891 | "hasown"
892 | ]
893 | },
894 | "is-deflate@1.0.0": {
895 | "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ=="
896 | },
897 | "is-fullwidth-code-point@3.0.0": {
898 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
899 | },
900 | "is-gzip@1.0.0": {
901 | "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ=="
902 | },
903 | "isarray@1.0.0": {
904 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
905 | },
906 | "isbot@5.1.23": {
907 | "integrity": "sha512-ie3ehy2iXdkuzaZx32SoKb9b8l9Cm8cqQ1lJjQXnq8GRTrk/Jx7IUDcB4mhlw6H3gWaMqGYoWeV0lPv1P/20Ig=="
908 | },
909 | "isexe@2.0.0": {
910 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
911 | },
912 | "jackspeak@3.4.3": {
913 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
914 | "dependencies": [
915 | "@isaacs/cliui",
916 | "@pkgjs/parseargs"
917 | ]
918 | },
919 | "jiti@2.4.2": {
920 | "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="
921 | },
922 | "js-tokens@4.0.0": {
923 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
924 | },
925 | "jsesc@3.0.2": {
926 | "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="
927 | },
928 | "json-parse-even-better-errors@3.0.2": {
929 | "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="
930 | },
931 | "json5@2.2.3": {
932 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
933 | },
934 | "jsonfile@6.1.0": {
935 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
936 | "dependencies": [
937 | "graceful-fs",
938 | "universalify"
939 | ]
940 | },
941 | "lightningcss-darwin-arm64@1.29.1": {
942 | "integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw=="
943 | },
944 | "lightningcss-darwin-x64@1.29.1": {
945 | "integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA=="
946 | },
947 | "lightningcss-freebsd-x64@1.29.1": {
948 | "integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ=="
949 | },
950 | "lightningcss-linux-arm-gnueabihf@1.29.1": {
951 | "integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg=="
952 | },
953 | "lightningcss-linux-arm64-gnu@1.29.1": {
954 | "integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ=="
955 | },
956 | "lightningcss-linux-arm64-musl@1.29.1": {
957 | "integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw=="
958 | },
959 | "lightningcss-linux-x64-gnu@1.29.1": {
960 | "integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw=="
961 | },
962 | "lightningcss-linux-x64-musl@1.29.1": {
963 | "integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw=="
964 | },
965 | "lightningcss-win32-arm64-msvc@1.29.1": {
966 | "integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog=="
967 | },
968 | "lightningcss-win32-x64-msvc@1.29.1": {
969 | "integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q=="
970 | },
971 | "lightningcss@1.29.1": {
972 | "integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==",
973 | "dependencies": [
974 | "detect-libc",
975 | "lightningcss-darwin-arm64",
976 | "lightningcss-darwin-x64",
977 | "lightningcss-freebsd-x64",
978 | "lightningcss-linux-arm-gnueabihf",
979 | "lightningcss-linux-arm64-gnu",
980 | "lightningcss-linux-arm64-musl",
981 | "lightningcss-linux-x64-gnu",
982 | "lightningcss-linux-x64-musl",
983 | "lightningcss-win32-arm64-msvc",
984 | "lightningcss-win32-x64-msvc"
985 | ]
986 | },
987 | "lodash@4.17.21": {
988 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
989 | },
990 | "lru-cache@10.4.3": {
991 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="
992 | },
993 | "lru-cache@5.1.1": {
994 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
995 | "dependencies": [
996 | "yallist"
997 | ]
998 | },
999 | "lru-cache@7.18.3": {
1000 | "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="
1001 | },
1002 | "minimatch@9.0.5": {
1003 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
1004 | "dependencies": [
1005 | "brace-expansion"
1006 | ]
1007 | },
1008 | "minipass@7.1.2": {
1009 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="
1010 | },
1011 | "ms@2.1.3": {
1012 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1013 | },
1014 | "nanoid@3.3.8": {
1015 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="
1016 | },
1017 | "node-releases@2.0.19": {
1018 | "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="
1019 | },
1020 | "normalize-package-data@5.0.0": {
1021 | "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==",
1022 | "dependencies": [
1023 | "hosted-git-info",
1024 | "is-core-module",
1025 | "semver@7.7.1",
1026 | "validate-npm-package-license"
1027 | ]
1028 | },
1029 | "npm-install-checks@6.3.0": {
1030 | "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==",
1031 | "dependencies": [
1032 | "semver@7.7.1"
1033 | ]
1034 | },
1035 | "npm-normalize-package-bin@3.0.1": {
1036 | "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ=="
1037 | },
1038 | "npm-package-arg@10.1.0": {
1039 | "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==",
1040 | "dependencies": [
1041 | "hosted-git-info",
1042 | "proc-log",
1043 | "semver@7.7.1",
1044 | "validate-npm-package-name"
1045 | ]
1046 | },
1047 | "npm-pick-manifest@8.0.2": {
1048 | "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==",
1049 | "dependencies": [
1050 | "npm-install-checks",
1051 | "npm-normalize-package-bin",
1052 | "npm-package-arg",
1053 | "semver@7.7.1"
1054 | ]
1055 | },
1056 | "once@1.4.0": {
1057 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1058 | "dependencies": [
1059 | "wrappy"
1060 | ]
1061 | },
1062 | "package-json-from-dist@1.0.1": {
1063 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="
1064 | },
1065 | "pako@0.2.9": {
1066 | "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="
1067 | },
1068 | "path-key@3.1.1": {
1069 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
1070 | },
1071 | "path-scurry@1.11.1": {
1072 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
1073 | "dependencies": [
1074 | "lru-cache@10.4.3",
1075 | "minipass"
1076 | ]
1077 | },
1078 | "pathe@1.1.2": {
1079 | "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
1080 | },
1081 | "peek-stream@1.1.3": {
1082 | "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==",
1083 | "dependencies": [
1084 | "buffer-from",
1085 | "duplexify",
1086 | "through2"
1087 | ]
1088 | },
1089 | "picocolors@1.1.1": {
1090 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
1091 | },
1092 | "picomatch@2.3.1": {
1093 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
1094 | },
1095 | "postcss@8.5.3": {
1096 | "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
1097 | "dependencies": [
1098 | "nanoid",
1099 | "picocolors",
1100 | "source-map-js"
1101 | ]
1102 | },
1103 | "prettier@2.8.8": {
1104 | "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="
1105 | },
1106 | "proc-log@3.0.0": {
1107 | "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A=="
1108 | },
1109 | "process-nextick-args@2.0.1": {
1110 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
1111 | },
1112 | "promise-inflight@1.0.1": {
1113 | "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g=="
1114 | },
1115 | "promise-retry@2.0.1": {
1116 | "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
1117 | "dependencies": [
1118 | "err-code",
1119 | "retry"
1120 | ]
1121 | },
1122 | "pump@2.0.1": {
1123 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
1124 | "dependencies": [
1125 | "end-of-stream",
1126 | "once"
1127 | ]
1128 | },
1129 | "pumpify@1.5.1": {
1130 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
1131 | "dependencies": [
1132 | "duplexify",
1133 | "inherits",
1134 | "pump"
1135 | ]
1136 | },
1137 | "react-dom@19.0.0_react@19.0.0": {
1138 | "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==",
1139 | "dependencies": [
1140 | "react",
1141 | "scheduler"
1142 | ]
1143 | },
1144 | "react-refresh@0.14.2": {
1145 | "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="
1146 | },
1147 | "react-router@7.2.0_react@19.0.0_react-dom@19.0.0__react@19.0.0": {
1148 | "integrity": "sha512-fXyqzPgCPZbqhrk7k3hPcCpYIlQ2ugIXDboHUzhJISFVy2DEPsmHgN588MyGmkIOv3jDgNfUE3kJi83L28s/LQ==",
1149 | "dependencies": [
1150 | "@types/cookie",
1151 | "cookie",
1152 | "react",
1153 | "react-dom",
1154 | "set-cookie-parser",
1155 | "turbo-stream"
1156 | ]
1157 | },
1158 | "react@19.0.0": {
1159 | "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="
1160 | },
1161 | "readable-stream@2.3.8": {
1162 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
1163 | "dependencies": [
1164 | "core-util-is",
1165 | "inherits",
1166 | "isarray",
1167 | "process-nextick-args",
1168 | "safe-buffer",
1169 | "string_decoder",
1170 | "util-deprecate"
1171 | ]
1172 | },
1173 | "readdirp@4.1.2": {
1174 | "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="
1175 | },
1176 | "retry@0.12.0": {
1177 | "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="
1178 | },
1179 | "rollup@4.34.8": {
1180 | "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==",
1181 | "dependencies": [
1182 | "@rollup/rollup-android-arm-eabi",
1183 | "@rollup/rollup-android-arm64",
1184 | "@rollup/rollup-darwin-arm64",
1185 | "@rollup/rollup-darwin-x64",
1186 | "@rollup/rollup-freebsd-arm64",
1187 | "@rollup/rollup-freebsd-x64",
1188 | "@rollup/rollup-linux-arm-gnueabihf",
1189 | "@rollup/rollup-linux-arm-musleabihf",
1190 | "@rollup/rollup-linux-arm64-gnu",
1191 | "@rollup/rollup-linux-arm64-musl",
1192 | "@rollup/rollup-linux-loongarch64-gnu",
1193 | "@rollup/rollup-linux-powerpc64le-gnu",
1194 | "@rollup/rollup-linux-riscv64-gnu",
1195 | "@rollup/rollup-linux-s390x-gnu",
1196 | "@rollup/rollup-linux-x64-gnu",
1197 | "@rollup/rollup-linux-x64-musl",
1198 | "@rollup/rollup-win32-arm64-msvc",
1199 | "@rollup/rollup-win32-ia32-msvc",
1200 | "@rollup/rollup-win32-x64-msvc",
1201 | "@types/estree",
1202 | "fsevents"
1203 | ]
1204 | },
1205 | "safe-buffer@5.1.2": {
1206 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1207 | },
1208 | "scheduler@0.25.0": {
1209 | "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="
1210 | },
1211 | "semver@6.3.1": {
1212 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
1213 | },
1214 | "semver@7.7.1": {
1215 | "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="
1216 | },
1217 | "set-cookie-parser@2.7.1": {
1218 | "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="
1219 | },
1220 | "shebang-command@2.0.0": {
1221 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1222 | "dependencies": [
1223 | "shebang-regex"
1224 | ]
1225 | },
1226 | "shebang-regex@3.0.0": {
1227 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
1228 | },
1229 | "signal-exit@4.1.0": {
1230 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="
1231 | },
1232 | "source-map-js@1.2.1": {
1233 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
1234 | },
1235 | "source-map-support@0.5.21": {
1236 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
1237 | "dependencies": [
1238 | "buffer-from",
1239 | "source-map"
1240 | ]
1241 | },
1242 | "source-map@0.6.1": {
1243 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
1244 | },
1245 | "spdx-correct@3.2.0": {
1246 | "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
1247 | "dependencies": [
1248 | "spdx-expression-parse",
1249 | "spdx-license-ids"
1250 | ]
1251 | },
1252 | "spdx-exceptions@2.5.0": {
1253 | "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="
1254 | },
1255 | "spdx-expression-parse@3.0.1": {
1256 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
1257 | "dependencies": [
1258 | "spdx-exceptions",
1259 | "spdx-license-ids"
1260 | ]
1261 | },
1262 | "spdx-license-ids@3.0.21": {
1263 | "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg=="
1264 | },
1265 | "stream-shift@1.0.3": {
1266 | "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ=="
1267 | },
1268 | "stream-slice@0.1.2": {
1269 | "integrity": "sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA=="
1270 | },
1271 | "string-width@4.2.3": {
1272 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1273 | "dependencies": [
1274 | "emoji-regex@8.0.0",
1275 | "is-fullwidth-code-point",
1276 | "strip-ansi@6.0.1"
1277 | ]
1278 | },
1279 | "string-width@5.1.2": {
1280 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
1281 | "dependencies": [
1282 | "eastasianwidth",
1283 | "emoji-regex@9.2.2",
1284 | "strip-ansi@7.1.0"
1285 | ]
1286 | },
1287 | "string_decoder@1.1.1": {
1288 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1289 | "dependencies": [
1290 | "safe-buffer"
1291 | ]
1292 | },
1293 | "strip-ansi@6.0.1": {
1294 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1295 | "dependencies": [
1296 | "ansi-regex@5.0.1"
1297 | ]
1298 | },
1299 | "strip-ansi@7.1.0": {
1300 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
1301 | "dependencies": [
1302 | "ansi-regex@6.1.0"
1303 | ]
1304 | },
1305 | "tailwindcss@4.0.8": {
1306 | "integrity": "sha512-Me7N5CKR+D2A1xdWA5t5+kjjT7bwnxZOE6/yDI/ixJdJokszsn2n++mdU5yJwrsTpqFX2B9ZNMBJDwcqk9C9lw=="
1307 | },
1308 | "tapable@2.2.1": {
1309 | "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="
1310 | },
1311 | "through2@2.0.5": {
1312 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
1313 | "dependencies": [
1314 | "readable-stream",
1315 | "xtend"
1316 | ]
1317 | },
1318 | "turbo-stream@2.4.0": {
1319 | "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g=="
1320 | },
1321 | "undici-types@6.20.0": {
1322 | "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="
1323 | },
1324 | "undici@6.21.1": {
1325 | "integrity": "sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ=="
1326 | },
1327 | "universalify@2.0.1": {
1328 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="
1329 | },
1330 | "update-browserslist-db@1.1.2_browserslist@4.24.4": {
1331 | "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
1332 | "dependencies": [
1333 | "browserslist",
1334 | "escalade",
1335 | "picocolors"
1336 | ]
1337 | },
1338 | "util-deprecate@1.0.2": {
1339 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
1340 | },
1341 | "valibot@0.41.0": {
1342 | "integrity": "sha512-igDBb8CTYr8YTQlOKgaN9nSS0Be7z+WRuaeYqGf3Cjz3aKmSnqEmYnkfVjzIuumGqfHpa3fLIvMEAfhrpqN8ng=="
1343 | },
1344 | "validate-npm-package-license@3.0.4": {
1345 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
1346 | "dependencies": [
1347 | "spdx-correct",
1348 | "spdx-expression-parse"
1349 | ]
1350 | },
1351 | "validate-npm-package-name@5.0.1": {
1352 | "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ=="
1353 | },
1354 | "vite-node@3.0.0-beta.2_@types+node@22.13.5": {
1355 | "integrity": "sha512-ofTf6cfRdL30Wbl9n/BX81EyIR5s4PReLmSurrxQ+koLaWUNOEo8E0lCM53OJkb8vpa2URM2nSrxZsIFyvY1rg==",
1356 | "dependencies": [
1357 | "cac",
1358 | "debug",
1359 | "es-module-lexer",
1360 | "pathe",
1361 | "vite@6.1.1_@types+node@22.13.5"
1362 | ]
1363 | },
1364 | "vite@6.1.1_@types+node@22.13.5": {
1365 | "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==",
1366 | "dependencies": [
1367 | "@types/node",
1368 | "esbuild",
1369 | "fsevents",
1370 | "postcss",
1371 | "rollup"
1372 | ]
1373 | },
1374 | "vite@6.1.1_@types+node@22.13.5_lightningcss@1.29.1": {
1375 | "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==",
1376 | "dependencies": [
1377 | "@types/node",
1378 | "esbuild",
1379 | "fsevents",
1380 | "lightningcss",
1381 | "postcss",
1382 | "rollup"
1383 | ]
1384 | },
1385 | "which@2.0.2": {
1386 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1387 | "dependencies": [
1388 | "isexe"
1389 | ]
1390 | },
1391 | "which@3.0.1": {
1392 | "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
1393 | "dependencies": [
1394 | "isexe"
1395 | ]
1396 | },
1397 | "wrap-ansi@7.0.0": {
1398 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
1399 | "dependencies": [
1400 | "ansi-styles@4.3.0",
1401 | "string-width@4.2.3",
1402 | "strip-ansi@6.0.1"
1403 | ]
1404 | },
1405 | "wrap-ansi@8.1.0": {
1406 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
1407 | "dependencies": [
1408 | "ansi-styles@6.2.1",
1409 | "string-width@5.1.2",
1410 | "strip-ansi@7.1.0"
1411 | ]
1412 | },
1413 | "wrappy@1.0.2": {
1414 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
1415 | },
1416 | "xtend@4.0.2": {
1417 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
1418 | },
1419 | "yallist@3.1.1": {
1420 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
1421 | }
1422 | },
1423 | "workspace": {
1424 | "dependencies": [
1425 | "jsr:@std/http@^1.0.11",
1426 | "jsr:@std/path@^1.0.8"
1427 | ],
1428 | "packageJson": {
1429 | "dependencies": [
1430 | "npm:@deno/vite-plugin@^1.0.2",
1431 | "npm:@react-router/dev@*",
1432 | "npm:@tailwindcss/vite@^4.0.8",
1433 | "npm:@types/node@^22.10.2",
1434 | "npm:@types/react-dom@^19.0.2",
1435 | "npm:@types/react@^19.0.2",
1436 | "npm:isbot@^5.1.18",
1437 | "npm:react-dom@19",
1438 | "npm:react-router@*",
1439 | "npm:react@19",
1440 | "npm:tailwindcss@^4.0.8",
1441 | "npm:vite@^6.0.5"
1442 | ]
1443 | }
1444 | }
1445 | }
1446 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "private": true,
3 | "type": "module",
4 | "dependencies": {
5 | "isbot": "^5.1.18",
6 | "react": "^19.0.0",
7 | "react-dom": "^19.0.0",
8 | "react-router": "*"
9 | },
10 | "devDependencies": {
11 | "@deno/vite-plugin": "^1.0.2",
12 | "@react-router/dev": "*",
13 | "@tailwindcss/vite": "^4.0.8",
14 | "@types/node": "^22.10.2",
15 | "@types/react": "^19.0.2",
16 | "@types/react-dom": "^19.0.2",
17 | "tailwindcss": "^4.0.8",
18 | "vite": "^6.0.5"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/redabacha/react-router-deno-template/ea0ae6cdb90fc8766378665d035b9d4e9297cebf/public/favicon.ico
--------------------------------------------------------------------------------
/react-router.config.ts:
--------------------------------------------------------------------------------
1 | import type { Config } from "@react-router/dev/config";
2 |
3 | export default {
4 | // Config options...
5 | // Server-side render by default, to enable SPA mode set this to `false`
6 | ssr: true,
7 | } satisfies Config;
8 |
--------------------------------------------------------------------------------
/server.production.ts:
--------------------------------------------------------------------------------
1 | import { serveFile } from "@std/http/file-server";
2 | import { join } from "@std/path/join";
3 | import { createRequestHandler } from "react-router";
4 |
5 | const handleRequest = createRequestHandler(
6 | // @ts-expect-error - build output
7 | await import("./build/server/index.js"),
8 | "production",
9 | );
10 |
11 | Deno.serve(async (request) => {
12 | const pathname = new URL(request.url).pathname;
13 |
14 | try {
15 | const filePath = join("./build/client", pathname);
16 | const fileInfo = await Deno.stat(filePath);
17 |
18 | if (fileInfo.isDirectory) {
19 | throw new Deno.errors.NotFound();
20 | }
21 |
22 | const response = await serveFile(request, filePath, { fileInfo });
23 |
24 | if (pathname.startsWith("/assets/")) {
25 | response.headers.set(
26 | "cache-control",
27 | "public, max-age=31536000, immutable",
28 | );
29 | } else {
30 | response.headers.set("cache-control", "public, max-age=600");
31 | }
32 |
33 | return response;
34 | } catch (error) {
35 | if (!(error instanceof Deno.errors.NotFound)) {
36 | throw error;
37 | }
38 | }
39 |
40 | return handleRequest(request);
41 | });
42 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import deno from "@deno/vite-plugin";
2 | import { reactRouter } from "@react-router/dev/vite";
3 | import tailwindcss from "@tailwindcss/vite";
4 | import { defineConfig } from "vite";
5 |
6 | export default defineConfig({
7 | plugins: [deno(), tailwindcss(), reactRouter()],
8 | ssr: {
9 | resolve: {
10 | conditions: ["module", "deno", "node", "development|production"],
11 | externalConditions: ["deno", "node"],
12 | },
13 | },
14 | });
15 |
--------------------------------------------------------------------------------