diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000000000000000000000000000000000000..5c169237f517c6e6b24217e26ebc5dbaa46deb5d
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,5 @@
+*.mp4 filter=lfs diff=lfs merge=lfs -text
+*.gif filter=lfs diff=lfs merge=lfs -text
+*.png filter=lfs diff=lfs merge=lfs -text
+*.jpg filter=lfs diff=lfs merge=lfs -text
+*.jpeg filter=lfs diff=lfs merge=lfs -text
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..a547bf36d8d11a4f89c59c144f24795749086dd1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..175ae719269e3496b8a77fdbaf6d6bbedf599481
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,52 @@
+# Build stage
+FROM node:20-slim AS builder
+
+WORKDIR /app
+
+# Copy package files
+COPY package.json yarn.lock ./
+
+# Install dependencies
+RUN yarn install --frozen-lockfile
+
+# Copy source code
+COPY . .
+
+# Build the app
+RUN yarn build
+
+# Production stage - nginx with dev mode support
+FROM nginx:bookworm
+
+# Install required packages for HF Spaces Dev Mode
+RUN apt-get update && \
+ apt-get install -y \
+ bash \
+ git git-lfs \
+ wget curl procps \
+ htop vim nano && \
+ rm -rf /var/lib/apt/lists/*
+
+# Setup /app directory for Dev Mode compatibility
+WORKDIR /app
+
+# Remove default nginx config
+RUN rm /etc/nginx/conf.d/default.conf 2>/dev/null || true
+
+# Copy custom nginx config
+COPY nginx.conf /etc/nginx/conf.d/default.conf
+
+# Copy built files from builder stage
+COPY --from=builder /app/dist /usr/share/nginx/html
+
+# Copy source for Dev Mode (so you can edit and rebuild)
+COPY --from=builder /app /app
+
+# Make /app owned by user 1000 for Dev Mode
+RUN chown -R 1000:1000 /app
+
+# Expose port
+EXPOSE 7860
+
+# Use CMD (required by Dev Mode, not ENTRYPOINT)
+CMD ["nginx", "-g", "daemon off;"]
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..55be64110225ac1ad935f7702050f8f0054a6942
--- /dev/null
+++ b/README.md
@@ -0,0 +1,50 @@
+---
+title: Reachy Mini
+emoji: 🤖
+colorFrom: blue
+colorTo: purple
+sdk: docker
+pinned: false
+---
+
+# Reachy Mini Website
+
+The official website for Reachy Mini - an expressive companion robot designed for human interaction, creative coding, and AI experimentation.
+
+## 🚀 Auto-deploy
+
+This site builds automatically on Hugging Face Spaces using Docker:
+1. Push to this repo
+2. HF builds the Docker image (Node.js + Vite build)
+3. Serves the static site with nginx
+
+## 💻 Local Development
+
+```bash
+# Install dependencies
+yarn install
+
+# Start dev server
+yarn dev
+
+# Build for production
+yarn build
+```
+
+## 🛠️ Stack
+
+- **Vite** + **React 19**
+- **MUI (Material-UI)** for components
+- **React Router** for navigation
+- **React Spring** for animations
+
+## 📁 Structure
+
+```
+src/
+├── components/ # Reusable UI components
+├── context/ # React context (AppsContext)
+├── pages/ # Page components
+├── theme/ # MUI theme configuration
+└── assets/ # Images, fonts
+```
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..4fa125da29e01fa85529cfa06a83a7c0ce240d55
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,29 @@
+import js from '@eslint/js'
+import globals from 'globals'
+import reactHooks from 'eslint-plugin-react-hooks'
+import reactRefresh from 'eslint-plugin-react-refresh'
+import { defineConfig, globalIgnores } from 'eslint/config'
+
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{js,jsx}'],
+ extends: [
+ js.configs.recommended,
+ reactHooks.configs.flat.recommended,
+ reactRefresh.configs.vite,
+ ],
+ languageOptions: {
+ ecmaVersion: 2020,
+ globals: globals.browser,
+ parserOptions: {
+ ecmaVersion: 'latest',
+ ecmaFeatures: { jsx: true },
+ sourceType: 'module',
+ },
+ },
+ rules: {
+ 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }],
+ },
+ },
+])
diff --git a/index.html b/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..ce4a87f0924fb7c566c9ad2589ee4c867451ad00
--- /dev/null
+++ b/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+ Reachy Mini — Open Source Companion Robot
+
+
+
+
+
+
diff --git a/nginx.conf b/nginx.conf
new file mode 100644
index 0000000000000000000000000000000000000000..b9f38545662af8eadfc1f1bf58f294c873385a46
--- /dev/null
+++ b/nginx.conf
@@ -0,0 +1,23 @@
+server {
+ listen 7860;
+ server_name localhost;
+
+ root /usr/share/nginx/html;
+ index index.html index.htm;
+
+ location / {
+ try_files $uri $uri/ /index.html;
+ }
+
+ # Cache static assets
+ location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|mp4|webm)$ {
+ expires 1y;
+ add_header Cache-Control "public, immutable";
+ }
+
+ error_page 500 502 503 504 /50x.html;
+ location = /50x.html {
+ root /usr/share/nginx/html;
+ }
+}
+
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..c53c272e513a3418d03f0512f8e4a972c3161a26
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,3750 @@
+{
+ "name": "reachy-mini-website",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "reachy-mini-website",
+ "version": "0.0.0",
+ "dependencies": {
+ "@emotion/react": "^11.14.0",
+ "@emotion/styled": "^11.14.1",
+ "@mui/icons-material": "^7.3.6",
+ "@mui/material": "^7.3.6",
+ "@react-spring/web": "^10.0.3",
+ "framer-motion": "^12.23.26",
+ "react": "^19.2.0",
+ "react-dom": "^19.2.0",
+ "react-router-dom": "^7.10.1"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.39.1",
+ "@types/react": "^19.2.5",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^5.1.1",
+ "eslint": "^9.39.1",
+ "eslint-plugin-react-hooks": "^7.0.1",
+ "eslint-plugin-react-refresh": "^0.4.24",
+ "globals": "^16.5.0",
+ "vite": "^7.2.4"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz",
+ "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz",
+ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.28.5",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-module-transforms": "^7.28.3",
+ "@babel/helpers": "^7.28.4",
+ "@babel/parser": "^7.28.5",
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.28.5",
+ "@babel/types": "^7.28.5",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz",
+ "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.5",
+ "@babel/types": "^7.28.5",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
+ "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.27.2",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
+ "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
+ "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/traverse": "^7.28.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
+ "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
+ "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.28.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz",
+ "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.5"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
+ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
+ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
+ "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
+ "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/parser": "^7.27.2",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz",
+ "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.28.5",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.28.5",
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.28.5",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz",
+ "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@emotion/babel-plugin": {
+ "version": "11.13.5",
+ "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz",
+ "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/runtime": "^7.18.3",
+ "@emotion/hash": "^0.9.2",
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/serialize": "^1.3.3",
+ "babel-plugin-macros": "^3.1.0",
+ "convert-source-map": "^1.5.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-root": "^1.1.0",
+ "source-map": "^0.5.7",
+ "stylis": "4.2.0"
+ }
+ },
+ "node_modules/@emotion/cache": {
+ "version": "11.14.0",
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz",
+ "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/sheet": "^1.4.0",
+ "@emotion/utils": "^1.4.2",
+ "@emotion/weak-memoize": "^0.4.0",
+ "stylis": "4.2.0"
+ }
+ },
+ "node_modules/@emotion/hash": {
+ "version": "0.9.2",
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
+ "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/is-prop-valid": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz",
+ "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/memoize": "^0.9.0"
+ }
+ },
+ "node_modules/@emotion/memoize": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
+ "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/react": {
+ "version": "11.14.0",
+ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz",
+ "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.13.5",
+ "@emotion/cache": "^11.14.0",
+ "@emotion/serialize": "^1.3.3",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
+ "@emotion/utils": "^1.4.2",
+ "@emotion/weak-memoize": "^0.4.0",
+ "hoist-non-react-statics": "^3.3.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@emotion/serialize": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz",
+ "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/hash": "^0.9.2",
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/unitless": "^0.10.0",
+ "@emotion/utils": "^1.4.2",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@emotion/sheet": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz",
+ "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/styled": {
+ "version": "11.14.1",
+ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz",
+ "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.13.5",
+ "@emotion/is-prop-valid": "^1.3.0",
+ "@emotion/serialize": "^1.3.3",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
+ "@emotion/utils": "^1.4.2"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.0.0-rc.0",
+ "react": ">=16.8.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@emotion/unitless": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
+ "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz",
+ "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/@emotion/utils": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz",
+ "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/weak-memoize": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz",
+ "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==",
+ "license": "MIT"
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
+ "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
+ "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
+ "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
+ "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
+ "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
+ "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
+ "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
+ "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
+ "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
+ "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
+ "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
+ "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
+ "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
+ "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
+ "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
+ "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
+ "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
+ "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
+ "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
+ "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
+ "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
+ "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz",
+ "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz",
+ "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.1",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.39.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz",
+ "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@mui/core-downloads-tracker": {
+ "version": "7.3.6",
+ "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.6.tgz",
+ "integrity": "sha512-QaYtTHlr8kDFN5mE1wbvVARRKH7Fdw1ZuOjBJcFdVpfNfRYKF3QLT4rt+WaB6CKJvpqxRsmEo0kpYinhH5GeHg==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ }
+ },
+ "node_modules/@mui/icons-material": {
+ "version": "7.3.6",
+ "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.3.6.tgz",
+ "integrity": "sha512-0FfkXEj22ysIq5pa41A2NbcAhJSvmcZQ/vcTIbjDsd6hlslG82k5BEBqqS0ZJprxwIL3B45qpJ+bPHwJPlF7uQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.28.4"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@mui/material": "^7.3.6",
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/material": {
+ "version": "7.3.6",
+ "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.3.6.tgz",
+ "integrity": "sha512-R4DaYF3dgCQCUAkr4wW1w26GHXcf5rCmBRHVBuuvJvaGLmZdD8EjatP80Nz5JCw0KxORAzwftnHzXVnjR8HnFw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/runtime": "^7.28.4",
+ "@mui/core-downloads-tracker": "^7.3.6",
+ "@mui/system": "^7.3.6",
+ "@mui/types": "^7.4.9",
+ "@mui/utils": "^7.3.6",
+ "@popperjs/core": "^2.11.8",
+ "@types/react-transition-group": "^4.4.12",
+ "clsx": "^2.1.1",
+ "csstype": "^3.1.3",
+ "prop-types": "^15.8.1",
+ "react-is": "^19.2.0",
+ "react-transition-group": "^4.4.5"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@mui/material-pigment-css": "^7.3.6",
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "@mui/material-pigment-css": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/material/node_modules/react-is": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.3.tgz",
+ "integrity": "sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA==",
+ "license": "MIT"
+ },
+ "node_modules/@mui/private-theming": {
+ "version": "7.3.6",
+ "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.3.6.tgz",
+ "integrity": "sha512-Ws9wZpqM+FlnbZXaY/7yvyvWQo1+02Tbx50mVdNmzWEi51C51y56KAbaDCYyulOOBL6BJxuaqG8rNNuj7ivVyw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.28.4",
+ "@mui/utils": "^7.3.6",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/styled-engine": {
+ "version": "7.3.6",
+ "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.3.6.tgz",
+ "integrity": "sha512-+wiYbtvj+zyUkmDB+ysH6zRjuQIJ+CM56w0fEXV+VDNdvOuSywG+/8kpjddvvlfMLsaWdQe5oTuYGBcodmqGzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.28.4",
+ "@emotion/cache": "^11.14.0",
+ "@emotion/serialize": "^1.3.3",
+ "@emotion/sheet": "^1.4.0",
+ "csstype": "^3.1.3",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.4.1",
+ "@emotion/styled": "^11.3.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/system": {
+ "version": "7.3.6",
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.3.6.tgz",
+ "integrity": "sha512-8fehAazkHNP1imMrdD2m2hbA9sl7Ur6jfuNweh5o4l9YPty4iaZzRXqYvBCWQNwFaSHmMEj2KPbyXGp7Bt73Rg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.28.4",
+ "@mui/private-theming": "^7.3.6",
+ "@mui/styled-engine": "^7.3.6",
+ "@mui/types": "^7.4.9",
+ "@mui/utils": "^7.3.6",
+ "clsx": "^2.1.1",
+ "csstype": "^3.1.3",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/types": {
+ "version": "7.4.9",
+ "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.9.tgz",
+ "integrity": "sha512-dNO8Z9T2cujkSIaCnWwprfeKmTWh97cnjkgmpFJ2sbfXLx8SMZijCYHOtP/y5nnUb/Rm2omxbDMmtUoSaUtKaw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.28.4"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/utils": {
+ "version": "7.3.6",
+ "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.3.6.tgz",
+ "integrity": "sha512-jn+Ba02O6PiFs7nKva8R2aJJ9kJC+3kQ2R0BbKNY3KQQ36Qng98GnPRFTlbwYTdMD6hLEBKaMLUktyg/rTfd2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.28.4",
+ "@mui/types": "^7.4.9",
+ "@types/prop-types": "^15.7.15",
+ "clsx": "^2.1.1",
+ "prop-types": "^15.8.1",
+ "react-is": "^19.2.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/utils/node_modules/react-is": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.3.tgz",
+ "integrity": "sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA==",
+ "license": "MIT"
+ },
+ "node_modules/@popperjs/core": {
+ "version": "2.11.8",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@react-spring/animated": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-10.0.3.tgz",
+ "integrity": "sha512-7MrxADV3vaUADn2V9iYhaIL6iOWRx9nCJjYrsk2AHD2kwPr6fg7Pt0v+deX5RnCDmCKNnD6W5fasiyM8D+wzJQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@react-spring/shared": "~10.0.3",
+ "@react-spring/types": "~10.0.3"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@react-spring/core": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-10.0.3.tgz",
+ "integrity": "sha512-D4DwNO68oohDf/0HG2G0Uragzb9IA1oXblxrd6MZAcBcUQG2EHUWXewjdECMPLNmQvlYVyyBRH6gPxXM5DX7DQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@react-spring/animated": "~10.0.3",
+ "@react-spring/shared": "~10.0.3",
+ "@react-spring/types": "~10.0.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/react-spring/donate"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@react-spring/rafz": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-10.0.3.tgz",
+ "integrity": "sha512-Ri2/xqt8OnQ2iFKkxKMSF4Nqv0LSWnxXT4jXFzBDsHgeeH/cHxTLupAWUwmV9hAGgmEhBmh5aONtj3J6R/18wg==",
+ "license": "MIT"
+ },
+ "node_modules/@react-spring/shared": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-10.0.3.tgz",
+ "integrity": "sha512-geCal66nrkaQzUVhPkGomylo+Jpd5VPK8tPMEDevQEfNSWAQP15swHm+MCRG4wVQrQlTi9lOzKzpRoTL3CA84Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@react-spring/rafz": "~10.0.3",
+ "@react-spring/types": "~10.0.3"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@react-spring/types": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-10.0.3.tgz",
+ "integrity": "sha512-H5Ixkd2OuSIgHtxuHLTt7aJYfhMXKXT/rK32HPD/kSrOB6q6ooeiWAXkBy7L8F3ZxdkBb9ini9zP9UwnEFzWgQ==",
+ "license": "MIT"
+ },
+ "node_modules/@react-spring/web": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-10.0.3.tgz",
+ "integrity": "sha512-ndU+kWY81rHsT7gTFtCJ6mrVhaJ6grFmgTnENipzmKqot4HGf5smPNK+cZZJqoGeDsj9ZsiWPW4geT/NyD484A==",
+ "license": "MIT",
+ "dependencies": {
+ "@react-spring/animated": "~10.0.3",
+ "@react-spring/core": "~10.0.3",
+ "@react-spring/shared": "~10.0.3",
+ "@react-spring/types": "~10.0.3"
+ },
+ "peerDependencies": {
+ "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"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-beta.53",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz",
+ "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz",
+ "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz",
+ "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz",
+ "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz",
+ "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz",
+ "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz",
+ "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz",
+ "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz",
+ "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz",
+ "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz",
+ "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz",
+ "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz",
+ "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz",
+ "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz",
+ "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz",
+ "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz",
+ "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz",
+ "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz",
+ "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz",
+ "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz",
+ "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz",
+ "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz",
+ "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/parse-json": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
+ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.15",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
+ "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "19.2.7",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz",
+ "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "csstype": "^3.2.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
+ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.2.0"
+ }
+ },
+ "node_modules/@types/react-transition-group": {
+ "version": "4.4.12",
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
+ "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz",
+ "integrity": "sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.28.5",
+ "@babel/plugin-transform-react-jsx-self": "^7.27.1",
+ "@babel/plugin-transform-react-jsx-source": "^7.27.1",
+ "@rolldown/pluginutils": "1.0.0-beta.53",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.18.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/babel-plugin-macros": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.9.6",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.6.tgz",
+ "integrity": "sha512-v9BVVpOTLB59C9E7aSnmIF8h7qRsFpx+A2nugVMTszEOMcfjlZMsXRm4LF23I3Z9AJxc8ANpIvzbzONoX9VJlg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
+ "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "baseline-browser-mapping": "^2.9.0",
+ "caniuse-lite": "^1.0.30001759",
+ "electron-to-chromium": "^1.5.263",
+ "node-releases": "^2.0.27",
+ "update-browserslist-db": "^1.2.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001760",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz",
+ "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "license": "MIT"
+ },
+ "node_modules/cookie": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
+ "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/cosmiconfig/node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.267",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz",
+ "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
+ "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.12",
+ "@esbuild/android-arm": "0.25.12",
+ "@esbuild/android-arm64": "0.25.12",
+ "@esbuild/android-x64": "0.25.12",
+ "@esbuild/darwin-arm64": "0.25.12",
+ "@esbuild/darwin-x64": "0.25.12",
+ "@esbuild/freebsd-arm64": "0.25.12",
+ "@esbuild/freebsd-x64": "0.25.12",
+ "@esbuild/linux-arm": "0.25.12",
+ "@esbuild/linux-arm64": "0.25.12",
+ "@esbuild/linux-ia32": "0.25.12",
+ "@esbuild/linux-loong64": "0.25.12",
+ "@esbuild/linux-mips64el": "0.25.12",
+ "@esbuild/linux-ppc64": "0.25.12",
+ "@esbuild/linux-riscv64": "0.25.12",
+ "@esbuild/linux-s390x": "0.25.12",
+ "@esbuild/linux-x64": "0.25.12",
+ "@esbuild/netbsd-arm64": "0.25.12",
+ "@esbuild/netbsd-x64": "0.25.12",
+ "@esbuild/openbsd-arm64": "0.25.12",
+ "@esbuild/openbsd-x64": "0.25.12",
+ "@esbuild/openharmony-arm64": "0.25.12",
+ "@esbuild/sunos-x64": "0.25.12",
+ "@esbuild/win32-arm64": "0.25.12",
+ "@esbuild/win32-ia32": "0.25.12",
+ "@esbuild/win32-x64": "0.25.12"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.39.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz",
+ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.1",
+ "@eslint/config-helpers": "^0.4.2",
+ "@eslint/core": "^0.17.0",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.39.1",
+ "@eslint/plugin-kit": "^0.4.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz",
+ "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.24.4",
+ "@babel/parser": "^7.24.4",
+ "hermes-parser": "^0.25.1",
+ "zod": "^3.25.0 || ^4.0.0",
+ "zod-validation-error": "^3.5.0 || ^4.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.24.tgz",
+ "integrity": "sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": ">=8.40"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
+ "license": "MIT"
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/framer-motion": {
+ "version": "12.23.26",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.26.tgz",
+ "integrity": "sha512-cPcIhgR42xBn1Uj+PzOyheMtZ73H927+uWPDVhUMqxy8UHt6Okavb6xIz9J/phFUHUj0OncR6UvMfJTXoc/LKA==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-dom": "^12.23.23",
+ "motion-utils": "^12.23.6",
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "16.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz",
+ "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hermes-estree": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
+ "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/hermes-parser": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
+ "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hermes-estree": "0.25.1"
+ }
+ },
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "license": "MIT"
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "license": "MIT"
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/motion-dom": {
+ "version": "12.23.23",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.23.tgz",
+ "integrity": "sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-utils": "^12.23.6"
+ }
+ },
+ "node_modules/motion-utils": {
+ "version": "12.23.6",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz",
+ "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==",
+ "license": "MIT"
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.27",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "license": "MIT"
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz",
+ "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz",
+ "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "scheduler": "^0.27.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.3"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "license": "MIT"
+ },
+ "node_modules/react-refresh": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz",
+ "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-router": {
+ "version": "7.10.1",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.10.1.tgz",
+ "integrity": "sha512-gHL89dRa3kwlUYtRQ+m8NmxGI6CgqN+k4XyGjwcFoQwwCWF6xXpOCUlDovkXClS0d0XJN/5q7kc5W3kiFEd0Yw==",
+ "license": "MIT",
+ "dependencies": {
+ "cookie": "^1.0.1",
+ "set-cookie-parser": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "7.10.1",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.10.1.tgz",
+ "integrity": "sha512-JNBANI6ChGVjA5bwsUIwJk7LHKmqB4JYnYfzFwyp2t12Izva11elds2jx7Yfoup2zssedntwU0oZ5DEmk5Sdaw==",
+ "license": "MIT",
+ "dependencies": {
+ "react-router": "7.10.1"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ }
+ },
+ "node_modules/react-transition-group": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.6.0",
+ "react-dom": ">=16.6.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.11",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
+ "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.53.3",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz",
+ "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.53.3",
+ "@rollup/rollup-android-arm64": "4.53.3",
+ "@rollup/rollup-darwin-arm64": "4.53.3",
+ "@rollup/rollup-darwin-x64": "4.53.3",
+ "@rollup/rollup-freebsd-arm64": "4.53.3",
+ "@rollup/rollup-freebsd-x64": "4.53.3",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.53.3",
+ "@rollup/rollup-linux-arm-musleabihf": "4.53.3",
+ "@rollup/rollup-linux-arm64-gnu": "4.53.3",
+ "@rollup/rollup-linux-arm64-musl": "4.53.3",
+ "@rollup/rollup-linux-loong64-gnu": "4.53.3",
+ "@rollup/rollup-linux-ppc64-gnu": "4.53.3",
+ "@rollup/rollup-linux-riscv64-gnu": "4.53.3",
+ "@rollup/rollup-linux-riscv64-musl": "4.53.3",
+ "@rollup/rollup-linux-s390x-gnu": "4.53.3",
+ "@rollup/rollup-linux-x64-gnu": "4.53.3",
+ "@rollup/rollup-linux-x64-musl": "4.53.3",
+ "@rollup/rollup-openharmony-arm64": "4.53.3",
+ "@rollup/rollup-win32-arm64-msvc": "4.53.3",
+ "@rollup/rollup-win32-ia32-msvc": "4.53.3",
+ "@rollup/rollup-win32-x64-gnu": "4.53.3",
+ "@rollup/rollup-win32-x64-msvc": "4.53.3",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/set-cookie-parser": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz",
+ "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
+ "license": "MIT"
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/stylis": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
+ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==",
+ "license": "MIT"
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz",
+ "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/vite": {
+ "version": "7.2.7",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz",
+ "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.6",
+ "rollup": "^4.43.0",
+ "tinyglobby": "^0.2.15"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "lightningcss": "^1.21.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zod": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz",
+ "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zod-validation-error": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
+ "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.0 || ^4.0.0"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..b01a92dc3a0087ef55be406e8f4afcf32e6478b2
--- /dev/null
+++ b/package.json
@@ -0,0 +1,34 @@
+{
+ "name": "reachy-mini-website",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "lint": "eslint .",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@emotion/react": "^11.14.0",
+ "@emotion/styled": "^11.14.1",
+ "@mui/icons-material": "^7.3.6",
+ "@mui/material": "^7.3.6",
+ "@react-spring/web": "^10.0.3",
+ "framer-motion": "^12.23.26",
+ "react": "^19.2.0",
+ "react-dom": "^19.2.0",
+ "react-router-dom": "^7.10.1"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.39.1",
+ "@types/react": "^19.2.5",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^5.1.1",
+ "eslint": "^9.39.1",
+ "eslint-plugin-react-hooks": "^7.0.1",
+ "eslint-plugin-react-refresh": "^0.4.24",
+ "globals": "^16.5.0",
+ "vite": "^7.2.4"
+ }
+}
diff --git a/public/assets/Reachy-mini-wake-up-companion.mp4 b/public/assets/Reachy-mini-wake-up-companion.mp4
new file mode 100644
index 0000000000000000000000000000000000000000..219bc45694668ab9c3ba0c97c121d94435dec782
--- /dev/null
+++ b/public/assets/Reachy-mini-wake-up-companion.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8a1f5d23ffddfa87218f1697533f187cf76c3327e18234fa8ed5a2d8bf05dae0
+size 15339406
diff --git a/public/assets/application-box.svg b/public/assets/application-box.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2b827ad07d8cc42d45ff17a77430fa427e65ad7a
--- /dev/null
+++ b/public/assets/application-box.svg
@@ -0,0 +1,236 @@
+
+
\ No newline at end of file
diff --git a/public/assets/assembly-screenshot.png b/public/assets/assembly-screenshot.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ae2b3172c698a122b049bd6fa4faa5f20287b7c
--- /dev/null
+++ b/public/assets/assembly-screenshot.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f63db53ee41209f30da7ffbfce633e28c5efc1c0c53c852a85063cb1f7496cef
+size 1860121
diff --git a/public/assets/desktop-app-screenshot--dark.png b/public/assets/desktop-app-screenshot--dark.png
new file mode 100644
index 0000000000000000000000000000000000000000..375dd8ee4c7aebf83f7a62c0b366b81ef157debe
--- /dev/null
+++ b/public/assets/desktop-app-screenshot--dark.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:88784ef09fbd28b55d44c446274240364f2737c792edc8614a408a8c72ed7175
+size 636527
diff --git a/public/assets/desktop-app-screenshot--white.png b/public/assets/desktop-app-screenshot--white.png
new file mode 100644
index 0000000000000000000000000000000000000000..b3d9c69edd2278306a780218a1580ea9797ae3fe
--- /dev/null
+++ b/public/assets/desktop-app-screenshot--white.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1cbe6a63430f4ce8049ef8c4695c928c2a37ed5e92c024e0eb76fdb2326160a2
+size 667297
diff --git a/public/assets/discord-logo.svg b/public/assets/discord-logo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..893b322ec34f34182025c1a3a9a7aaeabc5bc90d
--- /dev/null
+++ b/public/assets/discord-logo.svg
@@ -0,0 +1,4 @@
+
+
diff --git a/public/assets/expression.svg b/public/assets/expression.svg
new file mode 100644
index 0000000000000000000000000000000000000000..9732ccad3b8bc18f2a702a63b16e6b2a2c7e79b7
--- /dev/null
+++ b/public/assets/expression.svg
@@ -0,0 +1,78 @@
+
+
\ No newline at end of file
diff --git a/public/assets/hf-logo.svg b/public/assets/hf-logo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..a0682eb0bf8db08aa5438e47115cca80ae823db7
--- /dev/null
+++ b/public/assets/hf-logo.svg
@@ -0,0 +1,13 @@
+
+
\ No newline at end of file
diff --git a/public/assets/idle-reachy-ai.gif b/public/assets/idle-reachy-ai.gif
new file mode 100644
index 0000000000000000000000000000000000000000..5554c48b83d3fd939cb5f487be030980cef83f52
--- /dev/null
+++ b/public/assets/idle-reachy-ai.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0c496798eccd4f0a7572b257f31496484ab9b1717ec119a79c81149289193715
+size 6068161
diff --git a/public/assets/idle-reachy-opencv.gif b/public/assets/idle-reachy-opencv.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e6ad095a491347decc9cc96543b1de1501762bc
--- /dev/null
+++ b/public/assets/idle-reachy-opencv.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5643b49a1fbe6ec724cebcaaacf7796798f1295fe2122f18ef016cdad4823ea4
+size 3351694
diff --git a/public/assets/idle-reachy.gif b/public/assets/idle-reachy.gif
new file mode 100644
index 0000000000000000000000000000000000000000..af213c0ae7b5054e36c702b9e0e80b157bc0ce76
--- /dev/null
+++ b/public/assets/idle-reachy.gif
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cd1c7a487842b674720a8a3fb15393cd6e59efd71d20d395fed7d9bf9a914d99
+size 7774488
diff --git a/public/assets/joystick.svg b/public/assets/joystick.svg
new file mode 100644
index 0000000000000000000000000000000000000000..84ed62501edd1cb397ac75a8f3f63989773a8bd5
--- /dev/null
+++ b/public/assets/joystick.svg
@@ -0,0 +1,215 @@
+
+
\ No newline at end of file
diff --git a/public/assets/logo--black.svg b/public/assets/logo--black.svg
new file mode 100644
index 0000000000000000000000000000000000000000..227a532bd03371efca7be56f3750d73ccee34a8f
--- /dev/null
+++ b/public/assets/logo--black.svg
@@ -0,0 +1,13 @@
+
+
\ No newline at end of file
diff --git a/public/assets/logo--white.svg b/public/assets/logo--white.svg
new file mode 100644
index 0000000000000000000000000000000000000000..0ac6a8a0b506312432d91773a28d51f43ae44010
--- /dev/null
+++ b/public/assets/logo--white.svg
@@ -0,0 +1,25 @@
+
+
\ No newline at end of file
diff --git a/public/assets/logo.svg b/public/assets/logo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..73cfb866e6a77ad2370678fe9a9f8aaaf540e630
--- /dev/null
+++ b/public/assets/logo.svg
@@ -0,0 +1,33 @@
+
+
\ No newline at end of file
diff --git a/public/assets/pollen-logo-icon.svg b/public/assets/pollen-logo-icon.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ffc0d0bedea9fda255bccbefec977e334ab49a85
--- /dev/null
+++ b/public/assets/pollen-logo-icon.svg
@@ -0,0 +1,22 @@
+
+
diff --git a/public/assets/pollen-robotics-logo.svg b/public/assets/pollen-robotics-logo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..932272f5e8e7cba1b02f5d3712b091d19f419b74
--- /dev/null
+++ b/public/assets/pollen-robotics-logo.svg
@@ -0,0 +1,92 @@
+
+
\ No newline at end of file
diff --git a/public/assets/reachies/astronaut.png b/public/assets/reachies/astronaut.png
new file mode 100644
index 0000000000000000000000000000000000000000..4fb27c9590fd51e839e5021474355a82f272c0ee
--- /dev/null
+++ b/public/assets/reachies/astronaut.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5ec06592da609306b699d29ba701daa10013a8978663f7133902db581e71d256
+size 639912
diff --git a/public/assets/reachies/captain.png b/public/assets/reachies/captain.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb1eaaffd033533fc19585fc2bfda49b8794cb92
--- /dev/null
+++ b/public/assets/reachies/captain.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ca71dad3aa3d6c01a59115bea40c8267a3188e2c76e3e1dc422557c0126a1849
+size 716768
diff --git a/public/assets/reachies/cowboy.png b/public/assets/reachies/cowboy.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b52f6e8b5f25e6eccc594a10272ec8810fca23c
--- /dev/null
+++ b/public/assets/reachies/cowboy.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:729500a893083b48e1f9b6c6e1a8878ddae358edd4eb1b48a69899c0e4363228
+size 785870
diff --git a/public/assets/reachies/doctor.png b/public/assets/reachies/doctor.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac9cdb08e3ead256f43a86991121722eb5e40d6d
--- /dev/null
+++ b/public/assets/reachies/doctor.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0a0d362981db03948d11a10f87f2d4b42814deb8d1a16a31e3e14fcdf76b47cd
+size 280401
diff --git a/public/assets/reachies/explorer.png b/public/assets/reachies/explorer.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b6c81ce0976fd43f56e7402d8e7d725b35c8bcf
--- /dev/null
+++ b/public/assets/reachies/explorer.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3cd02a31ada7e023460289998bd11c5cbd3c7c55cfabb214420ce4ad40a37f47
+size 644533
diff --git a/public/assets/reachies/hacker.png b/public/assets/reachies/hacker.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f2b28a9708035e712ca48491f4a3f933920d1b7
--- /dev/null
+++ b/public/assets/reachies/hacker.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:858d6a623768e6107a56c2828494acb18209b86dd1ea494cfbee8aa8d57195ce
+size 431432
diff --git a/public/assets/reachies/jazzman.png b/public/assets/reachies/jazzman.png
new file mode 100644
index 0000000000000000000000000000000000000000..6eb1867e4ab3b573283cc82f1591d06615f3199d
--- /dev/null
+++ b/public/assets/reachies/jazzman.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6ded3931bef0a593ea33221c5caab27ee000b8acf52ee972ab5c52fab387f442
+size 638315
diff --git a/public/assets/reachies/magician.png b/public/assets/reachies/magician.png
new file mode 100644
index 0000000000000000000000000000000000000000..60a09c6bfc1b38a0fb66b4551b569c9fd72a7e91
--- /dev/null
+++ b/public/assets/reachies/magician.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6b479d32c04eaba5b52176a87ef8725bfe05f3c67469b86ba1eab09af38b3488
+size 926011
diff --git a/public/assets/reachies/student.png b/public/assets/reachies/student.png
new file mode 100644
index 0000000000000000000000000000000000000000..7987eb134697686721d8336c6b15ed3776b723b4
--- /dev/null
+++ b/public/assets/reachies/student.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8bb2ef774a09acfd8dc496f286705422838999fc71c6fe32a597a3b4569315d8
+size 622116
diff --git a/public/assets/reachy-conversation-app.jpg b/public/assets/reachy-conversation-app.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..4a931c38b76d11ea831c2118b28c25561725352a
--- /dev/null
+++ b/public/assets/reachy-conversation-app.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0245adfd5b60c2c21bc4ae8f6e31f9565b2a35915c1f171a0538c46ecfc40e70
+size 160198
diff --git a/public/assets/reachy-detective.svg b/public/assets/reachy-detective.svg
new file mode 100644
index 0000000000000000000000000000000000000000..a3b169565979a198149a97257ae164872c935a31
--- /dev/null
+++ b/public/assets/reachy-detective.svg
@@ -0,0 +1,649 @@
+
+
\ No newline at end of file
diff --git a/public/assets/reachy-hand-tracking-app.jpg b/public/assets/reachy-hand-tracking-app.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..33d0a41fccac7e2bb8d56d57b14d175104946ded
--- /dev/null
+++ b/public/assets/reachy-hand-tracking-app.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:62e22f77be87cf46bcaae86babc0544193dc910c9c1a1909d64af0172e5a9f23
+size 160785
diff --git a/public/assets/reachy-how-to-create-app.svg b/public/assets/reachy-how-to-create-app.svg
new file mode 100644
index 0000000000000000000000000000000000000000..53d6c230fb64dddacd244ea4cae0248e6730907e
--- /dev/null
+++ b/public/assets/reachy-how-to-create-app.svg
@@ -0,0 +1,454 @@
+
+
\ No newline at end of file
diff --git a/public/assets/reachy-icon.svg b/public/assets/reachy-icon.svg
new file mode 100644
index 0000000000000000000000000000000000000000..261efda4e4fdee5661129f21a1b7a137845ffd92
--- /dev/null
+++ b/public/assets/reachy-icon.svg
@@ -0,0 +1,31 @@
+
+
\ No newline at end of file
diff --git a/public/assets/reachy-stop.svg b/public/assets/reachy-stop.svg
new file mode 100644
index 0000000000000000000000000000000000000000..4826303613b371e2c62719f1e31e8b161534bfc9
--- /dev/null
+++ b/public/assets/reachy-stop.svg
@@ -0,0 +1,125 @@
+
+
\ No newline at end of file
diff --git a/public/assets/reachy-update-box.svg b/public/assets/reachy-update-box.svg
new file mode 100644
index 0000000000000000000000000000000000000000..f8c4793b01bbbaf7db5d2069e22fc49eca29b1df
--- /dev/null
+++ b/public/assets/reachy-update-box.svg
@@ -0,0 +1,64 @@
+
+
\ No newline at end of file
diff --git a/public/assets/rocket.svg b/public/assets/rocket.svg
new file mode 100644
index 0000000000000000000000000000000000000000..246f47b340dfabc54c4eecfd7e076405348e3d02
--- /dev/null
+++ b/public/assets/rocket.svg
@@ -0,0 +1,101 @@
+
+
\ No newline at end of file
diff --git a/public/assets/sleeping-reachy.svg b/public/assets/sleeping-reachy.svg
new file mode 100644
index 0000000000000000000000000000000000000000..462bce1c237f6b87b629a2cb6bc82bf221c1386a
--- /dev/null
+++ b/public/assets/sleeping-reachy.svg
@@ -0,0 +1,594 @@
+
+
\ No newline at end of file
diff --git a/public/favicon.svg b/public/favicon.svg
new file mode 100644
index 0000000000000000000000000000000000000000..0bef23e061600ddce1d1ecbc1c5673bcd773d8f0
--- /dev/null
+++ b/public/favicon.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/public/vite.svg b/public/vite.svg
new file mode 100644
index 0000000000000000000000000000000000000000..e7b8dfb1b2a60bd50538bec9f876511b9cac21e3
--- /dev/null
+++ b/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/App.jsx b/src/App.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..0ce367cfe84bf273d020f636b6b179af10c9ab1b
--- /dev/null
+++ b/src/App.jsx
@@ -0,0 +1,33 @@
+import { BrowserRouter, Routes, Route } from 'react-router-dom';
+import { ThemeProvider, CssBaseline } from '@mui/material';
+import theme from './theme/theme';
+import { AppsProvider } from './context/AppsContext';
+
+import Home from './pages/Home';
+import Download from './pages/Download';
+import FAQ from './pages/FAQ';
+import Apps from './pages/Apps';
+import Buy from './pages/Buy';
+import GettingStarted from './pages/GettingStarted';
+import Build from './pages/Build';
+
+export default function App() {
+ return (
+
+
+
+
+
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+
+
+
+
+ );
+}
diff --git a/src/assets/hf-logo.svg b/src/assets/hf-logo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..79a9ba8c9ab0a9ddd13d37129b6f4c3125aa4e09
--- /dev/null
+++ b/src/assets/hf-logo.svg
@@ -0,0 +1,19 @@
+
+
\ No newline at end of file
diff --git a/src/assets/original/alfred.png b/src/assets/original/alfred.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad27599710e74b2d697b232e34870b9d91eb39e9
--- /dev/null
+++ b/src/assets/original/alfred.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:aa14803e93b9efd0e3c0ab5b4d7c9a7f6d86fc30e3c00d67944a21cdfdfa5020
+size 861647
diff --git a/src/assets/original/ambulance.png b/src/assets/original/ambulance.png
new file mode 100644
index 0000000000000000000000000000000000000000..4e4733274dd05b8bf1587f14f40ea4127f865f8b
--- /dev/null
+++ b/src/assets/original/ambulance.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1ebcd3161b7a0484b19eda75ac48b8ad442a4b33aef4064ae898e890c3ca6be9
+size 615812
diff --git a/src/assets/original/aristocrat.png b/src/assets/original/aristocrat.png
new file mode 100644
index 0000000000000000000000000000000000000000..bcf4fb24db328bed17175c2302d967c2e3f79dfe
--- /dev/null
+++ b/src/assets/original/aristocrat.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7c2acebc910f85c69c380b03fb65acd5ba3d722a2966c152d5bf633f1537e8dd
+size 796323
diff --git a/src/assets/original/astronaut.png b/src/assets/original/astronaut.png
new file mode 100644
index 0000000000000000000000000000000000000000..4fb27c9590fd51e839e5021474355a82f272c0ee
--- /dev/null
+++ b/src/assets/original/astronaut.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5ec06592da609306b699d29ba701daa10013a8978663f7133902db581e71d256
+size 639912
diff --git a/src/assets/original/astronomer.png b/src/assets/original/astronomer.png
new file mode 100644
index 0000000000000000000000000000000000000000..d6df713116bfae65e708d8b5f13b6d8b7b3261cf
--- /dev/null
+++ b/src/assets/original/astronomer.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6a477e4ce71fba36fa8b96b131f07704925656769d6c0d3cbe6e92f0197961b0
+size 636762
diff --git a/src/assets/original/captain.png b/src/assets/original/captain.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb1eaaffd033533fc19585fc2bfda49b8794cb92
--- /dev/null
+++ b/src/assets/original/captain.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ca71dad3aa3d6c01a59115bea40c8267a3188e2c76e3e1dc422557c0126a1849
+size 716768
diff --git a/src/assets/original/cooking-chief.png b/src/assets/original/cooking-chief.png
new file mode 100644
index 0000000000000000000000000000000000000000..b4fc29b27e4ad64fab9b35379bab50108a8221c1
--- /dev/null
+++ b/src/assets/original/cooking-chief.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5976ac996bd50bd47a5477116c3739781c06352f7cbcc4257226b332088c0f73
+size 660440
diff --git a/src/assets/original/cowboy.png b/src/assets/original/cowboy.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b52f6e8b5f25e6eccc594a10272ec8810fca23c
--- /dev/null
+++ b/src/assets/original/cowboy.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:729500a893083b48e1f9b6c6e1a8878ddae358edd4eb1b48a69899c0e4363228
+size 785870
diff --git a/src/assets/original/doctor.png b/src/assets/original/doctor.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac9cdb08e3ead256f43a86991121722eb5e40d6d
--- /dev/null
+++ b/src/assets/original/doctor.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0a0d362981db03948d11a10f87f2d4b42814deb8d1a16a31e3e14fcdf76b47cd
+size 280401
diff --git a/src/assets/original/explorer.png b/src/assets/original/explorer.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b6c81ce0976fd43f56e7402d8e7d725b35c8bcf
--- /dev/null
+++ b/src/assets/original/explorer.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3cd02a31ada7e023460289998bd11c5cbd3c7c55cfabb214420ce4ad40a37f47
+size 644533
diff --git a/src/assets/original/farmer.png b/src/assets/original/farmer.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc1f70a9457f264a2c891884b251982218e814a1
--- /dev/null
+++ b/src/assets/original/farmer.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:35b69ec58780073b9464866c950989628fabd1e11cd5a4ef0bcb477edebe5a5c
+size 448414
diff --git a/src/assets/original/fisherman.png b/src/assets/original/fisherman.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c42f822083bed7c5a47eb0db5628477bf8f0c7c
--- /dev/null
+++ b/src/assets/original/fisherman.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6d244a16df0b3a9f4fb32b062dbc397b413ac4146616e2e816878fb6cdccc9c6
+size 619064
diff --git a/src/assets/original/hacker.png b/src/assets/original/hacker.png
new file mode 100644
index 0000000000000000000000000000000000000000..264066832c0ff6c8edf8a8701d3e83df239f9fde
--- /dev/null
+++ b/src/assets/original/hacker.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:000f417da2cd6d47dab0bc6c0a32c26a444fe216a7896a844d03f2f7742b7996
+size 1000862
diff --git a/src/assets/original/jazzman.png b/src/assets/original/jazzman.png
new file mode 100644
index 0000000000000000000000000000000000000000..6eb1867e4ab3b573283cc82f1591d06615f3199d
--- /dev/null
+++ b/src/assets/original/jazzman.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6ded3931bef0a593ea33221c5caab27ee000b8acf52ee972ab5c52fab387f442
+size 638315
diff --git a/src/assets/original/journalist.png b/src/assets/original/journalist.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc5d1b1df464500b08803c1341f2d548ddb1f27e
--- /dev/null
+++ b/src/assets/original/journalist.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b42d7a58054a8c1459c4ed8509116d9d0430caf77fc97b150629b50e6e137967
+size 611951
diff --git a/src/assets/original/lumberjack.png b/src/assets/original/lumberjack.png
new file mode 100644
index 0000000000000000000000000000000000000000..68a5d7b92e0d89ecd54951d6d963ffd2c4c2a2bf
--- /dev/null
+++ b/src/assets/original/lumberjack.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b581345a43efe3c9fc43f8a3f2f5627ee2907d502c9776c7c05dac05d479c6c5
+size 661239
diff --git a/src/assets/original/magician.png b/src/assets/original/magician.png
new file mode 100644
index 0000000000000000000000000000000000000000..60a09c6bfc1b38a0fb66b4551b569c9fd72a7e91
--- /dev/null
+++ b/src/assets/original/magician.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6b479d32c04eaba5b52176a87ef8725bfe05f3c67469b86ba1eab09af38b3488
+size 926011
diff --git a/src/assets/original/monk.png b/src/assets/original/monk.png
new file mode 100644
index 0000000000000000000000000000000000000000..a39419a1e343c1cfbb5dbcc860904c20d074946b
--- /dev/null
+++ b/src/assets/original/monk.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:556fc1665ef980d9470be808e36a54a12973a316060166aa92fa560d88d9cfa9
+size 720532
diff --git a/src/assets/original/plumber 2.png b/src/assets/original/plumber 2.png
new file mode 100644
index 0000000000000000000000000000000000000000..aacda6fb3f719cd11c1f0db39e98257045974d3d
--- /dev/null
+++ b/src/assets/original/plumber 2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:37b45825ef128738a67936ae8e10dc513cf72ea3a83aab967563dfe802235e2c
+size 743579
diff --git a/src/assets/original/plumber.png b/src/assets/original/plumber.png
new file mode 100644
index 0000000000000000000000000000000000000000..6944b2a7ba291f40bfee6502ad220d4728087718
--- /dev/null
+++ b/src/assets/original/plumber.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:518b03b7c7882f712b9ca62ec0c19cc0be87e7e1e8018ac3ca0dd66fcca8e3f1
+size 409460
diff --git a/src/assets/original/policeman.png b/src/assets/original/policeman.png
new file mode 100644
index 0000000000000000000000000000000000000000..b944753160653421b8eb527c18864750952b93e0
--- /dev/null
+++ b/src/assets/original/policeman.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8e5d5f4a41f9c2603c6e6939c4f5be8556276a3f1e2fe2a40f1f4445ad7bf7a1
+size 677460
diff --git a/src/assets/original/postman.png b/src/assets/original/postman.png
new file mode 100644
index 0000000000000000000000000000000000000000..907f2017c7e0d954b9324313ce3a1e3e0d5af3f3
--- /dev/null
+++ b/src/assets/original/postman.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6219078d97cfad96446e4683cc495359317d43d563e95c83ec554a341e2b5b94
+size 917898
diff --git a/src/assets/original/rich.png b/src/assets/original/rich.png
new file mode 100644
index 0000000000000000000000000000000000000000..626266e93c3eeb9df22793df8a5dbb0f038d177a
--- /dev/null
+++ b/src/assets/original/rich.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ea2778364c2d05152a6565086d2cb99769449f20f00befe7c2985ba019082c11
+size 630658
diff --git a/src/assets/original/student.png b/src/assets/original/student.png
new file mode 100644
index 0000000000000000000000000000000000000000..7987eb134697686721d8336c6b15ed3776b723b4
--- /dev/null
+++ b/src/assets/original/student.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8bb2ef774a09acfd8dc496f286705422838999fc71c6fe32a597a3b4569315d8
+size 622116
diff --git a/src/assets/original/taxi.png b/src/assets/original/taxi.png
new file mode 100644
index 0000000000000000000000000000000000000000..b6332498151b8da4a15c885c80688050b3230b82
--- /dev/null
+++ b/src/assets/original/taxi.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c443e1a45f0a8f9ceb5f9d5b2d100641def190f626070f39b75d837ce27759c6
+size 625764
diff --git a/src/assets/pollen-logo.svg b/src/assets/pollen-logo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..932272f5e8e7cba1b02f5d3712b091d19f419b74
--- /dev/null
+++ b/src/assets/pollen-logo.svg
@@ -0,0 +1,92 @@
+
+
\ No newline at end of file
diff --git a/src/assets/reachies/original/alfred.png b/src/assets/reachies/original/alfred.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad27599710e74b2d697b232e34870b9d91eb39e9
--- /dev/null
+++ b/src/assets/reachies/original/alfred.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:aa14803e93b9efd0e3c0ab5b4d7c9a7f6d86fc30e3c00d67944a21cdfdfa5020
+size 861647
diff --git a/src/assets/reachies/original/ambulance.png b/src/assets/reachies/original/ambulance.png
new file mode 100644
index 0000000000000000000000000000000000000000..4e4733274dd05b8bf1587f14f40ea4127f865f8b
--- /dev/null
+++ b/src/assets/reachies/original/ambulance.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1ebcd3161b7a0484b19eda75ac48b8ad442a4b33aef4064ae898e890c3ca6be9
+size 615812
diff --git a/src/assets/reachies/original/aristocrat.png b/src/assets/reachies/original/aristocrat.png
new file mode 100644
index 0000000000000000000000000000000000000000..bcf4fb24db328bed17175c2302d967c2e3f79dfe
--- /dev/null
+++ b/src/assets/reachies/original/aristocrat.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7c2acebc910f85c69c380b03fb65acd5ba3d722a2966c152d5bf633f1537e8dd
+size 796323
diff --git a/src/assets/reachies/original/astronaut.png b/src/assets/reachies/original/astronaut.png
new file mode 100644
index 0000000000000000000000000000000000000000..4fb27c9590fd51e839e5021474355a82f272c0ee
--- /dev/null
+++ b/src/assets/reachies/original/astronaut.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5ec06592da609306b699d29ba701daa10013a8978663f7133902db581e71d256
+size 639912
diff --git a/src/assets/reachies/original/astronomer.png b/src/assets/reachies/original/astronomer.png
new file mode 100644
index 0000000000000000000000000000000000000000..d6df713116bfae65e708d8b5f13b6d8b7b3261cf
--- /dev/null
+++ b/src/assets/reachies/original/astronomer.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6a477e4ce71fba36fa8b96b131f07704925656769d6c0d3cbe6e92f0197961b0
+size 636762
diff --git a/src/assets/reachies/original/captain.png b/src/assets/reachies/original/captain.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb1eaaffd033533fc19585fc2bfda49b8794cb92
--- /dev/null
+++ b/src/assets/reachies/original/captain.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ca71dad3aa3d6c01a59115bea40c8267a3188e2c76e3e1dc422557c0126a1849
+size 716768
diff --git a/src/assets/reachies/original/cooking-chief.png b/src/assets/reachies/original/cooking-chief.png
new file mode 100644
index 0000000000000000000000000000000000000000..b4fc29b27e4ad64fab9b35379bab50108a8221c1
--- /dev/null
+++ b/src/assets/reachies/original/cooking-chief.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5976ac996bd50bd47a5477116c3739781c06352f7cbcc4257226b332088c0f73
+size 660440
diff --git a/src/assets/reachies/original/cowboy.png b/src/assets/reachies/original/cowboy.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b52f6e8b5f25e6eccc594a10272ec8810fca23c
--- /dev/null
+++ b/src/assets/reachies/original/cowboy.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:729500a893083b48e1f9b6c6e1a8878ddae358edd4eb1b48a69899c0e4363228
+size 785870
diff --git a/src/assets/reachies/original/doctor.png b/src/assets/reachies/original/doctor.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac9cdb08e3ead256f43a86991121722eb5e40d6d
--- /dev/null
+++ b/src/assets/reachies/original/doctor.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0a0d362981db03948d11a10f87f2d4b42814deb8d1a16a31e3e14fcdf76b47cd
+size 280401
diff --git a/src/assets/reachies/original/explorer.png b/src/assets/reachies/original/explorer.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b6c81ce0976fd43f56e7402d8e7d725b35c8bcf
--- /dev/null
+++ b/src/assets/reachies/original/explorer.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3cd02a31ada7e023460289998bd11c5cbd3c7c55cfabb214420ce4ad40a37f47
+size 644533
diff --git a/src/assets/reachies/original/farmer.png b/src/assets/reachies/original/farmer.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc1f70a9457f264a2c891884b251982218e814a1
--- /dev/null
+++ b/src/assets/reachies/original/farmer.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:35b69ec58780073b9464866c950989628fabd1e11cd5a4ef0bcb477edebe5a5c
+size 448414
diff --git a/src/assets/reachies/original/fisherman.png b/src/assets/reachies/original/fisherman.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c42f822083bed7c5a47eb0db5628477bf8f0c7c
--- /dev/null
+++ b/src/assets/reachies/original/fisherman.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6d244a16df0b3a9f4fb32b062dbc397b413ac4146616e2e816878fb6cdccc9c6
+size 619064
diff --git a/src/assets/reachies/original/hacker.png b/src/assets/reachies/original/hacker.png
new file mode 100644
index 0000000000000000000000000000000000000000..264066832c0ff6c8edf8a8701d3e83df239f9fde
--- /dev/null
+++ b/src/assets/reachies/original/hacker.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:000f417da2cd6d47dab0bc6c0a32c26a444fe216a7896a844d03f2f7742b7996
+size 1000862
diff --git a/src/assets/reachies/original/jazzman.png b/src/assets/reachies/original/jazzman.png
new file mode 100644
index 0000000000000000000000000000000000000000..6eb1867e4ab3b573283cc82f1591d06615f3199d
--- /dev/null
+++ b/src/assets/reachies/original/jazzman.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6ded3931bef0a593ea33221c5caab27ee000b8acf52ee972ab5c52fab387f442
+size 638315
diff --git a/src/assets/reachies/original/journalist.png b/src/assets/reachies/original/journalist.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc5d1b1df464500b08803c1341f2d548ddb1f27e
--- /dev/null
+++ b/src/assets/reachies/original/journalist.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b42d7a58054a8c1459c4ed8509116d9d0430caf77fc97b150629b50e6e137967
+size 611951
diff --git a/src/assets/reachies/original/lumberjack.png b/src/assets/reachies/original/lumberjack.png
new file mode 100644
index 0000000000000000000000000000000000000000..68a5d7b92e0d89ecd54951d6d963ffd2c4c2a2bf
--- /dev/null
+++ b/src/assets/reachies/original/lumberjack.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b581345a43efe3c9fc43f8a3f2f5627ee2907d502c9776c7c05dac05d479c6c5
+size 661239
diff --git a/src/assets/reachies/original/magician.png b/src/assets/reachies/original/magician.png
new file mode 100644
index 0000000000000000000000000000000000000000..60a09c6bfc1b38a0fb66b4551b569c9fd72a7e91
--- /dev/null
+++ b/src/assets/reachies/original/magician.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6b479d32c04eaba5b52176a87ef8725bfe05f3c67469b86ba1eab09af38b3488
+size 926011
diff --git a/src/assets/reachies/original/monk.png b/src/assets/reachies/original/monk.png
new file mode 100644
index 0000000000000000000000000000000000000000..a39419a1e343c1cfbb5dbcc860904c20d074946b
--- /dev/null
+++ b/src/assets/reachies/original/monk.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:556fc1665ef980d9470be808e36a54a12973a316060166aa92fa560d88d9cfa9
+size 720532
diff --git a/src/assets/reachies/original/plumber 2.png b/src/assets/reachies/original/plumber 2.png
new file mode 100644
index 0000000000000000000000000000000000000000..aacda6fb3f719cd11c1f0db39e98257045974d3d
--- /dev/null
+++ b/src/assets/reachies/original/plumber 2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:37b45825ef128738a67936ae8e10dc513cf72ea3a83aab967563dfe802235e2c
+size 743579
diff --git a/src/assets/reachies/original/plumber.png b/src/assets/reachies/original/plumber.png
new file mode 100644
index 0000000000000000000000000000000000000000..6944b2a7ba291f40bfee6502ad220d4728087718
--- /dev/null
+++ b/src/assets/reachies/original/plumber.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:518b03b7c7882f712b9ca62ec0c19cc0be87e7e1e8018ac3ca0dd66fcca8e3f1
+size 409460
diff --git a/src/assets/reachies/original/policeman.png b/src/assets/reachies/original/policeman.png
new file mode 100644
index 0000000000000000000000000000000000000000..b944753160653421b8eb527c18864750952b93e0
--- /dev/null
+++ b/src/assets/reachies/original/policeman.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8e5d5f4a41f9c2603c6e6939c4f5be8556276a3f1e2fe2a40f1f4445ad7bf7a1
+size 677460
diff --git a/src/assets/reachies/original/postman.png b/src/assets/reachies/original/postman.png
new file mode 100644
index 0000000000000000000000000000000000000000..907f2017c7e0d954b9324313ce3a1e3e0d5af3f3
--- /dev/null
+++ b/src/assets/reachies/original/postman.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6219078d97cfad96446e4683cc495359317d43d563e95c83ec554a341e2b5b94
+size 917898
diff --git a/src/assets/reachies/original/rich.png b/src/assets/reachies/original/rich.png
new file mode 100644
index 0000000000000000000000000000000000000000..626266e93c3eeb9df22793df8a5dbb0f038d177a
--- /dev/null
+++ b/src/assets/reachies/original/rich.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ea2778364c2d05152a6565086d2cb99769449f20f00befe7c2985ba019082c11
+size 630658
diff --git a/src/assets/reachies/original/student.png b/src/assets/reachies/original/student.png
new file mode 100644
index 0000000000000000000000000000000000000000..7987eb134697686721d8336c6b15ed3776b723b4
--- /dev/null
+++ b/src/assets/reachies/original/student.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8bb2ef774a09acfd8dc496f286705422838999fc71c6fe32a597a3b4569315d8
+size 622116
diff --git a/src/assets/reachies/original/taxi.png b/src/assets/reachies/original/taxi.png
new file mode 100644
index 0000000000000000000000000000000000000000..b6332498151b8da4a15c885c80688050b3230b82
--- /dev/null
+++ b/src/assets/reachies/original/taxi.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c443e1a45f0a8f9ceb5f9d5b2d100641def190f626070f39b75d837ce27759c6
+size 625764
diff --git a/src/assets/reachies/small-top-sided/cooking-chief.png b/src/assets/reachies/small-top-sided/cooking-chief.png
new file mode 100644
index 0000000000000000000000000000000000000000..2980dff9a6d1a3e0c2f355ae48977b16851e92a0
--- /dev/null
+++ b/src/assets/reachies/small-top-sided/cooking-chief.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2fa0c9fe4d0bf3038ec83fe2b9546be4eeb76d116798c1a78b02ea7f3ca8fe41
+size 106707
diff --git a/src/assets/reachies/small-top-sided/farmer.png b/src/assets/reachies/small-top-sided/farmer.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc2e431dfad34586a2bcc57e4afa4739e773ef23
--- /dev/null
+++ b/src/assets/reachies/small-top-sided/farmer.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bce2a141294536deb11ccddaa5edb9b1785ddcec5f942cfc55c234462e4fe0d6
+size 117359
diff --git a/src/assets/reachies/small-top-sided/fisherman.png b/src/assets/reachies/small-top-sided/fisherman.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b51f26792c77f177bd348782b0cd6a96d0fe167
--- /dev/null
+++ b/src/assets/reachies/small-top-sided/fisherman.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d4509b3b9d79fd28665d06add641054fdf8253c6547048196534066b2d299d5c
+size 95475
diff --git a/src/assets/reachies/small-top-sided/jazzman.png b/src/assets/reachies/small-top-sided/jazzman.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7a7e1218c2f73b349e33f3ad79406663524ae62
--- /dev/null
+++ b/src/assets/reachies/small-top-sided/jazzman.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4f14f05c18564de966139b4ac1135e28fa8b873c897f959d23d440f6d782a19f
+size 100145
diff --git a/src/assets/reachies/small-top-sided/rich.png b/src/assets/reachies/small-top-sided/rich.png
new file mode 100644
index 0000000000000000000000000000000000000000..99af6814847b2a3770ef2e66cb07bea8a120110a
--- /dev/null
+++ b/src/assets/reachies/small-top-sided/rich.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4014b0b0db515ad282a3971759c2d73f33734b80c4d8fb24011c6a46b8952602
+size 98947
diff --git a/src/assets/reachy-conversation-app.jpg b/src/assets/reachy-conversation-app.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..4a931c38b76d11ea831c2118b28c25561725352a
--- /dev/null
+++ b/src/assets/reachy-conversation-app.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0245adfd5b60c2c21bc4ae8f6e31f9565b2a35915c1f171a0538c46ecfc40e70
+size 160198
diff --git a/src/assets/reachy-hand-tracking-app.jpg b/src/assets/reachy-hand-tracking-app.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..33d0a41fccac7e2bb8d56d57b14d175104946ded
--- /dev/null
+++ b/src/assets/reachy-hand-tracking-app.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:62e22f77be87cf46bcaae86babc0544193dc910c9c1a1909d64af0172e5a9f23
+size 160785
diff --git a/src/assets/small-top-sided/cooking-chief.png b/src/assets/small-top-sided/cooking-chief.png
new file mode 100644
index 0000000000000000000000000000000000000000..2980dff9a6d1a3e0c2f355ae48977b16851e92a0
--- /dev/null
+++ b/src/assets/small-top-sided/cooking-chief.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2fa0c9fe4d0bf3038ec83fe2b9546be4eeb76d116798c1a78b02ea7f3ca8fe41
+size 106707
diff --git a/src/assets/small-top-sided/farmer.png b/src/assets/small-top-sided/farmer.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc2e431dfad34586a2bcc57e4afa4739e773ef23
--- /dev/null
+++ b/src/assets/small-top-sided/farmer.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bce2a141294536deb11ccddaa5edb9b1785ddcec5f942cfc55c234462e4fe0d6
+size 117359
diff --git a/src/assets/small-top-sided/fisherman.png b/src/assets/small-top-sided/fisherman.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b51f26792c77f177bd348782b0cd6a96d0fe167
--- /dev/null
+++ b/src/assets/small-top-sided/fisherman.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d4509b3b9d79fd28665d06add641054fdf8253c6547048196534066b2d299d5c
+size 95475
diff --git a/src/assets/small-top-sided/jazzman.png b/src/assets/small-top-sided/jazzman.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7a7e1218c2f73b349e33f3ad79406663524ae62
--- /dev/null
+++ b/src/assets/small-top-sided/jazzman.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4f14f05c18564de966139b4ac1135e28fa8b873c897f959d23d440f6d782a19f
+size 100145
diff --git a/src/assets/small-top-sided/rich.png b/src/assets/small-top-sided/rich.png
new file mode 100644
index 0000000000000000000000000000000000000000..99af6814847b2a3770ef2e66cb07bea8a120110a
--- /dev/null
+++ b/src/assets/small-top-sided/rich.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4014b0b0db515ad282a3971759c2d73f33734b80c4d8fb24011c6a46b8952602
+size 98947
diff --git a/src/assets/small/alfred.png b/src/assets/small/alfred.png
new file mode 100644
index 0000000000000000000000000000000000000000..13ffc86aeff1619fe66d1e913dd6d2a27cb46c87
--- /dev/null
+++ b/src/assets/small/alfred.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:850c15aa7dc1167ef369957ebb6de9e0cd517006ff3ced7dac790050c3bfbb01
+size 206143
diff --git a/src/assets/small/ambulance.png b/src/assets/small/ambulance.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ee8fee3e53e64582359a28b8070dcd00cf5aaaf
--- /dev/null
+++ b/src/assets/small/ambulance.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2eae79fd12dfb3106046d0456b1a0e233454f6d09358f7b049fce4e7563d1c25
+size 96825
diff --git a/src/assets/small/aristocrat.png b/src/assets/small/aristocrat.png
new file mode 100644
index 0000000000000000000000000000000000000000..614a0a58a3a9519f1cdd3d070688e2e4128d62c4
--- /dev/null
+++ b/src/assets/small/aristocrat.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c3766fcc46df3c41c6adc7f578161f532f9f75c6391c3673e0a3ea837b70d78b
+size 143977
diff --git a/src/assets/small/astronaut.png b/src/assets/small/astronaut.png
new file mode 100644
index 0000000000000000000000000000000000000000..61a888436f4abad84a69ecdf3efddca342562060
--- /dev/null
+++ b/src/assets/small/astronaut.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d7e23735ff4124f890657ed1b431cf08362371fd08c46d85c4764781abddc0cd
+size 102829
diff --git a/src/assets/small/astronomer.png b/src/assets/small/astronomer.png
new file mode 100644
index 0000000000000000000000000000000000000000..af69d1d65340045b6ce6f48c01afcce6e7499fce
--- /dev/null
+++ b/src/assets/small/astronomer.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8f9f390d8056267fb71ed1390233b756fbb27a459a62700a0e11b2e981955e68
+size 102286
diff --git a/src/assets/small/captain.png b/src/assets/small/captain.png
new file mode 100644
index 0000000000000000000000000000000000000000..900e13acd7f966abcdb8e875972dc537f9d965fa
--- /dev/null
+++ b/src/assets/small/captain.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1dd123cdb7afd108c9c969a0215a73e3a9c6664e39f996548ba14a9d7ccded01
+size 124057
diff --git a/src/assets/small/cooking-chief.png b/src/assets/small/cooking-chief.png
new file mode 100644
index 0000000000000000000000000000000000000000..1cbd225e2360d7a70b4d13ba295a039255513cd9
--- /dev/null
+++ b/src/assets/small/cooking-chief.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a9bcf73defd06d0f0381d657bd876a6ae8f50553d63979fd7a0cb2ac6ed02058
+size 108582
diff --git a/src/assets/small/cowboy.png b/src/assets/small/cowboy.png
new file mode 100644
index 0000000000000000000000000000000000000000..74e3287606f135f2826acab4332b5493bfcac2a9
--- /dev/null
+++ b/src/assets/small/cowboy.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8594eeb34e089cf9bba917d4e037c8b4ac18da58bc41edc382bd0a8af4903a04
+size 139745
diff --git a/src/assets/small/doctor.png b/src/assets/small/doctor.png
new file mode 100644
index 0000000000000000000000000000000000000000..266d16c5e5ba27871f6fbbda438bba5057e1a433
--- /dev/null
+++ b/src/assets/small/doctor.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:65f869a7225a75003728b1cc6956cf1cbb88d274b78034bfe8b54aff6a4883d5
+size 73251
diff --git a/src/assets/small/explorer.png b/src/assets/small/explorer.png
new file mode 100644
index 0000000000000000000000000000000000000000..e4617444603c67911cc796b5e97a3393d043c525
--- /dev/null
+++ b/src/assets/small/explorer.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ac2c8e717f5ee2b346bdb596d48afa23387d01cb972de6d36224cd62347755fb
+size 107291
diff --git a/src/assets/small/farmer.png b/src/assets/small/farmer.png
new file mode 100644
index 0000000000000000000000000000000000000000..81e2d5db9a8c7b0b55c2fe31fde530eed73f57bf
--- /dev/null
+++ b/src/assets/small/farmer.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:674fe55bdfb8f83130176b4ec4ad235d4b08985ed5feaf0837e6bc79ac24083a
+size 114965
diff --git a/src/assets/small/fisherman.png b/src/assets/small/fisherman.png
new file mode 100644
index 0000000000000000000000000000000000000000..96fef25c23b111eb745ca936a698bdb0ee0da97a
--- /dev/null
+++ b/src/assets/small/fisherman.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9299c183f71d89ffde31e6fc64c61c3c61ae37b1848b9d03a7eb00dd41f69798
+size 96628
diff --git a/src/assets/small/hacker.png b/src/assets/small/hacker.png
new file mode 100644
index 0000000000000000000000000000000000000000..8eb3292083d8921fbe2e48951cc2cfceb6d9eb40
--- /dev/null
+++ b/src/assets/small/hacker.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d611686b7372eac431bb98c81039b8eb1bf682fac4eb5a48d0aff442c1fa5fe5
+size 261316
diff --git a/src/assets/small/jazzman.png b/src/assets/small/jazzman.png
new file mode 100644
index 0000000000000000000000000000000000000000..c0f296453d2e8e124826bb85f2a5e7b71ef8019e
--- /dev/null
+++ b/src/assets/small/jazzman.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:be4788a7319dd64bf3b003514d5fcd61ad1aae6c8bfa6572b993dcae6e15b5d6
+size 104829
diff --git a/src/assets/small/journalist.png b/src/assets/small/journalist.png
new file mode 100644
index 0000000000000000000000000000000000000000..b99085c3e162913890d96075076041a265713179
--- /dev/null
+++ b/src/assets/small/journalist.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a141dd8fcbfbbd666bf4a916aba35e0f47a103643d371b2bd8dc316b0e2e763b
+size 97311
diff --git a/src/assets/small/lumberjack.png b/src/assets/small/lumberjack.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d3edb921b5928abe7d538a380caf62c6249b031
--- /dev/null
+++ b/src/assets/small/lumberjack.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a99db9d0515cb174f7c7c703fe65848343e2cf3dc5182e7e750425092c1c2cf9
+size 103385
diff --git a/src/assets/small/magician.png b/src/assets/small/magician.png
new file mode 100644
index 0000000000000000000000000000000000000000..d77d5f8dde07071302bf00902bd383db7022922d
--- /dev/null
+++ b/src/assets/small/magician.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7e9cc5ac702d90b486e1f0c0e7c486fb42583f4543013678278d4061d52276d4
+size 214861
diff --git a/src/assets/small/monk.png b/src/assets/small/monk.png
new file mode 100644
index 0000000000000000000000000000000000000000..96feee6c1dac73281f732a32a227b68bd1199200
--- /dev/null
+++ b/src/assets/small/monk.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:64a55cf69c4492cd3bcf512701a15fb004179faee35831486ddb9e7ef351c075
+size 124197
diff --git a/src/assets/small/plumber 2.png b/src/assets/small/plumber 2.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff2441c0a68824cde7547194e93eef97095b1998
--- /dev/null
+++ b/src/assets/small/plumber 2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3f985e58b4b925d7586eacd69f27160da4180323c65ff60e7bb8d2b8dcdb9916
+size 144175
diff --git a/src/assets/small/plumber.png b/src/assets/small/plumber.png
new file mode 100644
index 0000000000000000000000000000000000000000..9dbc70df3826d599404a075ee62552af4dde3b85
--- /dev/null
+++ b/src/assets/small/plumber.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5fe16390ba4e096eecdf9a6abba6ad56df0186b204137d674ab72df75d2853ad
+size 104996
diff --git a/src/assets/small/policeman.png b/src/assets/small/policeman.png
new file mode 100644
index 0000000000000000000000000000000000000000..ace3bbf6ef4739915c74b7c2eeae9a54f04371e2
--- /dev/null
+++ b/src/assets/small/policeman.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cf70b5714cf911e132cb2502d1480a617e06539fdc937a265ed7e182c679d672
+size 108432
diff --git a/src/assets/small/postman.png b/src/assets/small/postman.png
new file mode 100644
index 0000000000000000000000000000000000000000..955d4753a8976767486b32b9b017c8e93b865625
--- /dev/null
+++ b/src/assets/small/postman.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b222eee0694497112c26a4ec615d5f89c3a003a93a232c81a2d9fdd625f8f1a1
+size 215986
diff --git a/src/assets/small/rich.png b/src/assets/small/rich.png
new file mode 100644
index 0000000000000000000000000000000000000000..62bb25f5aae57b5ff1754455fe5df09bc3151422
--- /dev/null
+++ b/src/assets/small/rich.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1dfaddcf98715d7f3799d47ec03f58b2148987ebec666bd609e1c1cdbb21b953
+size 101465
diff --git a/src/assets/small/student.png b/src/assets/small/student.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a123ec5bddd1ae1d4d85aa82bf25318bf935d9e
--- /dev/null
+++ b/src/assets/small/student.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:959a0844d527995e19d4a77d5a02a3f3fd8baf30029ee4c2b05be5af23733808
+size 101889
diff --git a/src/assets/small/taxi.png b/src/assets/small/taxi.png
new file mode 100644
index 0000000000000000000000000000000000000000..53cf23d0b86c4ad6a1d3e384c62c36a51b6a18dd
--- /dev/null
+++ b/src/assets/small/taxi.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e44f3fe2c83739ad42afab1429b7f465383302aab205fd3d1ba402fe5f7ed5b3
+size 97495
diff --git a/src/components/DecorativeShape.jsx b/src/components/DecorativeShape.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..273bef60690919c096e9cc886dca2a4b0216d7e6
--- /dev/null
+++ b/src/components/DecorativeShape.jsx
@@ -0,0 +1,153 @@
+import { useEffect, useState } from 'react';
+import { useSpring, animated } from '@react-spring/web';
+
+/**
+ * Decorative shape component to be placed near specific UI elements
+ * Position it relative to a parent container with position: relative
+ */
+export default function DecorativeShape({
+ color = '#FF9500',
+ size = 80,
+ top,
+ left,
+ right,
+ bottom,
+ type = 'circle', // circle, square, ring, dot
+ rotation = 0,
+ opacity = 0.12,
+ floatRange = 6,
+ floatSpeed = 5000,
+ scrollFactor = 0.03,
+ zIndex = 0,
+}) {
+ const [floatOffset, setFloatOffset] = useState(0);
+ const [scrollY, setScrollY] = useState(0);
+
+ // Floating animation loop
+ useEffect(() => {
+ let startTime = Date.now();
+ let animationFrame;
+
+ const animate = () => {
+ const elapsed = Date.now() - startTime;
+ const offset = Math.sin((elapsed / floatSpeed) * Math.PI * 2) * floatRange;
+ setFloatOffset(offset);
+ animationFrame = requestAnimationFrame(animate);
+ };
+
+ animationFrame = requestAnimationFrame(animate);
+ return () => cancelAnimationFrame(animationFrame);
+ }, [floatSpeed, floatRange]);
+
+ // Scroll listener
+ useEffect(() => {
+ const handleScroll = () => {
+ setScrollY(window.scrollY);
+ };
+
+ window.addEventListener('scroll', handleScroll, { passive: true });
+ return () => window.removeEventListener('scroll', handleScroll);
+ }, []);
+
+ // Spring animation for smooth movement
+ const springProps = useSpring({
+ transform: `translateY(${floatOffset + scrollY * scrollFactor}px) rotate(${rotation}deg)`,
+ config: {
+ mass: 2,
+ tension: 120,
+ friction: 30,
+ },
+ });
+
+ const baseStyles = {
+ position: 'absolute',
+ top,
+ left,
+ right,
+ bottom,
+ width: size,
+ height: size,
+ pointerEvents: 'none',
+ zIndex,
+ };
+
+ // Shape variants
+ const shapeStyles = {
+ circle: {
+ borderRadius: '50%',
+ background: color,
+ opacity,
+ },
+ ring: {
+ borderRadius: '50%',
+ background: 'transparent',
+ border: `2px solid ${color}`,
+ opacity: opacity * 1.5,
+ },
+ square: {
+ borderRadius: size * 0.15,
+ background: color,
+ opacity,
+ },
+ squareOutline: {
+ borderRadius: size * 0.15,
+ background: 'transparent',
+ border: `2px solid ${color}`,
+ opacity: opacity * 1.5,
+ },
+ dot: {
+ borderRadius: '50%',
+ background: color,
+ opacity: opacity * 2,
+ },
+ };
+
+ return (
+
+ );
+}
+
+// Pre-configured shape combinations for common use cases
+export function ShapeCluster({ position = 'topRight', colors = ['#FF9500', '#764ba2'] }) {
+ const positions = {
+ topRight: { top: -20, right: -30 },
+ topLeft: { top: -20, left: -30 },
+ bottomRight: { bottom: -20, right: -30 },
+ bottomLeft: { bottom: -20, left: -30 },
+ };
+
+ const pos = positions[position];
+
+ return (
+ <>
+
+
+ >
+ );
+}
+
diff --git a/src/components/Footer.jsx b/src/components/Footer.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..48b2ca0419c82a2ae5386b24158be8488c26940a
--- /dev/null
+++ b/src/components/Footer.jsx
@@ -0,0 +1,342 @@
+import { Box, Container, Typography, Link, Stack, Grid, IconButton, Divider, TextField, Button } from '@mui/material';
+import { Link as RouterLink } from 'react-router-dom';
+import GitHubIcon from '@mui/icons-material/GitHub';
+import XIcon from '@mui/icons-material/X';
+import LinkedInIcon from '@mui/icons-material/LinkedIn';
+import YouTubeIcon from '@mui/icons-material/YouTube';
+
+const productLinks = [
+ { label: 'Get Started', href: '/getting-started', external: false },
+ { label: 'Build with Python', href: '/build', external: false },
+ { label: 'Download App', href: '/download', external: false },
+ { label: 'Browse Apps', href: '/apps', external: false },
+ { label: 'Buy Reachy Mini', href: '/buy', external: false },
+];
+
+const resourceLinks = [
+ { label: 'Assembly Guide', href: 'https://huggingface.co/spaces/pollen-robotics/Reachy_Mini_Assembly_Guide', external: true },
+ { label: 'Python SDK', href: 'https://github.com/pollen-robotics/reachy_mini', external: true },
+ { label: 'Documentation', href: 'https://github.com/pollen-robotics/reachy_mini#readme', external: true },
+ { label: 'API Reference', href: 'https://github.com/pollen-robotics/reachy_mini', external: true },
+];
+
+const communityLinks = [
+ { label: 'Discord Server', href: 'https://discord.gg/2bAhWfXme9', external: true },
+ { label: 'Hugging Face Spaces', href: 'https://huggingface.co/spaces?q=reachy_mini', external: true },
+ { label: 'GitHub Discussions', href: 'https://github.com/pollen-robotics/reachy_mini/discussions', external: true },
+ { label: 'Share your Project', href: 'https://discord.gg/2bAhWfXme9', external: true },
+];
+
+const socialLinks = [
+ { icon: GitHubIcon, href: 'https://github.com/pollen-robotics', label: 'GitHub' },
+ { icon: XIcon, href: 'https://x.com/polaborearobot', label: 'X (Twitter)' },
+ { icon: LinkedInIcon, href: 'https://www.linkedin.com/company/pollen-robotics/', label: 'LinkedIn' },
+ { icon: YouTubeIcon, href: 'https://www.youtube.com/@pollen-robotics', label: 'YouTube' },
+];
+
+function FooterLink({ link }) {
+ const linkStyles = {
+ color: 'rgba(255, 255, 255, 0.6)',
+ textDecoration: 'none',
+ fontSize: 14,
+ display: 'block',
+ py: 0.5,
+ transition: 'color 0.2s ease',
+ '&:hover': {
+ color: 'white',
+ },
+ };
+
+ if (link.external) {
+ return (
+
+ {link.label}
+
+ );
+ }
+
+ return (
+
+ {link.label}
+
+ );
+}
+
+function FooterSection({ title, links }) {
+ return (
+
+
+ {title}
+
+
+ {links.map((link) => (
+
+ ))}
+
+
+ );
+}
+
+export default function Footer() {
+ return (
+
+ {/* Subtle gradient overlay */}
+
+
+ {/* Decorative sleeping Reachy */}
+
+
+
+ {/* Main Footer Content */}
+
+ {/* Brand Column */}
+
+
+
+
+
+ Reachy Mini
+
+
+
+ An expressive open-source companion robot designed for human interaction,
+ creative coding, and AI experimentation. Build, play, and innovate with robotics.
+
+
+
+ {/* Social Links */}
+
+ {socialLinks.map((social) => (
+
+
+
+ ))}
+
+
+
+ {/* Links Columns */}
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Newsletter / CTA Column */}
+
+
+
+ Stay Updated
+
+
+ Join our Discord to get the latest updates, tutorials, and community projects.
+
+
+
+
+
+
+ {/* Divider */}
+
+
+ {/* Bottom Bar */}
+
+ {/* Copyright & Credits */}
+
+ © {new Date().getFullYear()} Reachy Mini. Open source under Apache 2.0 license.
+
+
+ {/* Brought by */}
+
+
+ Proudly brought by
+
+
+ Pollen Robotics
+
+ ×
+
+ 🤗 Hugging Face
+
+
+
+ {/* Legal Links */}
+
+
+ License
+
+
+ Privacy
+
+
+ Terms
+
+
+
+
+
+ );
+}
diff --git a/src/components/Header.jsx b/src/components/Header.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..80601f32d416d4568a663708f6eeb91751314461
--- /dev/null
+++ b/src/components/Header.jsx
@@ -0,0 +1,328 @@
+import { useState, useEffect } from 'react';
+import { Link as RouterLink, useLocation } from 'react-router-dom';
+import {
+ AppBar,
+ Toolbar,
+ Typography,
+ Button,
+ Box,
+ IconButton,
+ Drawer,
+ List,
+ ListItem,
+ ListItemButton,
+ ListItemText,
+ useMediaQuery,
+ useTheme,
+ Link,
+ Container,
+} from '@mui/material';
+import MenuIcon from '@mui/icons-material/Menu';
+import CloseIcon from '@mui/icons-material/Close';
+import OpenInNewIcon from '@mui/icons-material/OpenInNew';
+
+const navItems = [
+ { label: 'Apps', href: '/apps' },
+ { label: 'Get Started', href: '/getting-started' },
+ { label: 'Download', href: '/download' },
+ { label: 'Build', href: '/build' },
+ { label: 'FAQ', href: '/faq' },
+ { label: 'Community', href: 'https://discord.gg/2bAhWfXme9', external: true },
+];
+
+export default function Header({ transparent = false }) {
+ const [mobileOpen, setMobileOpen] = useState(false);
+ const [scrolled, setScrolled] = useState(false);
+ const theme = useTheme();
+ const isMobile = useMediaQuery(theme.breakpoints.down('md'));
+ const location = useLocation();
+
+ // Track scroll position for transparent header
+ useEffect(() => {
+ if (!transparent) return;
+
+ const handleScroll = () => {
+ setScrolled(window.scrollY > 80);
+ };
+
+ window.addEventListener('scroll', handleScroll);
+ return () => window.removeEventListener('scroll', handleScroll);
+ }, [transparent]);
+
+ const handleDrawerToggle = () => {
+ setMobileOpen(!mobileOpen);
+ };
+
+ const handleNavClick = (item) => {
+ setMobileOpen(false);
+ if (item.external) return;
+
+ if (item.href.startsWith('/#')) {
+ const elementId = item.href.replace('/#', '');
+ if (location.pathname === '/') {
+ const element = document.getElementById(elementId);
+ if (element) {
+ element.scrollIntoView({ behavior: 'smooth' });
+ }
+ }
+ }
+ };
+
+ // Determine colors based on transparent mode and scroll state
+ const isTransparentMode = transparent && !scrolled;
+ const textColor = isTransparentMode ? 'white' : 'text.primary';
+ const bgColor = isTransparentMode
+ ? 'transparent'
+ : 'rgba(255, 255, 255, 0.85)';
+ const backdropFilter = isTransparentMode
+ ? 'none'
+ : 'saturate(180%) blur(20px)';
+
+ const drawer = (
+
+
+
+
+
+ Reachy Mini
+
+
+
+
+
+
+
+ {navItems.map((item) => (
+
+ handleNavClick(item)}
+ sx={{
+ py: 1.5,
+ px: 2,
+ borderRadius: 2,
+ '&:hover': {
+ backgroundColor: 'rgba(0,0,0,0.04)',
+ },
+ }}
+ >
+
+ {item.label}
+ {item.external && (
+
+ )}
+
+ }
+ />
+
+
+ ))}
+
+
+
+
+
+ );
+
+ return (
+ <>
+
+
+
+ {/* Logo */}
+
+
+
+ Reachy Mini
+
+
+
+ {isMobile ? (
+
+
+
+ ) : (
+
+ {/* Nav Links */}
+
+ {navItems.map((item) => (
+ item.external ? (
+
+ {item.label}
+
+
+ ) : (
+ handleNavClick(item)}
+ sx={{
+ color: textColor,
+ textDecoration: location.pathname === item.href ? 'underline' : 'none',
+ textUnderlineOffset: 6,
+ textDecorationThickness: 2,
+ fontSize: 15,
+ fontWeight: location.pathname === item.href ? 600 : 500,
+ opacity: location.pathname === item.href ? 1 : 0.85,
+ transition: 'opacity 0.2s',
+ whiteSpace: 'nowrap',
+ '&:hover': {
+ opacity: 1,
+ },
+ }}
+ >
+ {item.label}
+
+ )
+ ))}
+
+
+ {/* CTA Button */}
+
+
+ )}
+
+
+
+
+ {/* Mobile Drawer */}
+
+ {drawer}
+
+
+ {/* Spacer for fixed AppBar - only show if not transparent */}
+ {!transparent && }
+ >
+ );
+}
diff --git a/src/components/Layout.jsx b/src/components/Layout.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..d72be0e93a71607ca3ffb01beb8a6364dfe76a3a
--- /dev/null
+++ b/src/components/Layout.jsx
@@ -0,0 +1,15 @@
+import { Box } from '@mui/material';
+import Header from './Header';
+import Footer from './Footer';
+
+export default function Layout({ children, transparentHeader = false }) {
+ return (
+
+
+
+ {children}
+
+
+
+ );
+}
diff --git a/src/components/PageHero.jsx b/src/components/PageHero.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..4c8ea7c02420d1c496b84534f8eeb7a6f9dd3478
--- /dev/null
+++ b/src/components/PageHero.jsx
@@ -0,0 +1,287 @@
+import { useState, useEffect } from 'react';
+import { Box, Container, Typography, Chip, Stack } from '@mui/material';
+import { useSpring, animated } from '@react-spring/web';
+
+// Floating Sticker with scroll parallax
+function FloatingSticker({ src, size, top, left, right, bottom, rotation = 0, floatRange = 12, floatSpeed = 5500, scrollFactor = 0.03 }) {
+ const [floatOffset, setFloatOffset] = useState(0);
+ const [scrollY, setScrollY] = useState(0);
+
+ useEffect(() => {
+ let startTime = Date.now();
+ let animationFrame;
+
+ const animate = () => {
+ const elapsed = Date.now() - startTime;
+ const offset = Math.sin((elapsed / floatSpeed) * Math.PI * 2) * floatRange;
+ setFloatOffset(offset);
+ animationFrame = requestAnimationFrame(animate);
+ };
+
+ animationFrame = requestAnimationFrame(animate);
+ return () => cancelAnimationFrame(animationFrame);
+ }, [floatSpeed, floatRange]);
+
+ useEffect(() => {
+ const handleScroll = () => setScrollY(window.scrollY);
+ window.addEventListener('scroll', handleScroll, { passive: true });
+ return () => window.removeEventListener('scroll', handleScroll);
+ }, []);
+
+ const springProps = useSpring({
+ transform: `translateY(${floatOffset + scrollY * scrollFactor}px) rotate(${rotation}deg)`,
+ config: { mass: 3, tension: 80, friction: 40 },
+ });
+
+ return (
+
+ );
+}
+
+// Floating Primitive Shape
+function FloatingPrimitive({ type = 'circle', color, size, top, left, right, bottom, rotation = 0, floatRange = 8, floatSpeed = 5000, scrollFactor = 0.02 }) {
+ const [floatOffset, setFloatOffset] = useState(0);
+ const [scrollY, setScrollY] = useState(0);
+
+ useEffect(() => {
+ let startTime = Date.now();
+ let animationFrame;
+
+ const animate = () => {
+ const elapsed = Date.now() - startTime;
+ const offset = Math.sin((elapsed / floatSpeed) * Math.PI * 2) * floatRange;
+ setFloatOffset(offset);
+ animationFrame = requestAnimationFrame(animate);
+ };
+
+ animationFrame = requestAnimationFrame(animate);
+ return () => cancelAnimationFrame(animationFrame);
+ }, [floatSpeed, floatRange]);
+
+ useEffect(() => {
+ const handleScroll = () => setScrollY(window.scrollY);
+ window.addEventListener('scroll', handleScroll, { passive: true });
+ return () => window.removeEventListener('scroll', handleScroll);
+ }, []);
+
+ const springProps = useSpring({
+ transform: `translateY(${floatOffset + scrollY * scrollFactor}px) rotate(${rotation}deg)`,
+ config: { mass: 2, tension: 100, friction: 35 },
+ });
+
+ const shapeStyles = {
+ circle: { borderRadius: '50%', background: color, opacity: 0.15 },
+ ring: { borderRadius: '50%', background: 'transparent', border: `2px solid ${color}`, opacity: 0.2 },
+ square: { borderRadius: size * 0.15, background: color, opacity: 0.12 },
+ squareOutline: { borderRadius: size * 0.15, background: 'transparent', border: `2px solid ${color}`, opacity: 0.18 },
+ };
+
+ return (
+
+ );
+}
+
+/**
+ * Standardized Page Hero component
+ * @param {string} eyebrow - Small text above title (optional)
+ * @param {string} title - Main title
+ * @param {string} subtitle - Description text
+ * @param {React.ReactNode} children - Additional content (buttons, etc.)
+ * @param {Array} stickers - Array of sticker configs [{ src, size, top, left, right, bottom, rotation }]
+ * @param {Array} primitives - Array of primitive configs [{ type, color, size, top, left, right, bottom, rotation }]
+ * @param {string} accentColor - Primary accent color for the page (used in gradient orbs)
+ */
+export default function PageHero({
+ eyebrow,
+ title,
+ subtitle,
+ children,
+ stickers = [],
+ primitives = [],
+ accentColor = '#764ba2',
+ icon,
+}) {
+ return (
+
+ {/* Gradient orbs */}
+
+
+
+ {/* Floating stickers */}
+
+ {stickers.map((sticker, i) => (
+
+ ))}
+
+
+ {/* Floating primitives */}
+ {primitives.map((prim, i) => (
+
+ ))}
+
+
+ {/* Icon */}
+ {icon && (
+
+ {icon}
+
+ )}
+
+ {/* Eyebrow */}
+ {eyebrow && (
+
+ )}
+
+ {/* Title */}
+
+ {title}
+
+
+ {/* Subtitle */}
+ {subtitle && (
+
+ {subtitle}
+
+ )}
+
+ {/* Additional content (buttons, etc.) */}
+ {children && (
+
+ {children}
+
+ )}
+
+
+ );
+}
+
diff --git a/src/components/PricingCard.jsx b/src/components/PricingCard.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..4962117a6dfe0eaee5cff948d07766c1ad393bb7
--- /dev/null
+++ b/src/components/PricingCard.jsx
@@ -0,0 +1,116 @@
+import {
+ Card,
+ CardContent,
+ Typography,
+ Button,
+ Chip,
+ List,
+ ListItem,
+ ListItemIcon,
+ ListItemText,
+ Box,
+} from '@mui/material';
+import CheckIcon from '@mui/icons-material/Check';
+import OpenInNewIcon from '@mui/icons-material/OpenInNew';
+
+export default function PricingCard({
+ title,
+ price,
+ badge,
+ badgeColor = 'primary',
+ features,
+ buttonText,
+ buttonLink,
+ featured = false
+}) {
+ return (
+
+ {featured && (
+
+ )}
+
+
+
+
+
+ {title}
+
+
+
+ {price}
+
+
+
+ {features.map((feature, index) => (
+
+
+
+
+
+
+ ))}
+
+
+ }
+ >
+ {buttonText}
+
+
+
+ );
+}
+
diff --git a/src/components/ReachiesCarousel.jsx b/src/components/ReachiesCarousel.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..e938ee0e60679f47e8a0a1bdece27e10fa896a7f
--- /dev/null
+++ b/src/components/ReachiesCarousel.jsx
@@ -0,0 +1,195 @@
+import React, { useState, useEffect, useMemo } from 'react';
+import { Box } from '@mui/material';
+
+// Load all images from reachies/small-top-sided folder dynamically with Vite
+const imageModules = import.meta.glob('../assets/reachies/small-top-sided/*.png', { eager: true });
+
+/**
+ * Component that loads all PNG images from reachies/small-top-sided folder,
+ * stores them in memory and displays them in sequence with overlapping fade transition.
+ *
+ * Images are loaded dynamically and displayed one after another
+ * in a fixed frame, with a fade in/out transition between each image.
+ */
+export default function ReachiesCarousel({
+ width = 100,
+ height = 100,
+ interval = 1000, // Display duration of each image in ms (faster)
+ transitionDuration = 150, // Fade transition duration in ms (very sharp) - DEPRECATED, use fadeInDuration and fadeOutDuration
+ fadeInDuration = 350, // Fade-in duration for incoming image (slower, Apple/Google style)
+ fadeOutDuration = 120, // Fade-out duration for outgoing image (faster, Apple/Google style)
+ zoom = 1.8, // Zoom factor to enlarge the sticker
+ verticalAlign = 'center', // Vertical alignment: 'top', 'center', 'bottom', or percentage (e.g.: '60%')
+ darkMode = false,
+ sx = {}
+}) {
+ // Extract URLs of loaded images and sort them for consistent order
+ const imagePaths = useMemo(() => {
+ const paths = Object.values(imageModules)
+ .map(module => {
+ // With eager: true, module is already loaded, access .default
+ return typeof module === 'object' && module !== null && 'default' in module
+ ? module.default
+ : module;
+ })
+ .filter(Boolean) // Filter null/undefined values
+ .sort(); // Sort for consistent order
+
+ return paths;
+ }, []);
+
+ const [currentIndex, setCurrentIndex] = useState(0);
+ const [previousIndex, setPreviousIndex] = useState(null);
+ const [isTransitioning, setIsTransitioning] = useState(false);
+ const [fadeOutComplete, setFadeOutComplete] = useState(false);
+
+ // Preload all images in memory for smooth transitions
+ useEffect(() => {
+ imagePaths.forEach(imagePath => {
+ const img = new Image();
+ img.src = imagePath;
+ });
+ }, [imagePaths]);
+
+ // Function to get a random index different from current
+ const getRandomIndex = (currentIdx, total) => {
+ if (total <= 1) return 0;
+ let newIndex;
+ do {
+ newIndex = Math.floor(Math.random() * total);
+ } while (newIndex === currentIdx && total > 1);
+ return newIndex;
+ };
+
+ // Automatically change image with overlap and random selection
+ useEffect(() => {
+ if (imagePaths.length > 0) {
+ const timer = setInterval(() => {
+ // Save previous index BEFORE changing to guarantee crossfade
+ const prevIdx = currentIndex;
+ setPreviousIndex(prevIdx);
+ setIsTransitioning(true);
+ setFadeOutComplete(false); // Reset at start of transition
+
+ // Select a random image different from current
+ const newIndex = getRandomIndex(currentIndex, imagePaths.length);
+ setCurrentIndex(newIndex);
+
+ // Outgoing image starts disappearing after a delay to create more overlap
+ // Both images remain visible together longer
+ const overlapDelay = Math.min(fadeInDuration * 0.4, fadeOutDuration * 2); // 40% of fade-in or 2x fade-out
+ setTimeout(() => {
+ setFadeOutComplete(true);
+ }, overlapDelay);
+
+ // Reset transition state after longest duration (fade-in)
+ setTimeout(() => {
+ setIsTransitioning(false);
+ setPreviousIndex(null);
+ setFadeOutComplete(false);
+ }, Math.max(fadeInDuration, fadeOutDuration));
+ }, interval);
+
+ return () => clearInterval(timer);
+ }
+ }, [imagePaths.length, interval, currentIndex, fadeInDuration, fadeOutDuration]);
+
+ if (imagePaths.length === 0) {
+ return (
+
+ );
+ }
+
+ return (
+
+ {imagePaths.map((imageSrc, index) => {
+ const isActive = index === currentIndex;
+ const isPrevious = index === previousIndex && isTransitioning;
+
+ // Calculate vertical position according to alignment
+ let topValue, transformY;
+ if (verticalAlign === 'top') {
+ topValue = 0;
+ transformY = '0';
+ } else if (verticalAlign === 'bottom') {
+ topValue = '100%';
+ transformY = '-100%';
+ } else if (typeof verticalAlign === 'string' && verticalAlign.includes('%')) {
+ // Custom percentage
+ topValue = verticalAlign;
+ transformY = '-50%';
+ } else {
+ // Default: center
+ topValue = '50%';
+ transformY = '-50%';
+ }
+
+ // Crossfade style Apple/Google: outgoing disappears faster than incoming appears
+ const baseOpacity = darkMode ? 0.8 : 0.9;
+ let opacity = 0;
+ let transitionStyle = 'none';
+
+ // Crossfade logic: both images must be visible simultaneously
+ if (isActive) {
+ // Incoming image: slow and progressive fade-in (premium style)
+ opacity = baseOpacity;
+ transitionStyle = `opacity ${fadeInDuration}ms cubic-bezier(0.4, 0, 0.2, 1)`; // Smooth ease-out
+ } else if (isPrevious) {
+ // Outgoing image: fast fade-out (disappears quickly to make room)
+ // Starts visible, then disappears after fadeOutDuration
+ opacity = fadeOutComplete ? 0 : baseOpacity;
+ transitionStyle = `opacity ${fadeOutDuration}ms cubic-bezier(0.4, 0, 1, 1)`; // More aggressive ease-out
+ }
+ // Otherwise opacity stays at 0 (invisible)
+
+ return (
+
+ );
+ })}
+
+ );
+}
+
diff --git a/src/components/Section.jsx b/src/components/Section.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..794fadad3d12f6981adc60e4c29e3af0d209a75e
--- /dev/null
+++ b/src/components/Section.jsx
@@ -0,0 +1,65 @@
+import { Box, Container, Typography } from '@mui/material';
+
+export default function Section({
+ id,
+ children,
+ background = 'default',
+ maxWidth = 'lg',
+ sx = {},
+}) {
+ const bgColors = {
+ default: 'background.default',
+ alt: 'background.alt',
+ dark: 'secondary.main',
+ };
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function SectionHeader({ eyebrow, title, subtitle, light = false }) {
+ return (
+
+ {eyebrow && (
+
+ {eyebrow}
+
+ )}
+
+ {title}
+
+ {subtitle && (
+
+ {subtitle}
+
+ )}
+
+ );
+}
+
diff --git a/src/components/index.js b/src/components/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..7eee06d2c171cb6b00f2c9bc68e8ed65f6598a28
--- /dev/null
+++ b/src/components/index.js
@@ -0,0 +1,6 @@
+export { default as Header } from './Header';
+export { default as Footer } from './Footer';
+export { default as Layout } from './Layout';
+export { default as PricingCard } from './PricingCard';
+export { default as Section, SectionHeader } from './Section';
+
diff --git a/src/context/AppsContext.jsx b/src/context/AppsContext.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..83abd8e527fdb720e38b6bc0015431712e0fc187
--- /dev/null
+++ b/src/context/AppsContext.jsx
@@ -0,0 +1,106 @@
+import { createContext, useContext, useState, useEffect } from 'react';
+
+// URLs for fetching apps
+const OFFICIAL_APP_LIST_URL = 'https://huggingface.co/datasets/pollen-robotics/reachy-mini-official-app-store/raw/main/app-list.json';
+const HF_SPACES_API = 'https://huggingface.co/api/spaces';
+
+// Context
+const AppsContext = createContext(null);
+
+// Fetch all spaces with reachy_mini tag from HuggingFace API
+async function fetchAllReachyMiniSpaces() {
+ try {
+ const response = await fetch(`${HF_SPACES_API}?filter=reachy_mini&full=true&limit=100`);
+ if (!response.ok) {
+ console.warn('Failed to fetch spaces with tag:', response.status);
+ return [];
+ }
+ return await response.json();
+ } catch (err) {
+ console.error('Error fetching reachy_mini spaces:', err);
+ return [];
+ }
+}
+
+// Provider component
+export function AppsProvider({ children }) {
+ const [apps, setApps] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+ const [hasFetched, setHasFetched] = useState(false);
+
+ useEffect(() => {
+ // Only fetch once
+ if (hasFetched) return;
+
+ async function fetchApps() {
+ setLoading(true);
+ setError(null);
+
+ try {
+ // 1. Fetch official app IDs from the curated list
+ const officialResponse = await fetch(OFFICIAL_APP_LIST_URL);
+ let officialIdList = [];
+ if (officialResponse.ok) {
+ officialIdList = await officialResponse.json();
+ }
+ const officialSet = new Set(officialIdList.map(id => id.toLowerCase()));
+
+ // 2. Fetch ALL spaces with reachy_mini tag from HuggingFace API
+ const allSpaces = await fetchAllReachyMiniSpaces();
+ console.log(`[AppsContext] Fetched ${allSpaces.length} spaces with reachy_mini tag`);
+
+ // 3. Build apps list with isOfficial flag
+ const allApps = allSpaces.map(space => {
+ const spaceId = space.id || '';
+ const isOfficial = officialSet.has(spaceId.toLowerCase());
+
+ return {
+ id: spaceId,
+ name: spaceId.split('/').pop(),
+ description: space.cardData?.short_description || '',
+ cardData: space.cardData || {},
+ likes: space.likes || 0,
+ lastModified: space.lastModified,
+ author: spaceId.split('/')[0],
+ isOfficial,
+ };
+ });
+
+ // Sort: official first, then by likes
+ allApps.sort((a, b) => {
+ if (a.isOfficial !== b.isOfficial) {
+ return a.isOfficial ? -1 : 1;
+ }
+ return (b.likes || 0) - (a.likes || 0);
+ });
+
+ setApps(allApps);
+ setHasFetched(true);
+ } catch (err) {
+ console.error('Failed to fetch apps:', err);
+ setError('Failed to load apps. Please try again later.');
+ } finally {
+ setLoading(false);
+ }
+ }
+
+ fetchApps();
+ }, [hasFetched]);
+
+ return (
+
+ {children}
+
+ );
+}
+
+// Hook to use the apps context
+export function useApps() {
+ const context = useContext(AppsContext);
+ if (!context) {
+ throw new Error('useApps must be used within an AppsProvider');
+ }
+ return context;
+}
+
diff --git a/src/main.jsx b/src/main.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..45c57d882faa306ae4709c756731408a0a879c14
--- /dev/null
+++ b/src/main.jsx
@@ -0,0 +1,15 @@
+import { StrictMode } from 'react';
+import { createRoot } from 'react-dom/client';
+import App from './App';
+
+// Import Google Fonts
+const link = document.createElement('link');
+link.href = 'https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000&display=swap';
+link.rel = 'stylesheet';
+document.head.appendChild(link);
+
+createRoot(document.getElementById('root')).render(
+
+
+
+);
diff --git a/src/pages/Apps.jsx b/src/pages/Apps.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..4db26e5742cc2f45f5c5f2bf7667113e511800cf
--- /dev/null
+++ b/src/pages/Apps.jsx
@@ -0,0 +1,520 @@
+import { useState, useMemo } from 'react';
+import {
+ Box,
+ Container,
+ Typography,
+ InputBase,
+ Avatar,
+ Chip,
+ Checkbox,
+ FormControlLabel,
+ CircularProgress,
+ Link,
+ IconButton,
+} from '@mui/material';
+import SearchIcon from '@mui/icons-material/Search';
+import CloseIcon from '@mui/icons-material/Close';
+import FavoriteBorderIcon from '@mui/icons-material/FavoriteBorder';
+import AccessTimeIcon from '@mui/icons-material/AccessTime';
+import OpenInNewIcon from '@mui/icons-material/OpenInNew';
+import VerifiedIcon from '@mui/icons-material/Verified';
+import Layout from '../components/Layout';
+import ReachiesCarousel from '../components/ReachiesCarousel';
+import { useApps } from '../context/AppsContext';
+
+// App Card Component
+function AppCard({ app }) {
+ const isOfficial = app.isOfficial;
+ const cardData = app.cardData || {};
+ const author = app.id?.split('/')?.[0] || app.author || null;
+ const likes = app.likes || 0;
+ const lastModified = app.lastModified || app.createdAt || null;
+ const emoji = cardData.emoji || '📦';
+
+ const formattedDate = lastModified
+ ? new Date(lastModified).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })
+ : null;
+
+ const spaceUrl = `https://huggingface.co/spaces/${app.id}`;
+
+ return (
+
+ {/* Top Bar with Author, Official Badge, and Likes */}
+
+ {/* Author + Official Badge */}
+
+ {author && (
+
+
+ {author.charAt(0).toUpperCase()}
+
+
+ {author}
+
+
+ )}
+
+ {/* Official Badge - inline with author */}
+ {isOfficial && (
+ }
+ label="Official"
+ size="small"
+ sx={{
+ bgcolor: 'rgba(255, 149, 0, 0.1)',
+ color: '#FF9500',
+ fontWeight: 600,
+ fontSize: 10,
+ height: 20,
+ flexShrink: 0,
+ '& .MuiChip-icon': {
+ color: '#FF9500',
+ ml: 0.5,
+ },
+ '& .MuiChip-label': {
+ px: 0.75,
+ },
+ }}
+ />
+ )}
+
+
+ {/* Likes */}
+
+
+
+ {likes}
+
+
+
+
+ {/* Content */}
+
+ {/* Title + Emoji Row */}
+
+
+ {app.name || app.id?.split('/').pop()}
+
+
+
+ {emoji}
+
+
+
+ {/* Description */}
+
+ {cardData.short_description || app.description || 'No description'}
+
+
+ {/* Date + Open Link */}
+
+ {formattedDate && (
+
+
+
+ {formattedDate}
+
+
+ )}
+
+
+
+ View on HF
+
+
+
+
+
+
+ );
+}
+
+// Main Apps Page
+export default function Apps() {
+ // Get apps from context (cached globally)
+ const { apps, loading, error } = useApps();
+ const [searchQuery, setSearchQuery] = useState('');
+ const [officialOnly, setOfficialOnly] = useState(false);
+
+ // Filter apps based on search and official toggle
+ const filteredApps = useMemo(() => {
+ let result = apps;
+
+ // Filter by official
+ if (officialOnly) {
+ result = result.filter(app => app.isOfficial === true);
+ }
+
+ // Filter by search
+ if (searchQuery.trim()) {
+ const query = searchQuery.toLowerCase();
+ result = result.filter(app =>
+ app.name?.toLowerCase().includes(query) ||
+ app.id?.toLowerCase().includes(query) ||
+ app.description?.toLowerCase().includes(query) ||
+ app.cardData?.short_description?.toLowerCase().includes(query)
+ );
+ }
+
+ return result;
+ }, [apps, searchQuery, officialOnly]);
+
+ const isFiltered = searchQuery.trim() || officialOnly;
+
+ return (
+
+ {/* Hero Header */}
+
+ {/* Gradient orbs */}
+
+
+
+
+
+ {/* Reachies Carousel */}
+
+
+
+
+ {/* Text content */}
+
+
+
+ Powered by
+
+
+
+
+ Applications
+
+
+ Discover apps built by the community and official apps from Pollen Robotics.
+ Install them directly from the Reachy Mini desktop app.
+
+
+
+
+
+
+ {/* Search Section */}
+
+
+
+ setSearchQuery(e.target.value)}
+ sx={{
+ flex: 1,
+ fontSize: 15,
+ fontWeight: 500,
+ color: '#333',
+ '& input::placeholder': {
+ color: '#999',
+ opacity: 1,
+ },
+ }}
+ />
+
+ {/* Clear search */}
+ {searchQuery && (
+ setSearchQuery('')}
+ size="small"
+ sx={{ color: '#999' }}
+ >
+
+
+ )}
+
+ {/* Separator */}
+
+
+ {/* Apps count */}
+
+ {isFiltered ? `${filteredApps.length}/${apps.length}` : apps.length}
+
+
+ {/* Separator */}
+
+
+ {/* Official toggle */}
+ setOfficialOnly(e.target.checked)}
+ size="small"
+ sx={{
+ color: '#999',
+ '&.Mui-checked': {
+ color: '#FF9500',
+ },
+ }}
+ />
+ }
+ label={
+
+ Official only
+
+ }
+ sx={{ m: 0 }}
+ />
+
+
+
+ {/* Apps Grid */}
+
+ {loading ? (
+
+
+
+ ) : error ? (
+
+ {error}
+
+ ) : filteredApps.length === 0 ? (
+
+ 🔍
+
+ No apps found
+
+
+ Try adjusting your search or filters
+
+
+ ) : (
+
+ {filteredApps.map((app, index) => (
+
+ ))}
+
+ )}
+
+
+ );
+}
+
diff --git a/src/pages/Build.jsx b/src/pages/Build.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..7ef5432d1ddbc08bdbbb112b8ead072e10b1491a
--- /dev/null
+++ b/src/pages/Build.jsx
@@ -0,0 +1,821 @@
+import { useState } from 'react';
+import { Link as RouterLink } from 'react-router-dom';
+import {
+ Box,
+ Container,
+ Typography,
+ Button,
+ Grid,
+ Accordion,
+ AccordionSummary,
+ AccordionDetails,
+ Stack,
+ Link,
+ Chip,
+ Tabs,
+ Tab,
+ Alert,
+ Divider,
+} from '@mui/material';
+import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
+import OpenInNewIcon from '@mui/icons-material/OpenInNew';
+import ContentCopyIcon from '@mui/icons-material/ContentCopy';
+import CheckCircleIcon from '@mui/icons-material/CheckCircle';
+
+import Layout from '../components/Layout';
+import PageHero from '../components/PageHero';
+
+// Code Block component with copy functionality
+function CodeBlock({ code, language = 'bash', title }) {
+ const [copied, setCopied] = useState(false);
+
+ const handleCopy = async () => {
+ await navigator.clipboard.writeText(code);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ };
+
+ return (
+
+
+
+ {title || language}
+
+ : }
+ sx={{
+ color: copied ? '#22c55e' : 'rgba(255,255,255,0.6)',
+ fontSize: 12,
+ minWidth: 'auto',
+ }}
+ >
+ {copied ? 'Copied!' : 'Copy'}
+
+
+
+ {code}
+
+
+ );
+}
+
+// Tab Panel
+function TabPanel({ children, value, index }) {
+ return (
+
+ {value === index && children}
+
+ );
+}
+
+// Section component
+function Section({ id, step, title, children }) {
+ return (
+
+
+ {step && (
+
+ {step}
+
+ )}
+ {title}
+
+ {children}
+
+ );
+}
+
+export default function Build() {
+ const [osTab, setOsTab] = useState(0);
+
+ return (
+
+
+
+ }
+ sx={{
+ borderColor: 'rgba(255,255,255,0.3)',
+ color: 'white',
+ '&:hover': {
+ borderColor: 'white',
+ backgroundColor: 'rgba(255,255,255,0.1)',
+ },
+ }}
+ >
+ GitHub
+
+
+
+ {/* Main Content */}
+
+ {/* Prerequisites notice */}
+
+
+
+
+ Before you start
+
+
+ Make sure you have assembled your Reachy Mini and connected it.
+ If not, follow the{' '}
+
+ Getting Started guide
+ {' '}
+ first.
+
+
+
+
+ {/* Section: Install SDK */}
+
+
+ The Reachy Mini SDK is a Python package that lets you control the robot programmatically.
+ It includes both the daemon (background service) and the control API.
+
+
+ {/* Prerequisites */}
+
+
+
+ Prerequisites
+
+
+
+
+
+
+ Python 3.10 - 3.13
+
+
+ We recommend using a virtual environment.
+
+
+
+
+
+
+ Git LFS
+
+
+ Required for large model files.
+
+
+
+
+
+
+ Reachy Mini connected
+
+
+ USB (Lite) or Wi-Fi (Wireless).
+
+
+
+
+
+
+
+ Install Git LFS
+
+ setOsTab(v)} sx={{ mb: 2 }}>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Download from{' '}
+
+ git-lfs.com
+
+
+
+
+
+
+ {/* Installation */}
+
+
+
+ Install Reachy Mini
+
+
+
+
+
+
+ uv users: Run uv run reachy-mini-daemon directly without manual setup.
+
+
+
+
+
+ {/* Linux udev */}
+
+ }>
+ 🐧 Linux: Set up udev rules (required for USB connection)
+
+
+
+
+
+
+
+
+
+ {/* Section: First Script */}
+
+
+ Before running any script, you need to start the daemon. The daemon handles communication
+ with the robot's motors and sensors.
+
+
+
+
+
+
+
+ 1. Start the Daemon
+
+
+ Open a terminal and run:
+
+
+
+ For simulation (no robot needed):
+
+
+
+
+
+
+
+
+
+
+ 2. Run Your First Script
+
+
+ In another terminal, create hello.py:
+
+
+
+
+
+
+
+
+
+
+
+ {/* Section: Control the Robot */}
+
+
+ Use goto_target for smooth movements and set_target for immediate control.
+
+
+
+
+
+
+
+ Move the Head
+
+
+
+
+
+
+
+
+
+
+ Control Antennas & Body
+
+
+
+
+
+
+
+
+
+
+ Motor Control Modes
+
+
+
+
+ enable_motors()
+
+
+ Powers motors ON. Robot holds position firmly.
+
+
+
+
+ disable_motors()
+
+
+ Powers motors OFF. Robot is completely limp.
+
+
+
+
+ make_motors_compliant()
+
+
+ Motors ON but soft. Great for teaching-by-demonstration.
+
+
+
+
+
+
+
+
+
+ {/* Section: Access Sensors */}
+
+
+ Reachy Mini has a camera, microphones, speaker, and accelerometer (wireless version).
+
+
+
+
+
+
+
+ 📷 Camera
+
+
+
+
+
+
+
+
+
+
+ 🎤 Microphone
+
+
+
+
+
+
+
+
+
+
+ 🔊 Speaker
+
+
+
+
+
+
+
+
+
+
+ 📐 Accelerometer (Wireless only)
+
+
+
+
+
+
+
+
+
+
+ {/* Section: Create an App */}
+
+
+ Package your code as a Reachy Mini app that can be installed from the dashboard.
+
+
+
+
+
+ Generate App Template
+
+
+ Use the built-in generator to create a complete project structure:
+
+
+
+ This creates: pyproject.toml, README.md, and the main app file.
+
+
+
+
+
+
+
+ App Structure
+
+
+
+
+
+
+
+
+ {/* Section: Publish to HF */}
+
+
+ Share your app with the community on Hugging Face Spaces. Apps published there
+ can be installed directly from the Reachy Mini dashboard.
+
+
+
+
+
+
+
+ 1. Create a Space
+
+
+ Go to Hugging Face and create a new Space:
+
+ }
+ >
+ Create New Space
+
+
+ Choose "Gradio" or "Static" as the SDK.
+
+
+
+
+
+
+
+
+
+ 2. Add the reachy_mini tag
+
+
+ In your Space's README.md, add this tag:
+
+
+
+
+
+
+
+
+
+ That's it! Your app will now appear in the Reachy Mini dashboard's app store
+ and on the{' '}
+
+ Apps page
+
+ .
+
+
+
+
+
+
+ {/* REST API Section */}
+
+
+ Prefer HTTP? The daemon exposes a REST API for language-agnostic control.
+
+
+
+
+
+
+
+ Get Robot State
+
+
+
+
+
+
+
+
+
+
+ API Documentation
+
+
+ Full OpenAPI docs available when daemon is running:
+
+ }
+ >
+ Open API Docs
+
+
+
+
+
+
+
+ {/* Next Steps */}
+
+
+ Ready to explore more?
+
+
+ Check out the full documentation and community apps for inspiration.
+
+
+ }
+ >
+ Full SDK Documentation
+
+
+
+
+
+
+
+ );
+}
+
diff --git a/src/pages/Buy.jsx b/src/pages/Buy.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..d2b13b31cd946c07ac1c80ba8f233e85f3e26d64
--- /dev/null
+++ b/src/pages/Buy.jsx
@@ -0,0 +1,672 @@
+import { useState } from 'react';
+import { Link as RouterLink } from 'react-router-dom';
+import {
+ Box,
+ Container,
+ Typography,
+ Button,
+ Grid,
+ Card,
+ CardContent,
+ Chip,
+ Stack,
+ Accordion,
+ AccordionSummary,
+ AccordionDetails,
+ Table,
+ TableBody,
+ TableCell,
+ TableContainer,
+ TableHead,
+ TableRow,
+ Paper,
+} from '@mui/material';
+import CheckIcon from '@mui/icons-material/Check';
+import CloseIcon from '@mui/icons-material/Close';
+import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
+import OpenInNewIcon from '@mui/icons-material/OpenInNew';
+import LocalShippingIcon from '@mui/icons-material/LocalShipping';
+import InventoryIcon from '@mui/icons-material/Inventory';
+import SupportAgentIcon from '@mui/icons-material/SupportAgent';
+import BuildIcon from '@mui/icons-material/Build';
+
+import Layout from '../components/Layout';
+import DecorativeShape from '../components/DecorativeShape';
+
+// Product data
+const products = {
+ wireless: {
+ name: 'Reachy Mini',
+ tagline: 'The complete experience',
+ price: 499,
+ badge: 'Wireless',
+ badgeColor: '#0ea5e9',
+ description: 'Self-contained robot with on-board compute. Works wirelessly or wired, perfect for standalone projects and demos.',
+ buyLink: 'https://buy.stripe.com/9B65kFfFlaKFbY34W873G03',
+ image: '/assets/reachy-wireless.png',
+ featured: true,
+ },
+ lite: {
+ name: 'Reachy Mini Lite',
+ tagline: 'Perfect to get started',
+ price: 299,
+ badge: 'Lite',
+ badgeColor: '#f59e0b',
+ description: 'Connect to your computer via USB. Same expressive robot, powered by your machine. Ideal for development and learning.',
+ buyLink: 'https://buy.stripe.com/6oUfZj78P1a5e6b0FS73G02',
+ image: '/assets/reachy-lite.png',
+ featured: false,
+ },
+};
+
+// Comparison features
+const comparisonFeatures = [
+ { name: 'Motors & Mechanics', wireless: '5 servo motors', lite: '5 servo motors' },
+ { name: 'Head Movement', wireless: '6 DOF (pitch, roll, yaw, x, y, z)', lite: '6 DOF (pitch, roll, yaw, x, y, z)' },
+ { name: 'Body Rotation', wireless: '360° continuous', lite: '360° continuous' },
+ { name: 'Antennas', wireless: '2 animated antennas', lite: '2 animated antennas' },
+ { name: 'Camera', wireless: 'Wide angle (120°)', lite: 'Wide angle (120°)' },
+ { name: 'Microphones', wireless: '4 microphones array', lite: '4 microphones array' },
+ { name: 'Speaker', wireless: '5W speaker', lite: '5W speaker' },
+ { name: 'On-board Compute', wireless: 'Raspberry Pi 4 (4GB)', lite: false },
+ { name: 'Accelerometer', wireless: 'Built-in IMU', lite: false },
+ { name: 'Wi-Fi Connectivity', wireless: 'Wi-Fi 5 (802.11ac)', lite: false },
+ { name: 'Standalone Mode', wireless: true, lite: false },
+ { name: 'USB Connection', wireless: true, lite: true },
+ { name: 'Power', wireless: 'USB-C (5V/3A)', lite: 'USB-C (5V/3A)' },
+];
+
+// What's in the box
+const boxContents = [
+ { icon: '🤖', title: '3D Printed Parts', description: 'All structural components pre-printed and ready to assemble' },
+ { icon: '⚙️', title: 'Motors & Electronics', description: '5 servo motors, control board, and all electronic components' },
+ { icon: '📷', title: 'Camera Module', description: 'Wide-angle camera for vision applications' },
+ { icon: '🔊', title: 'Audio System', description: '4 microphones + 5W speaker for voice interaction' },
+ { icon: '🔧', title: 'Hardware Kit', description: 'All screws, cables, and assembly hardware included' },
+ { icon: '📖', title: 'Documentation', description: 'Step-by-step assembly guide and quickstart materials' },
+];
+
+// FAQ data
+const faqItems = [
+ {
+ question: 'What is the difference between Wireless and Lite?',
+ answer: 'The Wireless version includes a Raspberry Pi 4 built-in, allowing it to run standalone without a computer. The Lite version connects to your Mac, Linux, or Windows computer via USB and uses your computer for processing. Both versions have the same mechanical design and audio/video capabilities.',
+ },
+ {
+ question: 'How long does assembly take?',
+ answer: 'Most users report 1.5–2 hours for assembly. The kit comes with pre-printed parts and clear step-by-step video instructions. No soldering required!',
+ },
+ {
+ question: 'Where do you ship?',
+ answer: 'We ship worldwide from France. Shipping typically takes 5-10 business days for Europe, 10-15 days for North America, and 15-25 days for other regions.',
+ },
+ {
+ question: 'What about customs and import taxes?',
+ answer: 'The displayed price does not include customs duties or import taxes, which vary by country. You may be responsible for these fees upon delivery.',
+ },
+ {
+ question: 'Can I upgrade from Lite to Wireless later?',
+ answer: 'The electronics architecture is different between versions, so a direct upgrade isn\'t possible. However, you can always purchase the Wireless version separately if you want standalone capabilities.',
+ },
+ {
+ question: 'What software is included?',
+ answer: 'All software is open-source and free. You get access to the Python SDK, desktop dashboard, and the entire library of community-built applications on Hugging Face Spaces.',
+ },
+ {
+ question: 'Is there a warranty?',
+ answer: 'Yes! We offer a 1-year warranty covering manufacturing defects. We also provide technical support through our Discord community.',
+ },
+];
+
+// Hero Section
+function HeroSection() {
+ return (
+
+ {/* Decorative elements */}
+
+
+
+
+
+
+
+ Open Source Robot Kit
+
+
+
+ Buy Reachy Mini
+
+
+
+ An expressive companion robot designed for human interaction, creative coding, and AI experimentation. Assemble in 2 hours, code in Python, endless possibilities.
+
+
+
+ }
+ label="Free worldwide shipping"
+ sx={{
+ bgcolor: 'rgba(255,255,255,0.1)',
+ color: 'white',
+ fontSize: 13,
+ fontWeight: 500,
+ px: 1,
+ }}
+ />
+ }
+ label="Ships in 3-5 days"
+ sx={{
+ bgcolor: 'rgba(255,255,255,0.1)',
+ color: 'white',
+ fontSize: 13,
+ fontWeight: 500,
+ px: 1,
+ }}
+ />
+ }
+ label="1-year warranty"
+ sx={{
+ bgcolor: 'rgba(255,255,255,0.1)',
+ color: 'white',
+ fontSize: 13,
+ fontWeight: 500,
+ px: 1,
+ }}
+ />
+
+
+
+
+ );
+}
+
+// Product Cards Section
+function ProductCardsSection() {
+ const [hoveredCard, setHoveredCard] = useState(null);
+
+ return (
+
+
+ {Object.entries(products).map(([key, product]) => (
+
+ setHoveredCard(key)}
+ onMouseLeave={() => setHoveredCard(null)}
+ sx={{
+ height: '100%',
+ display: 'flex',
+ flexDirection: 'column',
+ position: 'relative',
+ overflow: 'visible',
+ border: product.featured ? '2px solid' : '1px solid',
+ borderColor: product.featured ? '#FF9500' : 'divider',
+ transform: hoveredCard === key ? 'translateY(-8px)' : 'none',
+ boxShadow: hoveredCard === key
+ ? '0 20px 60px rgba(0, 0, 0, 0.15)'
+ : '0 8px 32px rgba(0, 0, 0, 0.08)',
+ transition: 'all 0.3s ease',
+ }}
+ >
+ {product.featured && (
+
+ )}
+
+
+ {/* Badge */}
+
+
+ {/* Title & Tagline */}
+
+ {product.name}
+
+
+ {product.tagline}
+
+
+ {/* Price */}
+
+
+ ${product.price}
+
+
+ USD
+
+
+
+ {/* Description */}
+
+ {product.description}
+
+
+ {/* Key highlights */}
+
+ {key === 'wireless' ? (
+ <>
+
+
+
+ >
+ ) : (
+ <>
+
+
+
+ >
+ )}
+
+
+ {/* CTA Button */}
+ }
+ sx={product.featured ? {
+ bgcolor: '#FF9500',
+ '&:hover': { bgcolor: '#e68600' },
+ } : {}}
+ >
+ Buy {product.badge} — ${product.price}
+
+
+
+
+ ))}
+
+
+ );
+}
+
+// Feature row helper
+function FeatureRow({ icon, text, highlight = false }) {
+ return (
+
+
+ {icon}
+
+
+ {text}
+
+
+ );
+}
+
+// Comparison Table Section
+function ComparisonSection() {
+ return (
+
+
+
+
+ Compare Versions
+
+
+ Full Feature Comparison
+
+
+ Both versions share the same mechanical design and audio/video capabilities.
+ The main difference is the on-board compute.
+
+
+
+
+
+
+
+
+ Feature
+
+
+
+
+ $499
+
+
+
+
+
+ $299
+
+
+
+
+
+ {comparisonFeatures.map((feature, index) => (
+
+
+ {feature.name}
+
+
+
+
+
+
+
+
+ ))}
+
+
+
+
+
+ );
+}
+
+// Feature value helper
+function FeatureValue({ value }) {
+ if (value === true) {
+ return ;
+ }
+ if (value === false) {
+ return ;
+ }
+ return {value};
+}
+
+// What's in the Box Section
+function WhatsInTheBoxSection() {
+ return (
+
+
+
+
+ Complete Kit
+
+
+ What's in the Box
+
+
+ Everything you need to build your Reachy Mini. No 3D printer or soldering required.
+
+
+
+
+ {boxContents.map((item, index) => (
+
+
+ {item.icon}
+
+ {item.title}
+
+
+ {item.description}
+
+
+
+ ))}
+
+
+
+ }
+ >
+ View Assembly Guide
+
+
+
+
+ );
+}
+
+// FAQ Section
+function FAQSection() {
+ return (
+
+
+
+
+ Questions?
+
+
+ Frequently Asked
+
+
+
+
+ {faqItems.map((item, index) => (
+
+ }>
+ {item.question}
+
+
+
+ {item.answer}
+
+
+
+ ))}
+
+
+
+
+ Still have questions?
+
+ }
+ >
+ Ask on Discord
+
+
+
+
+ );
+}
+
+// Final CTA Section
+function FinalCTASection() {
+ return (
+
+
+
+
+
+ Ready to build your Reachy Mini?
+
+
+ Join hundreds of makers, developers, and AI enthusiasts who are already creating with Reachy Mini.
+
+
+
+ }
+ sx={{
+ bgcolor: '#FF9500',
+ px: 4,
+ '&:hover': { bgcolor: '#e68600' },
+ }}
+ >
+ Buy Wireless — $499
+
+ }
+ sx={{
+ borderColor: 'rgba(255,255,255,0.3)',
+ color: 'white',
+ px: 4,
+ '&:hover': {
+ borderColor: 'white',
+ bgcolor: 'rgba(255,255,255,0.1)',
+ },
+ }}
+ >
+ Buy Lite — $299
+
+
+
+
+ );
+}
+
+// Main Buy Page
+export default function Buy() {
+ return (
+
+
+
+
+
+
+
+
+ );
+}
+
diff --git a/src/pages/Download.jsx b/src/pages/Download.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..fe79743d2a7168ac13f12830ab104780111c29cc
--- /dev/null
+++ b/src/pages/Download.jsx
@@ -0,0 +1,572 @@
+import { useState, useEffect } from 'react';
+import {
+ Box,
+ Container,
+ Typography,
+ Button,
+ Grid,
+ Card,
+ CardContent,
+ Chip,
+ Stack,
+ CircularProgress,
+} from '@mui/material';
+import DownloadIcon from '@mui/icons-material/Download';
+import AppleIcon from '@mui/icons-material/Apple';
+import CheckCircleIcon from '@mui/icons-material/CheckCircle';
+import OpenInNewIcon from '@mui/icons-material/OpenInNew';
+
+import Layout from '../components/Layout';
+
+// Platform configuration
+const PLATFORMS = {
+ 'darwin-aarch64': {
+ name: 'macOS',
+ subtitle: 'Apple Silicon',
+ arch: 'M1, M2, M3, M4',
+ format: '.dmg',
+ icon: AppleIcon,
+ color: '#a3a3a3',
+ },
+ 'darwin-x86_64': {
+ name: 'macOS',
+ subtitle: 'Intel',
+ arch: 'x86_64',
+ format: '.dmg',
+ icon: AppleIcon,
+ color: '#a3a3a3',
+ },
+ 'windows-x86_64': {
+ name: 'Windows',
+ subtitle: '64-bit',
+ arch: 'x86_64',
+ format: '.msi',
+ icon: null,
+ color: '#0078d4',
+ },
+ 'linux-x86_64': {
+ name: 'Linux',
+ subtitle: 'Debian/Ubuntu',
+ arch: 'x86_64',
+ format: '.deb',
+ icon: null,
+ color: '#e95420',
+ },
+};
+
+// URL to fetch latest release info (using GitHub API for CORS support)
+const GITHUB_RELEASES_API = 'https://api.github.com/repos/pollen-robotics/reachy-mini-desktop-app/releases/latest';
+
+
+// Detect user's platform
+function detectPlatform() {
+ const ua = navigator.userAgent;
+ const platform = navigator.platform || '';
+
+ if (/Mac/.test(platform) || /Mac/.test(ua)) {
+ return 'darwin-aarch64';
+ }
+ if (/Win/.test(platform) || /Windows/.test(ua)) {
+ return 'windows-x86_64';
+ }
+ if (/Linux/.test(platform) || /Linux/.test(ua)) {
+ return 'linux-x86_64';
+ }
+ return 'darwin-aarch64';
+}
+
+// Format date
+function formatDate(dateString) {
+ const date = new Date(dateString);
+ return date.toLocaleDateString('en-US', {
+ year: 'numeric',
+ month: 'short',
+ day: 'numeric',
+ });
+}
+
+// Windows Icon
+function WindowsIcon({ sx = {} }) {
+ return (
+
+
+
+ );
+}
+
+// Linux Icon
+function LinuxIcon({ sx = {} }) {
+ return (
+
+
+
+ );
+}
+
+// Platform Card component
+function PlatformCard({ platformKey, url, isActive, onClick }) {
+ const platform = PLATFORMS[platformKey];
+ const Icon = platform?.icon;
+
+ return (
+
+
+
+ {Icon ? (
+
+ ) : platformKey.includes('windows') ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {platform?.name}
+
+
+ {platform?.subtitle}
+
+
+
+
+
+
+ );
+}
+
+export default function Download() {
+ const [releaseData, setReleaseData] = useState(null);
+ const [detectedPlatform, setDetectedPlatform] = useState(null);
+ const [loading, setLoading] = useState(true);
+
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ setDetectedPlatform(detectPlatform());
+
+ // Fetch latest release info from GitHub API
+ async function fetchLatestRelease() {
+ try {
+ const response = await fetch(GITHUB_RELEASES_API);
+ if (response.ok) {
+ const data = await response.json();
+
+ // Transform GitHub API response to our format
+ const version = data.tag_name?.replace('v', '') || '';
+ const platforms = {};
+
+ // Map assets to platforms (prioritize user-friendly formats)
+ data.assets?.forEach(asset => {
+ const name = asset.name.toLowerCase();
+ const url = asset.browser_download_url;
+
+ // macOS Apple Silicon - prefer .dmg
+ if (name.includes('arm64.dmg')) {
+ platforms['darwin-aarch64'] = { url };
+ } else if (name.includes('darwin-aarch64') && !platforms['darwin-aarch64']) {
+ platforms['darwin-aarch64'] = { url };
+ }
+
+ // macOS Intel - prefer .dmg
+ if (name.includes('x64.dmg') && !name.includes('arm64')) {
+ platforms['darwin-x86_64'] = { url };
+ } else if (name.includes('darwin-x86_64') && !platforms['darwin-x86_64']) {
+ platforms['darwin-x86_64'] = { url };
+ }
+
+ // Windows - .msi
+ if (name.includes('.msi')) {
+ platforms['windows-x86_64'] = { url };
+ }
+
+ // Linux - .deb
+ if (name.includes('amd64.deb')) {
+ platforms['linux-x86_64'] = { url };
+ }
+ });
+
+ setReleaseData({
+ version,
+ pub_date: data.published_at,
+ platforms,
+ });
+ } else {
+ setError('Failed to fetch release info');
+ }
+ } catch (err) {
+ console.error('Error fetching release:', err);
+ setError('Failed to fetch release info');
+ } finally {
+ setLoading(false);
+ }
+ }
+
+ fetchLatestRelease();
+ }, []);
+
+ if (loading) {
+ return (
+
+
+
+
+
+ );
+ }
+
+ if (error || !releaseData) {
+ return (
+
+
+ Unable to load release info
+
+
+
+ );
+ }
+
+ const currentPlatform = PLATFORMS[detectedPlatform];
+ const currentUrl = releaseData?.platforms[detectedPlatform]?.url;
+
+ return (
+
+
+ {/* Subtle gradient orbs - spread across the page */}
+
+
+
+
+
+ {/* Hero Section */}
+
+ {/* App icon */}
+
+
+
+
+
+
+
+ Reachy Mini Control
+
+
+
+ The official desktop app to control, program, and play with your Reachy Mini.
+
+
+ {/* Version info */}
+
+ }
+ label={`v${releaseData?.version}`}
+ sx={{
+ backgroundColor: 'rgba(16, 185, 129, 0.1)',
+ color: '#10b981',
+ fontWeight: 600,
+ border: '1px solid rgba(16, 185, 129, 0.2)',
+ }}
+ />
+
+ Released {formatDate(releaseData?.pub_date)}
+
+
+
+ {/* Primary download button */}
+ }
+ sx={{
+ px: 6,
+ py: 2,
+ fontSize: 17,
+ fontWeight: 600,
+ borderRadius: 3,
+ background: 'linear-gradient(135deg, #FF9500 0%, #764ba2 100%)',
+ boxShadow: '0 8px 32px rgba(255, 149, 0, 0.35)',
+ transition: 'all 0.3s ease',
+ '&:hover': {
+ boxShadow: '0 12px 48px rgba(59, 130, 246, 0.5)',
+ transform: 'translateY(-2px)',
+ },
+ }}
+ >
+ Download for {currentPlatform?.name}
+
+
+
+ {currentPlatform?.subtitle} • {currentPlatform?.format?.replace('.', '').toUpperCase()} package
+
+
+ {/* App screenshot */}
+
+
+
+ {/* All platforms */}
+
+
+ Available for all platforms
+
+
+
+ {['darwin-aarch64', 'darwin-x86_64', 'windows-x86_64', 'linux-x86_64'].map((key) => (
+
+ setDetectedPlatform(key)}
+ />
+
+ ))}
+
+
+
+ {/* Features / What's included */}
+
+
+ What's included
+
+
+
+ {[
+ '3D visualization of your robot',
+ 'Real-time motor control',
+ 'App Store with 30+ apps',
+ 'Camera & microphone access',
+ 'Record & playback movements',
+ 'Full SDK integration',
+ ].map((feature, i) => (
+
+
+
+
+ {feature}
+
+
+
+ ))}
+
+
+
+ {/* Requirements */}
+
+
+ Requires macOS 11+, Windows 10+, or Debian/Ubuntu Linux
+
+
+ }
+ sx={{
+ color: 'rgba(255,255,255,0.5)',
+ '&:hover': { color: 'white' },
+ }}
+ >
+ View all releases on GitHub
+
+
+
+
+
+ );
+}
diff --git a/src/pages/FAQ.jsx b/src/pages/FAQ.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..6deca226ef09ab10c4de6448b9d6f6d1b8921cf1
--- /dev/null
+++ b/src/pages/FAQ.jsx
@@ -0,0 +1,604 @@
+import { useState, useMemo } from 'react';
+import {
+ Box,
+ Container,
+ Typography,
+ TextField,
+ InputAdornment,
+ Accordion,
+ AccordionSummary,
+ AccordionDetails,
+ Chip,
+ Stack,
+ IconButton,
+ Fade,
+ Button,
+} from '@mui/material';
+import SearchIcon from '@mui/icons-material/Search';
+import CloseIcon from '@mui/icons-material/Close';
+import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
+import OpenInNewIcon from '@mui/icons-material/OpenInNew';
+
+import Layout from '../components/Layout';
+import PageHero from '../components/PageHero';
+
+// FAQ Data
+const faqSections = [
+ {
+ id: 'getting-started',
+ icon: '🧭',
+ title: 'Getting Started',
+ items: [
+ {
+ question: 'How do I connect to Reachy Mini from Python?',
+ answer: `To control Reachy Mini, you mainly use the ReachyMini class from the reachy_mini package:
+
+\`\`\`python
+from reachy_mini import ReachyMini
+
+with ReachyMini() as mini:
+ # your code here
+ ...
+\`\`\`
+
+This connects to the Reachy Mini daemon and initializes motors and sensors.`,
+ tags: ['SDK', 'Python'],
+ },
+ {
+ question: 'Do I need to start the daemon manually?',
+ answer: `Yes. All examples assume you have already started the Reachy Mini daemon:
+- Either via command line: \`reachy-mini-daemon\`
+- Or via Python: \`reachy_mini.daemon.app.main\``,
+ tags: ['SDK'],
+ },
+ {
+ question: 'How long does assembly usually take?',
+ answer: 'Most testers report 1.5–2 hours, with some up to 4 hours depending on experience.',
+ tags: ['Hardware'],
+ },
+ {
+ question: "The dashboard at http://localhost:8000 doesn't work — what should I check?",
+ answer: `Typical checks:
+1. You are using a proper Python virtual environment (.venv)
+2. You installed/updated the Reachy Mini SDK: \`pip install -U reachy-mini\`
+3. The daemon is running`,
+ tags: ['SDK'],
+ },
+ ],
+ },
+ {
+ id: 'movement',
+ icon: '🦾',
+ title: 'Moving the Robot',
+ items: [
+ {
+ question: "How do I move Reachy Mini's head to a specific pose?",
+ answer: `Use goto_target with a pose created by create_head_pose:
+
+\`\`\`python
+from reachy_mini import ReachyMini
+from reachy_mini.utils import create_head_pose
+
+with ReachyMini() as mini:
+ mini.goto_target(head=create_head_pose(y=-10, mm=True))
+\`\`\``,
+ tags: ['Movement', 'SDK'],
+ },
+ {
+ question: "What's the difference between goto_target and set_target?",
+ answer: `**goto_target:** Interpolates motion over a duration (default 0.5s). Supports different interpolation methods (linear, minjerk, ease, cartoon). Ideal for smooth, timed motions.
+
+**set_target:** Sets the target immediately, without interpolation. Suited for high-frequency control (e.g. sinusoidal trajectories, teleoperation).`,
+ tags: ['Movement', 'SDK'],
+ },
+ {
+ question: 'How do I move head, body, and antennas at the same time?',
+ answer: `Use goto_target with multiple named arguments:
+
+\`\`\`python
+mini.goto_target(
+ head=create_head_pose(y=-10, mm=True),
+ antennas=np.deg2rad([45, 45]),
+ duration=2.0,
+ body_yaw=np.deg2rad(30),
+)
+\`\`\``,
+ tags: ['Movement'],
+ },
+ ],
+ },
+ {
+ id: 'apps',
+ icon: '🧩',
+ title: 'Writing & Sharing Apps',
+ items: [
+ {
+ question: 'How do I write a Reachy Mini app?',
+ answer: `Inherit from ReachyMiniApp and implement run:
+
+\`\`\`python
+from reachy_mini.apps.app import ReachyMiniApp
+from reachy_mini import ReachyMini
+
+class MyApp(ReachyMiniApp):
+ def run(self, reachy_mini: ReachyMini, stop_event):
+ # your app logic
+ ...
+\`\`\``,
+ tags: ['SDK', 'Python'],
+ },
+ {
+ question: 'How can I generate a new app template quickly?',
+ answer: `Use the app template generator:
+
+\`reachy-mini-make-app my_app_name\`
+
+This creates a complete project structure with pyproject.toml, README.md, and the main app file.`,
+ tags: ['SDK'],
+ },
+ ],
+ },
+ {
+ id: 'hardware',
+ icon: '🎛',
+ title: 'Hardware & Motion Limits',
+ items: [
+ {
+ question: 'What are the safety limits of the head and body?',
+ answer: `Physical & software limits include:
+- Body yaw: [-180°, 180°]
+- Head pitch/roll: [-40°, 40°]
+- Head yaw: [-180°, 180°]
+- Difference (body_yaw - head_yaw): [-65°, 65°]
+
+If you command a pose outside these limits, Reachy Mini will automatically clamp to the nearest safe pose.`,
+ tags: ['Hardware'],
+ },
+ ],
+ },
+ {
+ id: 'sensors',
+ icon: '🧠',
+ title: 'Sensors & Media',
+ items: [
+ {
+ question: 'How do I grab camera frames from Reachy Mini?',
+ answer: `Use the media object:
+
+\`\`\`python
+with ReachyMini() as mini:
+ frame = mini.media.get_frame()
+ # frame is a numpy array
+\`\`\``,
+ tags: ['Vision', 'SDK'],
+ },
+ {
+ question: 'How do I access microphone audio samples?',
+ answer: `\`\`\`python
+with ReachyMini() as mini:
+ sample = mini.media.get_audio_sample()
+\`\`\``,
+ tags: ['Audio'],
+ },
+ ],
+ },
+ {
+ id: 'motors',
+ icon: '🦴',
+ title: 'Motors & Compliancy',
+ items: [
+ {
+ question: 'How do I enable, disable, or make motors compliant?',
+ answer: `Three main methods:
+
+1. **enable_motors**: Powers motors ON. Robot holds position.
+2. **disable_motors**: Powers motors OFF. Robot is limp.
+3. **make_motors_compliant**: Motors ON but soft. Good for teaching-by-demonstration.`,
+ tags: ['Hardware', 'SDK'],
+ },
+ ],
+ },
+];
+
+// Tag color mapping
+const tagColors = {
+ SDK: { bg: 'rgba(255, 149, 0, 0.15)', color: '#FF9500', border: 'rgba(255, 149, 0, 0.3)' },
+ Python: { bg: 'rgba(16, 185, 129, 0.15)', color: '#10b981', border: 'rgba(16, 185, 129, 0.3)' },
+ Movement: { bg: 'rgba(118, 75, 162, 0.15)', color: '#764ba2', border: 'rgba(118, 75, 162, 0.3)' },
+ Hardware: { bg: 'rgba(245, 158, 11, 0.15)', color: '#f59e0b', border: 'rgba(245, 158, 11, 0.3)' },
+ Audio: { bg: 'rgba(236, 72, 153, 0.15)', color: '#ec4899', border: 'rgba(236, 72, 153, 0.3)' },
+ Vision: { bg: 'rgba(6, 182, 212, 0.15)', color: '#06b6d4', border: 'rgba(6, 182, 212, 0.3)' },
+};
+
+// Extract all unique tags from FAQ data
+const allTags = [...new Set(faqSections.flatMap((s) => s.items.flatMap((i) => i.tags)))].sort();
+
+export default function FAQ() {
+ const [searchQuery, setSearchQuery] = useState('');
+ const [selectedTag, setSelectedTag] = useState(null);
+
+ // Filter FAQ items based on search and tag
+ const filteredSections = useMemo(() => {
+ const query = searchQuery.toLowerCase().trim();
+
+ return faqSections
+ .map((section) => ({
+ ...section,
+ items: section.items.filter((item) => {
+ // Tag filter
+ if (selectedTag && !item.tags.includes(selectedTag)) {
+ return false;
+ }
+ // Search filter
+ if (query) {
+ return (
+ item.question.toLowerCase().includes(query) ||
+ item.answer.toLowerCase().includes(query) ||
+ item.tags.some((tag) => tag.toLowerCase().includes(query))
+ );
+ }
+ return true;
+ }),
+ }))
+ .filter((section) => section.items.length > 0);
+ }, [searchQuery, selectedTag]);
+
+ const totalResults = filteredSections.reduce((acc, section) => acc + section.items.length, 0);
+ const totalItems = faqSections.reduce((acc, section) => acc + section.items.length, 0);
+ const hasActiveFilter = searchQuery.trim() || selectedTag;
+
+ const handleTagClick = (tag) => {
+ setSelectedTag((prev) => (prev === tag ? null : tag));
+ };
+
+ const clearFilters = () => {
+ setSearchQuery('');
+ setSelectedTag(null);
+ };
+
+ return (
+
+
+
+ {/* Search + HuggingChat CTA */}
+
+
+ {/* Search + AI Button row */}
+
+ setSearchQuery(e.target.value)}
+ InputProps={{
+ startAdornment: (
+
+
+
+ ),
+ endAdornment: searchQuery && (
+
+ setSearchQuery('')} edge="end">
+
+
+
+ ),
+ }}
+ sx={{
+ '& .MuiOutlinedInput-root': {
+ borderRadius: 3,
+ },
+ }}
+ />
+
+ {/* HuggingChat CTA Button */}
+ }
+ endIcon={}
+ sx={{
+ flexShrink: 0,
+ px: 3,
+ fontWeight: 600,
+ fontSize: 14,
+ whiteSpace: 'nowrap',
+ borderRadius: 3,
+ }}
+ >
+ Ask AI
+
+
+
+ {/* Tag filters */}
+
+ {allTags.map((tag) => (
+ handleTagClick(tag)}
+ sx={{
+ cursor: 'pointer',
+ fontWeight: 600,
+ fontSize: 12,
+ transition: 'all 0.2s ease',
+ backgroundColor:
+ selectedTag === tag
+ ? tagColors[tag]?.color || 'primary.main'
+ : tagColors[tag]?.bg || 'rgba(0,0,0,0.06)',
+ color:
+ selectedTag === tag
+ ? 'white'
+ : tagColors[tag]?.color || 'text.secondary',
+ border: `1px solid ${
+ selectedTag === tag
+ ? tagColors[tag]?.color || 'primary.main'
+ : tagColors[tag]?.border || 'transparent'
+ }`,
+ '&:hover': {
+ backgroundColor:
+ selectedTag === tag
+ ? tagColors[tag]?.color || 'primary.main'
+ : tagColors[tag]?.bg || 'rgba(0,0,0,0.08)',
+ transform: 'translateY(-1px)',
+ },
+ }}
+ />
+ ))}
+
+
+ {/* Filter status */}
+
+
+
+
+ {totalResults} of {totalItems} question{totalItems !== 1 ? 's' : ''}
+
+ {selectedTag && (
+ setSelectedTag(null)}
+ sx={{
+ fontSize: 11,
+ height: 24,
+ backgroundColor: tagColors[selectedTag]?.bg || 'rgba(0,0,0,0.06)',
+ color: tagColors[selectedTag]?.color || 'text.secondary',
+ fontWeight: 600,
+ '& .MuiChip-deleteIcon': {
+ color: tagColors[selectedTag]?.color || 'text.secondary',
+ '&:hover': {
+ color: tagColors[selectedTag]?.color || 'text.primary',
+ },
+ },
+ }}
+ />
+ )}
+
+
+ Clear all
+
+
+
+
+
+
+ {/* FAQ Content */}
+
+ {filteredSections.length === 0 ? (
+
+ 🔍
+
+ No results found
+
+
+ Try adjusting your search or filters
+
+
+
+ ) : (
+ filteredSections.map((section) => (
+
+ {/* Section header */}
+
+
+ {section.icon}
+
+ {section.title}
+
+
+ {/* FAQ items */}
+ {section.items.map((item, index) => (
+
+ }>
+
+
+ {item.question}
+
+
+ {item.tags.map((tag) => (
+ {
+ e.stopPropagation();
+ handleTagClick(tag);
+ }}
+ sx={{
+ fontSize: 11,
+ height: 22,
+ cursor: 'pointer',
+ backgroundColor: tagColors[tag]?.bg || 'rgba(0,0,0,0.06)',
+ color: tagColors[tag]?.color || 'text.secondary',
+ border: `1px solid ${
+ selectedTag === tag
+ ? tagColors[tag]?.color || 'rgba(0,0,0,0.2)'
+ : 'transparent'
+ }`,
+ fontWeight: 600,
+ transition: 'all 0.15s ease',
+ '&:hover': {
+ backgroundColor: tagColors[tag]?.bg || 'rgba(0,0,0,0.08)',
+ transform: 'scale(1.05)',
+ },
+ }}
+ />
+ ))}
+
+
+
+
+
+ {item.answer}
+
+
+
+ ))}
+
+ ))
+ )}
+
+
+ {/* Still have questions? - Simple Discord CTA */}
+
+
+
+
+ 💬
+
+
+ Need more help?
+
+
+ Join our Discord to chat with the community and the Pollen team.
+
+
+
+ }
+ sx={{
+ flexShrink: 0,
+ backgroundColor: 'white',
+ color: '#5865F2',
+ fontWeight: 600,
+ px: 3,
+ '&:hover': {
+ backgroundColor: 'rgba(255,255,255,0.9)',
+ },
+ }}
+ >
+ Join Discord
+
+
+
+
+
+ );
+}
diff --git a/src/pages/GettingStarted.jsx b/src/pages/GettingStarted.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..4a683c8a37cf296466117a84418a253eac691d49
--- /dev/null
+++ b/src/pages/GettingStarted.jsx
@@ -0,0 +1,539 @@
+import { useState } from 'react';
+import { Link as RouterLink } from 'react-router-dom';
+import {
+ Box,
+ Container,
+ Typography,
+ Button,
+ Grid,
+ Link,
+ Chip,
+ Stepper,
+ Step,
+ StepLabel,
+ StepContent,
+ ToggleButton,
+ ToggleButtonGroup,
+ IconButton,
+} from '@mui/material';
+import OpenInNewIcon from '@mui/icons-material/OpenInNew';
+import DownloadIcon from '@mui/icons-material/Download';
+import WifiIcon from '@mui/icons-material/Wifi';
+import UsbIcon from '@mui/icons-material/Usb';
+import CheckCircleIcon from '@mui/icons-material/CheckCircle';
+import PlayArrowIcon from '@mui/icons-material/PlayArrow';
+
+import Layout from '../components/Layout';
+import PageHero from '../components/PageHero';
+
+// YouTube Video with styled overlay
+function YouTubeEmbed({ videoId, title }) {
+ const [isPlaying, setIsPlaying] = useState(false);
+ const thumbnailUrl = '/assets/assembly-screenshot.png';
+
+ if (isPlaying) {
+ return (
+
+ );
+ }
+
+ return (
+ setIsPlaying(true)}
+ sx={{
+ position: 'absolute',
+ top: 0,
+ left: 0,
+ width: '100%',
+ height: '100%',
+ cursor: 'pointer',
+ overflow: 'hidden',
+ '&:hover .play-button': {
+ transform: 'translate(-50%, -50%) scale(1.1)',
+ boxShadow: '0 8px 40px rgba(255, 149, 0, 0.5)',
+ },
+ '&:hover .overlay': {
+ background: 'rgba(0, 0, 0, 0.3)',
+ },
+ }}
+ >
+ {/* Thumbnail */}
+
+
+ {/* Overlay */}
+
+
+ {/* Play Button */}
+
+
+
+
+ {/* Watch label */}
+
+
+ ▶ Watch Assembly Guide
+
+
+
+ );
+}
+
+export default function GettingStarted() {
+ const [version, setVersion] = useState('lite'); // 'lite' or 'wireless'
+
+ return (
+
+
+ }
+ label="Assemble"
+ sx={{ bgcolor: 'rgba(255,255,255,0.15)', color: 'white', fontWeight: 600 }}
+ />
+ }
+ label="Connect & Play!"
+ sx={{ bgcolor: 'rgba(255,255,255,0.15)', color: 'white', fontWeight: 600 }}
+ />
+
+
+ {/* Main Content */}
+
+ {/* Version Toggle */}
+
+
+ Which version do you have?
+
+
+ v && setVersion(v)}
+ sx={{
+ '& .MuiToggleButton-root': {
+ px: 4,
+ py: 1.5,
+ border: 'none',
+ borderRadius: 0,
+ fontWeight: 600,
+ fontSize: 15,
+ textTransform: 'none',
+ gap: 1,
+ color: 'text.secondary',
+ '&.Mui-selected': {
+ bgcolor: 'primary.main',
+ color: 'white',
+ '&:hover': {
+ bgcolor: 'primary.dark',
+ },
+ },
+ '&:not(:last-of-type)': {
+ borderRight: '1px solid',
+ borderColor: 'divider',
+ },
+ },
+ }}
+ >
+
+ Lite (USB)
+
+
+ Wireless
+
+
+
+
+
+ {/* ======================== */}
+ {/* LITE VERSION PROCEDURE */}
+ {/* ======================== */}
+ {version === 'lite' && (
+ <>
+ {/* Step 1: Assemble */}
+
+
+
+ Step 1
+
+ Assemble your robot
+
+
+
+ Follow our visual guide to put together your Reachy Mini Lite.
+ Most people finish in 2-3 hours — our record is 43 minutes! 🏆
+
+
+
+
+
+
+ }
+ >
+ Open the Interactive Assembly Guide ✨
+
+
+
+ {/* Step 2: Connect & Install */}
+
+
+
+ Step 2
+
+ Connect & install the app
+
+
+
+
+
+
+
+ Connect via USB
+
+
+
+ Use the USB cable that came with your robot to connect it to your computer.
+
+
+
+
+
+ Download the desktop app
+
+
+
+ The desktop app includes everything you need to control your Lite version.
+
+ }
+ >
+ Download App
+
+
+
+
+
+ Open the app & play!
+
+
+
+ The app will automatically detect your robot. Click "Wake Up" to start,
+ then explore 30+ apps created by the community — from hand tracking to AI conversations!
+
+
+
+
+
+
+
+
+
+
+
+ >
+ )}
+
+ {/* ============================ */}
+ {/* WIRELESS VERSION PROCEDURE */}
+ {/* ============================ */}
+ {version === 'wireless' && (
+ <>
+ {/* Step 1: Assemble */}
+
+
+
+ Step 1
+
+ Assemble your robot
+
+
+
+ Follow our visual guide to put together your Reachy Mini.
+ Most people finish in 2-3 hours — our record is 43 minutes! 🏆
+
+
+
+
+
+
+ }
+ >
+ Open the Interactive Assembly Guide ✨
+
+
+
+ Beta version? Your guide is{' '}
+
+ here
+ .
+
+
+
+ {/* Step 2: Connect to Wi-Fi */}
+
+
+
+ Step 2
+
+ Connect to your Wi-Fi
+
+
+
+
+
+ Power on your Reachy Mini
+
+
+
+ Wait about 30 seconds for the robot to boot up.
+
+
+
+
+
+ Connect to the robot's Wi-Fi
+
+
+
+
+ Network: reachy-mini-ap
+
+
+ Password: reachy-mini
+
+
+
+
+
+
+ Open settings in your browser
+
+
+ }
+ >
+ http://reachy-mini.local:8000/settings
+
+
+
+
+
+ Enter your Wi-Fi & play!
+
+
+
+ The robot will restart and connect to your network. Then access the dashboard
+ to explore 30+ apps — from hand tracking to AI conversations!
+
+ }
+ >
+ Open Dashboard
+
+
+
+
+
+ >
+ )}
+
+ {/* CTA for Developers */}
+
+
+
+ Want to build your own apps?
+
+
+ Learn how to code with the Python SDK, create custom experiences,
+ and share them with the community.
+
+
+
+
+
+ );
+}
diff --git a/src/pages/Home.jsx b/src/pages/Home.jsx
new file mode 100644
index 0000000000000000000000000000000000000000..3fa1e854f69e04376eec17fec2020daf51147709
--- /dev/null
+++ b/src/pages/Home.jsx
@@ -0,0 +1,952 @@
+import { useState, useEffect } from 'react';
+import { Link as RouterLink } from 'react-router-dom';
+import {
+ Box,
+ Container,
+ Typography,
+ Button,
+ Grid,
+ Stack,
+ Link,
+} from '@mui/material';
+import { useSpring, animated } from '@react-spring/web';
+import OpenInNewIcon from '@mui/icons-material/OpenInNew';
+import ArrowForwardIcon from '@mui/icons-material/ArrowForward';
+
+import Layout from '../components/Layout';
+import Section from '../components/Section';
+
+// Floating Sticker Component with scroll parallax
+function FloatingSticker({ src, size, top, left, right, bottom, rotation = 0, floatRange = 15, floatSpeed = 6000, scrollFactor = 0.05 }) {
+ const [floatOffset, setFloatOffset] = useState(0);
+ const [scrollY, setScrollY] = useState(0);
+
+ useEffect(() => {
+ let startTime = Date.now();
+ let animationFrame;
+ const animate = () => {
+ const elapsed = Date.now() - startTime;
+ const offset = Math.sin((elapsed / floatSpeed) * Math.PI * 2) * floatRange;
+ setFloatOffset(offset);
+ animationFrame = requestAnimationFrame(animate);
+ };
+ animationFrame = requestAnimationFrame(animate);
+ return () => cancelAnimationFrame(animationFrame);
+ }, [floatSpeed, floatRange]);
+
+ useEffect(() => {
+ const handleScroll = () => setScrollY(window.scrollY);
+ window.addEventListener('scroll', handleScroll, { passive: true });
+ return () => window.removeEventListener('scroll', handleScroll);
+ }, []);
+
+ const springProps = useSpring({
+ transform: `translateY(${floatOffset + scrollY * scrollFactor}px) rotate(${rotation}deg)`,
+ config: { mass: 3, tension: 80, friction: 40 },
+ });
+
+ return (
+
+ );
+}
+
+// Hero Section
+function Hero() {
+ return (
+
+
+
+
+
+ {/* Overlay gradients + vignette */}
+
+
+
+
+
+
+
+ Open Source Robot
+
+
+
+
+ Powered by
+
+
+
+
+
+
+ Reachy Mini
+
+
+
+ An expressive companion robot designed for{' '}
+
+ human interaction
+
+ ,{' '}
+
+ creative coding
+
+ , and{' '}
+
+ AI experimentation
+
+ .
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+// Stats/Bento Section - Sober backgrounds, illustrations for color
+function StatsSection() {
+ return (
+
+
+ {/* Big stat - Open Source */}
+
+
+ {/* Hacker illustration - overflows top */}
+
+
+
+ 100%
+
+
+ Open Source
+
+
+
+ Hardware files, Python SDK, and all apps. Build, modify, and share freely on GitHub.
+
+
+
+
+ {/* Apps count */}
+
+
+
+ 30+
+
+
+
+ Ready-to-use Apps
+
+
+ One-click install →
+
+
+
+
+
+ {/* Community */}
+
+
+
+
+
+ 500+ Makers
+
+
+ Join Discord →
+
+
+
+
+
+ {/* Python SDK */}
+
+
+
+ from{' '}
+ reachy_mini{' '}
+ import{' '}
+ ReachyMini
+ {'\n\n'}
+ with{' '}
+ ReachyMini
+ (){' '}
+ as{' '}
+ mini:
+ {'\n'}
+ {' '}mini.goto_target(head=pose)
+
+
+
+ Python SDK
+
+
+ Full control in 3 lines →
+
+
+
+
+
+
+ );
+}
+
+// Products Section - Minimal comparison
+function ProductsSection() {
+ return (
+
+ {/* Stickers */}
+
+
+
+
+
+
+ Two ways to Reachy
+
+
+ Choose wireless for standalone use, or Lite for a budget-friendly tethered experience.
+
+
+
+
+ {/* Wireless */}
+
+
+
+
+ Most Popular
+
+
+
+
+ Reachy Mini
+
+
+ Wireless • On-board compute
+
+
+
+ $499
+
+
+
+ {['Raspberry Pi 4 on-board', 'Wi-Fi + USB', 'Camera, 4 mics, speaker', 'Accelerometer'].map((item) => (
+
+ ✓ {item}
+
+ ))}
+
+
+
+
+
+
+ {/* Lite */}
+
+
+
+ Reachy Mini Lite
+
+
+ USB • External compute
+
+
+
+ $299
+
+
+
+ {['Your Mac/PC as brain', 'USB only', 'Camera, 4 mics, speaker', 'Same motion capabilities'].map((item) => (
+
+ ✓ {item}
+
+ ))}
+
+
+
+
+
+
+
+
+ Both ship as DIY kits. Assembly takes ~2 hours.{' '}
+ Watch the guide →
+
+
+ );
+}
+
+// Apps Showcase - Sober design with illustrations
+function AppsShowcase() {
+ return (
+
+ {/* Sticker */}
+
+
+
+
+
+ {/* Header */}
+
+
+ App Ecosystem
+
+
+ 30+ apps, one click install
+
+
+ From AI conversations to hand tracking — explore what the community has built
+ or create your own and share it with the world.
+
+
+
+ {/* Featured App - AI Companion (large) */}
+
+ {/* Illustration */}
+
+
+
+
+ {/* Content */}
+
+
+
+
+ Featured
+
+
+
+ AI Companion
+
+
+ Have a conversation with Reachy! Powered by LLMs, it understands what you say
+ and responds with expressive movements and speech.
+
+ }
+ >
+ Try it now
+
+
+
+
+ {/* Other apps grid */}
+
+ {/* Hand Tracking */}
+
+
+
+
+
+
+
+ Hand Tracking
+
+
+ Reachy follows your hand movements in real-time using OpenCV.
+
+
+
+
+
+ {/* More apps CTA */}
+
+
+
+ +28
+
+
+ more apps to explore
+
+
+ Browse all →
+
+
+
+
+
+ {/* Build your own CTA */}
+
+
+ Got an idea?{' '}
+
+ Build your own app →
+
+
+
+
+
+ );
+}
+
+// Community Section
+function CommunitySection() {
+ return (
+
+
+
+
+
+
+
+
+
+ Join 500+ makers
+
+
+ Connect with other Reachy Mini owners on Discord. Share your projects,
+ get help, and stay updated on the latest developments.
+
+ }
+ >
+ Join Discord
+
+
+
+
+ );
+}
+
+// Final CTA
+function FinalCTA() {
+ return (
+
+
+
+ Ready to meet Reachy?
+
+
+ Get your own expressive companion robot and join the community of makers
+ building the future of human-robot interaction.
+
+
+
+
+
+
+
+
+ ✓ Free worldwide shipping
+ ✓ 30-day returns
+ ✓ 1-year warranty
+
+
+
+ );
+}
+
+// Main Home Page
+export default function Home() {
+ return (
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/theme/theme.js b/src/theme/theme.js
new file mode 100644
index 0000000000000000000000000000000000000000..466741f45edc98964b2a88a9ed2efcc59c648fe5
--- /dev/null
+++ b/src/theme/theme.js
@@ -0,0 +1,238 @@
+import { createTheme } from '@mui/material/styles';
+
+// Theme aligned with Tauri app
+const theme = createTheme({
+ palette: {
+ mode: 'light',
+ primary: {
+ main: '#FF9500',
+ light: '#FFB340',
+ dark: '#E08500',
+ contrastText: '#ffffff',
+ },
+ secondary: {
+ main: '#764ba2',
+ light: '#9b6fc4',
+ dark: '#5a3a7e',
+ contrastText: '#ffffff',
+ },
+ success: {
+ main: '#22c55e',
+ light: '#4ade80',
+ dark: '#16a34a',
+ },
+ error: {
+ main: '#ef4444',
+ light: '#f87171',
+ dark: '#dc2626',
+ },
+ background: {
+ default: '#fafafa',
+ paper: '#ffffff',
+ alt: '#f5f5f7',
+ },
+ text: {
+ primary: '#1d1d1f',
+ secondary: '#86868b',
+ },
+ divider: 'rgba(0, 0, 0, 0.08)',
+ },
+ typography: {
+ fontFamily: '"DM Sans", -apple-system, BlinkMacSystemFont, "SF Pro Display", "Segoe UI", Roboto, sans-serif',
+ h1: {
+ fontSize: 'clamp(48px, 10vw, 96px)',
+ fontWeight: 700,
+ letterSpacing: '-0.03em',
+ lineHeight: 1.05,
+ },
+ h2: {
+ fontSize: 'clamp(32px, 5vw, 56px)',
+ fontWeight: 700,
+ letterSpacing: '-0.03em',
+ lineHeight: 1.1,
+ },
+ h3: {
+ fontSize: '32px',
+ fontWeight: 700,
+ letterSpacing: '-0.02em',
+ },
+ h4: {
+ fontSize: '22px',
+ fontWeight: 700,
+ letterSpacing: '-0.02em',
+ },
+ h5: {
+ fontSize: '18px',
+ fontWeight: 600,
+ },
+ h6: {
+ fontSize: '16px',
+ fontWeight: 600,
+ },
+ body1: {
+ fontSize: '17px',
+ lineHeight: 1.5,
+ },
+ body2: {
+ fontSize: '15px',
+ lineHeight: 1.6,
+ },
+ button: {
+ textTransform: 'none',
+ fontWeight: 600,
+ },
+ overline: {
+ fontSize: '14px',
+ fontWeight: 600,
+ letterSpacing: '0.1em',
+ textTransform: 'uppercase',
+ },
+ },
+ shape: {
+ borderRadius: 12,
+ },
+ components: {
+ MuiCssBaseline: {
+ styleOverrides: {
+ html: {
+ overflowX: 'hidden',
+ },
+ body: {
+ overflowX: 'hidden',
+ },
+ },
+ },
+ MuiButton: {
+ defaultProps: {
+ disableRipple: false,
+ },
+ styleOverrides: {
+ root: {
+ borderRadius: 980,
+ padding: '12px 28px',
+ fontSize: '16px',
+ boxShadow: 'none',
+ transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',
+ '&:hover': {
+ boxShadow: 'none',
+ },
+ },
+ sizeLarge: {
+ padding: '16px 32px',
+ fontSize: '17px',
+ },
+ sizeSmall: {
+ padding: '10px 20px',
+ fontSize: '14px',
+ },
+ containedPrimary: {
+ background: 'linear-gradient(135deg, #FF9500 0%, #FFB340 100%)',
+ '&:hover': {
+ background: 'linear-gradient(135deg, #E08500 0%, #FF9500 100%)',
+ transform: 'scale(1.02)',
+ },
+ },
+ outlined: {
+ borderColor: 'rgba(0, 0, 0, 0.12)',
+ '&:hover': {
+ borderColor: '#1d1d1f',
+ backgroundColor: 'transparent',
+ },
+ },
+ },
+ },
+ MuiCard: {
+ styleOverrides: {
+ root: {
+ borderRadius: 20,
+ boxShadow: '0 4px 24px rgba(0, 0, 0, 0.06)',
+ border: '1px solid rgba(0, 0, 0, 0.08)',
+ transition: 'all 0.4s cubic-bezier(0.16, 1, 0.3, 1)',
+ '&:hover': {
+ transform: 'translateY(-4px)',
+ boxShadow: '0 12px 48px rgba(0, 0, 0, 0.12)',
+ },
+ },
+ },
+ },
+ MuiAppBar: {
+ styleOverrides: {
+ root: {
+ backgroundColor: 'rgba(250, 250, 250, 0.72)',
+ backdropFilter: 'saturate(180%) blur(20px)',
+ boxShadow: 'none',
+ borderBottom: '1px solid rgba(0, 0, 0, 0.08)',
+ },
+ },
+ },
+ MuiChip: {
+ styleOverrides: {
+ root: {
+ borderRadius: 980,
+ fontWeight: 600,
+ },
+ },
+ },
+ MuiAccordion: {
+ styleOverrides: {
+ root: {
+ borderRadius: '12px !important',
+ border: '1px solid rgba(0, 0, 0, 0.08)',
+ boxShadow: 'none',
+ '&:before': {
+ display: 'none',
+ },
+ '&.Mui-expanded': {
+ margin: 0,
+ },
+ },
+ },
+ },
+ MuiAccordionSummary: {
+ styleOverrides: {
+ root: {
+ backgroundColor: '#f5f5f7',
+ borderRadius: '12px',
+ '&.Mui-expanded': {
+ borderBottomLeftRadius: 0,
+ borderBottomRightRadius: 0,
+ },
+ },
+ },
+ },
+ MuiCircularProgress: {
+ styleOverrides: {
+ root: {
+ display: 'block',
+ },
+ svg: {
+ display: 'block',
+ overflow: 'visible',
+ },
+ circle: {
+ strokeLinecap: 'round',
+ },
+ },
+ },
+ MuiTooltip: {
+ styleOverrides: {
+ tooltip: {
+ backgroundColor: 'rgba(0, 0, 0, 0.9)',
+ color: '#fff',
+ fontSize: '11px',
+ fontWeight: 500,
+ padding: '10px 14px',
+ borderRadius: '8px',
+ boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',
+ maxWidth: '300px',
+ lineHeight: 1.6,
+ },
+ arrow: {
+ color: 'rgba(0, 0, 0, 0.9)',
+ },
+ },
+ },
+ },
+});
+
+export default theme;
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..8b0f57b91aeb45c54467e29f983a0893dc83c4d9
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+
+// https://vite.dev/config/
+export default defineConfig({
+ plugins: [react()],
+})
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000000000000000000000000000000000000..c76e9efe5df53323016795d18727bd1acc0189ef
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,1607 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz"
+ integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.27.1"
+ js-tokens "^4.0.0"
+ picocolors "^1.1.1"
+
+"@babel/compat-data@^7.27.2":
+ version "7.28.5"
+ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz"
+ integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==
+
+"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.24.4", "@babel/core@^7.28.5":
+ version "7.28.5"
+ resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz"
+ integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==
+ dependencies:
+ "@babel/code-frame" "^7.27.1"
+ "@babel/generator" "^7.28.5"
+ "@babel/helper-compilation-targets" "^7.27.2"
+ "@babel/helper-module-transforms" "^7.28.3"
+ "@babel/helpers" "^7.28.4"
+ "@babel/parser" "^7.28.5"
+ "@babel/template" "^7.27.2"
+ "@babel/traverse" "^7.28.5"
+ "@babel/types" "^7.28.5"
+ "@jridgewell/remapping" "^2.3.5"
+ convert-source-map "^2.0.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
+"@babel/generator@^7.28.5":
+ version "7.28.5"
+ resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz"
+ integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==
+ dependencies:
+ "@babel/parser" "^7.28.5"
+ "@babel/types" "^7.28.5"
+ "@jridgewell/gen-mapping" "^0.3.12"
+ "@jridgewell/trace-mapping" "^0.3.28"
+ jsesc "^3.0.2"
+
+"@babel/helper-compilation-targets@^7.27.2":
+ version "7.27.2"
+ resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz"
+ integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==
+ dependencies:
+ "@babel/compat-data" "^7.27.2"
+ "@babel/helper-validator-option" "^7.27.1"
+ browserslist "^4.24.0"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
+"@babel/helper-globals@^7.28.0":
+ version "7.28.0"
+ resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz"
+ integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==
+
+"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz"
+ integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==
+ dependencies:
+ "@babel/traverse" "^7.27.1"
+ "@babel/types" "^7.27.1"
+
+"@babel/helper-module-transforms@^7.28.3":
+ version "7.28.3"
+ resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz"
+ integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==
+ dependencies:
+ "@babel/helper-module-imports" "^7.27.1"
+ "@babel/helper-validator-identifier" "^7.27.1"
+ "@babel/traverse" "^7.28.3"
+
+"@babel/helper-plugin-utils@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz"
+ integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==
+
+"@babel/helper-string-parser@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz"
+ integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
+
+"@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5":
+ version "7.28.5"
+ resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz"
+ integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==
+
+"@babel/helper-validator-option@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz"
+ integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==
+
+"@babel/helpers@^7.28.4":
+ version "7.28.4"
+ resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz"
+ integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==
+ dependencies:
+ "@babel/template" "^7.27.2"
+ "@babel/types" "^7.28.4"
+
+"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.24.4", "@babel/parser@^7.27.2", "@babel/parser@^7.28.5":
+ version "7.28.5"
+ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz"
+ integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==
+ dependencies:
+ "@babel/types" "^7.28.5"
+
+"@babel/plugin-transform-react-jsx-self@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz"
+ integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.27.1"
+
+"@babel/plugin-transform-react-jsx-source@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz"
+ integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.27.1"
+
+"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.28.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7":
+ version "7.28.4"
+ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz"
+ integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==
+
+"@babel/template@^7.27.2":
+ version "7.27.2"
+ resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz"
+ integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==
+ dependencies:
+ "@babel/code-frame" "^7.27.1"
+ "@babel/parser" "^7.27.2"
+ "@babel/types" "^7.27.1"
+
+"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.5":
+ version "7.28.5"
+ resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz"
+ integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==
+ dependencies:
+ "@babel/code-frame" "^7.27.1"
+ "@babel/generator" "^7.28.5"
+ "@babel/helper-globals" "^7.28.0"
+ "@babel/parser" "^7.28.5"
+ "@babel/template" "^7.27.2"
+ "@babel/types" "^7.28.5"
+ debug "^4.3.1"
+
+"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.28.5":
+ version "7.28.5"
+ resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz"
+ integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==
+ dependencies:
+ "@babel/helper-string-parser" "^7.27.1"
+ "@babel/helper-validator-identifier" "^7.28.5"
+
+"@emotion/babel-plugin@^11.13.5":
+ version "11.13.5"
+ resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz"
+ integrity sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/runtime" "^7.18.3"
+ "@emotion/hash" "^0.9.2"
+ "@emotion/memoize" "^0.9.0"
+ "@emotion/serialize" "^1.3.3"
+ babel-plugin-macros "^3.1.0"
+ convert-source-map "^1.5.0"
+ escape-string-regexp "^4.0.0"
+ find-root "^1.1.0"
+ source-map "^0.5.7"
+ stylis "4.2.0"
+
+"@emotion/cache@^11.14.0":
+ version "11.14.0"
+ resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz"
+ integrity sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==
+ dependencies:
+ "@emotion/memoize" "^0.9.0"
+ "@emotion/sheet" "^1.4.0"
+ "@emotion/utils" "^1.4.2"
+ "@emotion/weak-memoize" "^0.4.0"
+ stylis "4.2.0"
+
+"@emotion/hash@^0.9.2":
+ version "0.9.2"
+ resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz"
+ integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==
+
+"@emotion/is-prop-valid@*", "@emotion/is-prop-valid@^1.3.0":
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz"
+ integrity sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==
+ dependencies:
+ "@emotion/memoize" "^0.9.0"
+
+"@emotion/memoize@^0.9.0":
+ version "0.9.0"
+ resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz"
+ integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==
+
+"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.14.0", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0":
+ version "11.14.0"
+ resolved "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz"
+ integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==
+ dependencies:
+ "@babel/runtime" "^7.18.3"
+ "@emotion/babel-plugin" "^11.13.5"
+ "@emotion/cache" "^11.14.0"
+ "@emotion/serialize" "^1.3.3"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0"
+ "@emotion/utils" "^1.4.2"
+ "@emotion/weak-memoize" "^0.4.0"
+ hoist-non-react-statics "^3.3.1"
+
+"@emotion/serialize@^1.3.3":
+ version "1.3.3"
+ resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz"
+ integrity sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==
+ dependencies:
+ "@emotion/hash" "^0.9.2"
+ "@emotion/memoize" "^0.9.0"
+ "@emotion/unitless" "^0.10.0"
+ "@emotion/utils" "^1.4.2"
+ csstype "^3.0.2"
+
+"@emotion/sheet@^1.4.0":
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz"
+ integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==
+
+"@emotion/styled@^11.14.1", "@emotion/styled@^11.3.0":
+ version "11.14.1"
+ resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz"
+ integrity sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==
+ dependencies:
+ "@babel/runtime" "^7.18.3"
+ "@emotion/babel-plugin" "^11.13.5"
+ "@emotion/is-prop-valid" "^1.3.0"
+ "@emotion/serialize" "^1.3.3"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0"
+ "@emotion/utils" "^1.4.2"
+
+"@emotion/unitless@^0.10.0":
+ version "0.10.0"
+ resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz"
+ integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==
+
+"@emotion/use-insertion-effect-with-fallbacks@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz"
+ integrity sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==
+
+"@emotion/utils@^1.4.2":
+ version "1.4.2"
+ resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz"
+ integrity sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==
+
+"@emotion/weak-memoize@^0.4.0":
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz"
+ integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==
+
+"@esbuild/darwin-arm64@0.25.12":
+ version "0.25.12"
+ resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz"
+ integrity sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==
+
+"@eslint-community/eslint-utils@^4.8.0":
+ version "4.9.0"
+ resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz"
+ integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==
+ dependencies:
+ eslint-visitor-keys "^3.4.3"
+
+"@eslint-community/regexpp@^4.12.1":
+ version "4.12.2"
+ resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz"
+ integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==
+
+"@eslint/config-array@^0.21.1":
+ version "0.21.1"
+ resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz"
+ integrity sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==
+ dependencies:
+ "@eslint/object-schema" "^2.1.7"
+ debug "^4.3.1"
+ minimatch "^3.1.2"
+
+"@eslint/config-helpers@^0.4.2":
+ version "0.4.2"
+ resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz"
+ integrity sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==
+ dependencies:
+ "@eslint/core" "^0.17.0"
+
+"@eslint/core@^0.17.0":
+ version "0.17.0"
+ resolved "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz"
+ integrity sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==
+ dependencies:
+ "@types/json-schema" "^7.0.15"
+
+"@eslint/eslintrc@^3.3.1":
+ version "3.3.3"
+ resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz"
+ integrity sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.3.2"
+ espree "^10.0.1"
+ globals "^14.0.0"
+ ignore "^5.2.0"
+ import-fresh "^3.2.1"
+ js-yaml "^4.1.1"
+ minimatch "^3.1.2"
+ strip-json-comments "^3.1.1"
+
+"@eslint/js@^9.39.1", "@eslint/js@9.39.1":
+ version "9.39.1"
+ resolved "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz"
+ integrity sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==
+
+"@eslint/object-schema@^2.1.7":
+ version "2.1.7"
+ resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz"
+ integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==
+
+"@eslint/plugin-kit@^0.4.1":
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz"
+ integrity sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==
+ dependencies:
+ "@eslint/core" "^0.17.0"
+ levn "^0.4.1"
+
+"@humanfs/core@^0.19.1":
+ version "0.19.1"
+ resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz"
+ integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==
+
+"@humanfs/node@^0.16.6":
+ version "0.16.7"
+ resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz"
+ integrity sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==
+ dependencies:
+ "@humanfs/core" "^0.19.1"
+ "@humanwhocodes/retry" "^0.4.0"
+
+"@humanwhocodes/module-importer@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz"
+ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
+"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2":
+ version "0.4.3"
+ resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz"
+ integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==
+
+"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.13"
+ resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz"
+ integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.5.0"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/remapping@^2.3.5":
+ version "2.3.5"
+ resolved "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz"
+ integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0":
+ version "1.5.5"
+ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz"
+ integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==
+
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28":
+ version "0.3.31"
+ resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz"
+ integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@mui/core-downloads-tracker@^7.3.6":
+ version "7.3.6"
+ resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.6.tgz"
+ integrity sha512-QaYtTHlr8kDFN5mE1wbvVARRKH7Fdw1ZuOjBJcFdVpfNfRYKF3QLT4rt+WaB6CKJvpqxRsmEo0kpYinhH5GeHg==
+
+"@mui/icons-material@^7.3.6":
+ version "7.3.6"
+ resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.3.6.tgz"
+ integrity sha512-0FfkXEj22ysIq5pa41A2NbcAhJSvmcZQ/vcTIbjDsd6hlslG82k5BEBqqS0ZJprxwIL3B45qpJ+bPHwJPlF7uQ==
+ dependencies:
+ "@babel/runtime" "^7.28.4"
+
+"@mui/material@^7.3.6":
+ version "7.3.6"
+ resolved "https://registry.npmjs.org/@mui/material/-/material-7.3.6.tgz"
+ integrity sha512-R4DaYF3dgCQCUAkr4wW1w26GHXcf5rCmBRHVBuuvJvaGLmZdD8EjatP80Nz5JCw0KxORAzwftnHzXVnjR8HnFw==
+ dependencies:
+ "@babel/runtime" "^7.28.4"
+ "@mui/core-downloads-tracker" "^7.3.6"
+ "@mui/system" "^7.3.6"
+ "@mui/types" "^7.4.9"
+ "@mui/utils" "^7.3.6"
+ "@popperjs/core" "^2.11.8"
+ "@types/react-transition-group" "^4.4.12"
+ clsx "^2.1.1"
+ csstype "^3.1.3"
+ prop-types "^15.8.1"
+ react-is "^19.2.0"
+ react-transition-group "^4.4.5"
+
+"@mui/private-theming@^7.3.6":
+ version "7.3.6"
+ resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.3.6.tgz"
+ integrity sha512-Ws9wZpqM+FlnbZXaY/7yvyvWQo1+02Tbx50mVdNmzWEi51C51y56KAbaDCYyulOOBL6BJxuaqG8rNNuj7ivVyw==
+ dependencies:
+ "@babel/runtime" "^7.28.4"
+ "@mui/utils" "^7.3.6"
+ prop-types "^15.8.1"
+
+"@mui/styled-engine@^7.3.6":
+ version "7.3.6"
+ resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.3.6.tgz"
+ integrity sha512-+wiYbtvj+zyUkmDB+ysH6zRjuQIJ+CM56w0fEXV+VDNdvOuSywG+/8kpjddvvlfMLsaWdQe5oTuYGBcodmqGzQ==
+ dependencies:
+ "@babel/runtime" "^7.28.4"
+ "@emotion/cache" "^11.14.0"
+ "@emotion/serialize" "^1.3.3"
+ "@emotion/sheet" "^1.4.0"
+ csstype "^3.1.3"
+ prop-types "^15.8.1"
+
+"@mui/system@^7.3.6":
+ version "7.3.6"
+ resolved "https://registry.npmjs.org/@mui/system/-/system-7.3.6.tgz"
+ integrity sha512-8fehAazkHNP1imMrdD2m2hbA9sl7Ur6jfuNweh5o4l9YPty4iaZzRXqYvBCWQNwFaSHmMEj2KPbyXGp7Bt73Rg==
+ dependencies:
+ "@babel/runtime" "^7.28.4"
+ "@mui/private-theming" "^7.3.6"
+ "@mui/styled-engine" "^7.3.6"
+ "@mui/types" "^7.4.9"
+ "@mui/utils" "^7.3.6"
+ clsx "^2.1.1"
+ csstype "^3.1.3"
+ prop-types "^15.8.1"
+
+"@mui/types@^7.4.9":
+ version "7.4.9"
+ resolved "https://registry.npmjs.org/@mui/types/-/types-7.4.9.tgz"
+ integrity sha512-dNO8Z9T2cujkSIaCnWwprfeKmTWh97cnjkgmpFJ2sbfXLx8SMZijCYHOtP/y5nnUb/Rm2omxbDMmtUoSaUtKaw==
+ dependencies:
+ "@babel/runtime" "^7.28.4"
+
+"@mui/utils@^7.3.6":
+ version "7.3.6"
+ resolved "https://registry.npmjs.org/@mui/utils/-/utils-7.3.6.tgz"
+ integrity sha512-jn+Ba02O6PiFs7nKva8R2aJJ9kJC+3kQ2R0BbKNY3KQQ36Qng98GnPRFTlbwYTdMD6hLEBKaMLUktyg/rTfd2w==
+ dependencies:
+ "@babel/runtime" "^7.28.4"
+ "@mui/types" "^7.4.9"
+ "@types/prop-types" "^15.7.15"
+ clsx "^2.1.1"
+ prop-types "^15.8.1"
+ react-is "^19.2.0"
+
+"@popperjs/core@^2.11.8":
+ version "2.11.8"
+ resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz"
+ integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
+
+"@react-spring/animated@~10.0.3":
+ version "10.0.3"
+ resolved "https://registry.npmjs.org/@react-spring/animated/-/animated-10.0.3.tgz"
+ integrity sha512-7MrxADV3vaUADn2V9iYhaIL6iOWRx9nCJjYrsk2AHD2kwPr6fg7Pt0v+deX5RnCDmCKNnD6W5fasiyM8D+wzJQ==
+ dependencies:
+ "@react-spring/shared" "~10.0.3"
+ "@react-spring/types" "~10.0.3"
+
+"@react-spring/core@~10.0.3":
+ version "10.0.3"
+ resolved "https://registry.npmjs.org/@react-spring/core/-/core-10.0.3.tgz"
+ integrity sha512-D4DwNO68oohDf/0HG2G0Uragzb9IA1oXblxrd6MZAcBcUQG2EHUWXewjdECMPLNmQvlYVyyBRH6gPxXM5DX7DQ==
+ dependencies:
+ "@react-spring/animated" "~10.0.3"
+ "@react-spring/shared" "~10.0.3"
+ "@react-spring/types" "~10.0.3"
+
+"@react-spring/rafz@~10.0.3":
+ version "10.0.3"
+ resolved "https://registry.npmjs.org/@react-spring/rafz/-/rafz-10.0.3.tgz"
+ integrity sha512-Ri2/xqt8OnQ2iFKkxKMSF4Nqv0LSWnxXT4jXFzBDsHgeeH/cHxTLupAWUwmV9hAGgmEhBmh5aONtj3J6R/18wg==
+
+"@react-spring/shared@~10.0.3":
+ version "10.0.3"
+ resolved "https://registry.npmjs.org/@react-spring/shared/-/shared-10.0.3.tgz"
+ integrity sha512-geCal66nrkaQzUVhPkGomylo+Jpd5VPK8tPMEDevQEfNSWAQP15swHm+MCRG4wVQrQlTi9lOzKzpRoTL3CA84Q==
+ dependencies:
+ "@react-spring/rafz" "~10.0.3"
+ "@react-spring/types" "~10.0.3"
+
+"@react-spring/types@~10.0.3":
+ version "10.0.3"
+ resolved "https://registry.npmjs.org/@react-spring/types/-/types-10.0.3.tgz"
+ integrity sha512-H5Ixkd2OuSIgHtxuHLTt7aJYfhMXKXT/rK32HPD/kSrOB6q6ooeiWAXkBy7L8F3ZxdkBb9ini9zP9UwnEFzWgQ==
+
+"@react-spring/web@^10.0.3":
+ version "10.0.3"
+ resolved "https://registry.npmjs.org/@react-spring/web/-/web-10.0.3.tgz"
+ integrity sha512-ndU+kWY81rHsT7gTFtCJ6mrVhaJ6grFmgTnENipzmKqot4HGf5smPNK+cZZJqoGeDsj9ZsiWPW4geT/NyD484A==
+ dependencies:
+ "@react-spring/animated" "~10.0.3"
+ "@react-spring/core" "~10.0.3"
+ "@react-spring/shared" "~10.0.3"
+ "@react-spring/types" "~10.0.3"
+
+"@rolldown/pluginutils@1.0.0-beta.53":
+ version "1.0.0-beta.53"
+ resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz"
+ integrity sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==
+
+"@rollup/rollup-darwin-arm64@4.53.3":
+ version "4.53.3"
+ resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz"
+ integrity sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==
+
+"@types/babel__core@^7.20.5":
+ version "7.20.5"
+ resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz"
+ integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==
+ dependencies:
+ "@babel/parser" "^7.20.7"
+ "@babel/types" "^7.20.7"
+ "@types/babel__generator" "*"
+ "@types/babel__template" "*"
+ "@types/babel__traverse" "*"
+
+"@types/babel__generator@*":
+ version "7.27.0"
+ resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz"
+ integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@types/babel__template@*":
+ version "7.4.4"
+ resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz"
+ integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==
+ dependencies:
+ "@babel/parser" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@types/babel__traverse@*":
+ version "7.28.0"
+ resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz"
+ integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==
+ dependencies:
+ "@babel/types" "^7.28.2"
+
+"@types/estree@^1.0.6", "@types/estree@1.0.8":
+ version "1.0.8"
+ resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz"
+ integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
+
+"@types/json-schema@^7.0.15":
+ version "7.0.15"
+ resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz"
+ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
+
+"@types/parse-json@^4.0.0":
+ version "4.0.2"
+ resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz"
+ integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==
+
+"@types/prop-types@^15.7.15":
+ version "15.7.15"
+ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz"
+ integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==
+
+"@types/react-dom@^19.2.3":
+ version "19.2.3"
+ resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz"
+ integrity sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==
+
+"@types/react-transition-group@^4.4.12":
+ version "4.4.12"
+ resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz"
+ integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==
+
+"@types/react@*", "@types/react@^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react@^19.2.0", "@types/react@^19.2.5":
+ version "19.2.7"
+ resolved "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz"
+ integrity sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==
+ dependencies:
+ csstype "^3.2.2"
+
+"@vitejs/plugin-react@^5.1.1":
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz"
+ integrity sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==
+ dependencies:
+ "@babel/core" "^7.28.5"
+ "@babel/plugin-transform-react-jsx-self" "^7.27.1"
+ "@babel/plugin-transform-react-jsx-source" "^7.27.1"
+ "@rolldown/pluginutils" "1.0.0-beta.53"
+ "@types/babel__core" "^7.20.5"
+ react-refresh "^0.18.0"
+
+acorn-jsx@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.15.0:
+ version "8.15.0"
+ resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz"
+ integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
+
+ajv@^6.12.4:
+ version "6.12.6"
+ resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+babel-plugin-macros@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz"
+ integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==
+ dependencies:
+ "@babel/runtime" "^7.12.5"
+ cosmiconfig "^7.0.0"
+ resolve "^1.19.0"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+baseline-browser-mapping@^2.9.0:
+ version "2.9.6"
+ resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.6.tgz"
+ integrity sha512-v9BVVpOTLB59C9E7aSnmIF8h7qRsFpx+A2nugVMTszEOMcfjlZMsXRm4LF23I3Z9AJxc8ANpIvzbzONoX9VJlg==
+
+brace-expansion@^1.1.7:
+ version "1.1.12"
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz"
+ integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+browserslist@^4.24.0, "browserslist@>= 4.21.0":
+ version "4.28.1"
+ resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz"
+ integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==
+ dependencies:
+ baseline-browser-mapping "^2.9.0"
+ caniuse-lite "^1.0.30001759"
+ electron-to-chromium "^1.5.263"
+ node-releases "^2.0.27"
+ update-browserslist-db "^1.2.0"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+caniuse-lite@^1.0.30001759:
+ version "1.0.30001760"
+ resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz"
+ integrity sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==
+
+chalk@^4.0.0:
+ version "4.1.2"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+clsx@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz"
+ integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+convert-source-map@^1.5.0:
+ version "1.9.0"
+ resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz"
+ integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
+
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+cookie@^1.0.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz"
+ integrity sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==
+
+cosmiconfig@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz"
+ integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.2.1"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.10.0"
+
+cross-spawn@^7.0.6:
+ version "7.0.6"
+ resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz"
+ integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+csstype@^3.0.2, csstype@^3.1.3, csstype@^3.2.2:
+ version "3.2.3"
+ resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz"
+ integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==
+
+debug@^4.1.0, debug@^4.3.1, debug@^4.3.2:
+ version "4.4.3"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz"
+ integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
+ dependencies:
+ ms "^2.1.3"
+
+deep-is@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+dom-helpers@^5.0.1:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz"
+ integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==
+ dependencies:
+ "@babel/runtime" "^7.8.7"
+ csstype "^3.0.2"
+
+electron-to-chromium@^1.5.263:
+ version "1.5.267"
+ resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz"
+ integrity sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==
+
+error-ex@^1.3.1:
+ version "1.3.4"
+ resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz"
+ integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+esbuild@^0.25.0:
+ version "0.25.12"
+ resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz"
+ integrity sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==
+ optionalDependencies:
+ "@esbuild/aix-ppc64" "0.25.12"
+ "@esbuild/android-arm" "0.25.12"
+ "@esbuild/android-arm64" "0.25.12"
+ "@esbuild/android-x64" "0.25.12"
+ "@esbuild/darwin-arm64" "0.25.12"
+ "@esbuild/darwin-x64" "0.25.12"
+ "@esbuild/freebsd-arm64" "0.25.12"
+ "@esbuild/freebsd-x64" "0.25.12"
+ "@esbuild/linux-arm" "0.25.12"
+ "@esbuild/linux-arm64" "0.25.12"
+ "@esbuild/linux-ia32" "0.25.12"
+ "@esbuild/linux-loong64" "0.25.12"
+ "@esbuild/linux-mips64el" "0.25.12"
+ "@esbuild/linux-ppc64" "0.25.12"
+ "@esbuild/linux-riscv64" "0.25.12"
+ "@esbuild/linux-s390x" "0.25.12"
+ "@esbuild/linux-x64" "0.25.12"
+ "@esbuild/netbsd-arm64" "0.25.12"
+ "@esbuild/netbsd-x64" "0.25.12"
+ "@esbuild/openbsd-arm64" "0.25.12"
+ "@esbuild/openbsd-x64" "0.25.12"
+ "@esbuild/openharmony-arm64" "0.25.12"
+ "@esbuild/sunos-x64" "0.25.12"
+ "@esbuild/win32-arm64" "0.25.12"
+ "@esbuild/win32-ia32" "0.25.12"
+ "@esbuild/win32-x64" "0.25.12"
+
+escalade@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-plugin-react-hooks@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz"
+ integrity sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==
+ dependencies:
+ "@babel/core" "^7.24.4"
+ "@babel/parser" "^7.24.4"
+ hermes-parser "^0.25.1"
+ zod "^3.25.0 || ^4.0.0"
+ zod-validation-error "^3.5.0 || ^4.0.0"
+
+eslint-plugin-react-refresh@^0.4.24:
+ version "0.4.24"
+ resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.24.tgz"
+ integrity sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==
+
+eslint-scope@^8.4.0:
+ version "8.4.0"
+ resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz"
+ integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
+eslint-visitor-keys@^3.4.3:
+ version "3.4.3"
+ resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
+ integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+
+eslint-visitor-keys@^4.2.1:
+ version "4.2.1"
+ resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz"
+ integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
+
+"eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^9.39.1, eslint@>=8.40:
+ version "9.39.1"
+ resolved "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz"
+ integrity sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.8.0"
+ "@eslint-community/regexpp" "^4.12.1"
+ "@eslint/config-array" "^0.21.1"
+ "@eslint/config-helpers" "^0.4.2"
+ "@eslint/core" "^0.17.0"
+ "@eslint/eslintrc" "^3.3.1"
+ "@eslint/js" "9.39.1"
+ "@eslint/plugin-kit" "^0.4.1"
+ "@humanfs/node" "^0.16.6"
+ "@humanwhocodes/module-importer" "^1.0.1"
+ "@humanwhocodes/retry" "^0.4.2"
+ "@types/estree" "^1.0.6"
+ ajv "^6.12.4"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.6"
+ debug "^4.3.2"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^8.4.0"
+ eslint-visitor-keys "^4.2.1"
+ espree "^10.4.0"
+ esquery "^1.5.0"
+ esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^8.0.0"
+ find-up "^5.0.0"
+ glob-parent "^6.0.2"
+ ignore "^5.2.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ lodash.merge "^4.6.2"
+ minimatch "^3.1.2"
+ natural-compare "^1.4.0"
+ optionator "^0.9.3"
+
+espree@^10.0.1, espree@^10.4.0:
+ version "10.4.0"
+ resolved "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz"
+ integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==
+ dependencies:
+ acorn "^8.15.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^4.2.1"
+
+esquery@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz"
+ integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fdir@^6.5.0:
+ version "6.5.0"
+ resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz"
+ integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==
+
+file-entry-cache@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz"
+ integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==
+ dependencies:
+ flat-cache "^4.0.0"
+
+find-root@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz"
+ integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+flat-cache@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz"
+ integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==
+ dependencies:
+ flatted "^3.2.9"
+ keyv "^4.5.4"
+
+flatted@^3.2.9:
+ version "3.3.3"
+ resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz"
+ integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==
+
+framer-motion@^12.23.26:
+ version "12.23.26"
+ resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.26.tgz"
+ integrity sha512-cPcIhgR42xBn1Uj+PzOyheMtZ73H927+uWPDVhUMqxy8UHt6Okavb6xIz9J/phFUHUj0OncR6UvMfJTXoc/LKA==
+ dependencies:
+ motion-dom "^12.23.23"
+ motion-utils "^12.23.6"
+ tslib "^2.4.0"
+
+fsevents@~2.3.2, fsevents@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+glob-parent@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+globals@^14.0.0:
+ version "14.0.0"
+ resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz"
+ integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
+
+globals@^16.5.0:
+ version "16.5.0"
+ resolved "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz"
+ integrity sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+hasown@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+ dependencies:
+ function-bind "^1.1.2"
+
+hermes-estree@0.25.1:
+ version "0.25.1"
+ resolved "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz"
+ integrity sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==
+
+hermes-parser@^0.25.1:
+ version "0.25.1"
+ resolved "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz"
+ integrity sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==
+ dependencies:
+ hermes-estree "0.25.1"
+
+hoist-non-react-statics@^3.3.1:
+ version "3.3.2"
+ resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz"
+ integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
+ dependencies:
+ react-is "^16.7.0"
+
+ignore@^5.2.0:
+ version "5.3.2"
+ resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz"
+ integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
+
+import-fresh@^3.2.1:
+ version "3.3.1"
+ resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz"
+ integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
+ integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+
+is-core-module@^2.16.1:
+ version "2.16.1"
+ resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz"
+ integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==
+ dependencies:
+ hasown "^2.0.2"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-glob@^4.0.0, is-glob@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz"
+ integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==
+ dependencies:
+ argparse "^2.0.1"
+
+jsesc@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz"
+ integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==
+
+json-buffer@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz"
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
+
+json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+keyv@^4.5.4:
+ version "4.5.4"
+ resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz"
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+ dependencies:
+ json-buffer "3.0.1"
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+lines-and-columns@^1.1.6:
+ version "1.2.4"
+ resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+loose-envify@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+motion-dom@^12.23.23:
+ version "12.23.23"
+ resolved "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.23.tgz"
+ integrity sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==
+ dependencies:
+ motion-utils "^12.23.6"
+
+motion-utils@^12.23.6:
+ version "12.23.6"
+ resolved "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz"
+ integrity sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==
+
+ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+nanoid@^3.3.11:
+ version "3.3.11"
+ resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz"
+ integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+node-releases@^2.0.27:
+ version "2.0.27"
+ resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz"
+ integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==
+
+object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+optionator@^0.9.3:
+ version "0.9.4"
+ resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz"
+ integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==
+ dependencies:
+ deep-is "^0.1.3"
+ fast-levenshtein "^2.0.6"
+ levn "^0.4.1"
+ prelude-ls "^1.2.1"
+ type-check "^0.4.0"
+ word-wrap "^1.2.5"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-json@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+picocolors@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"
+ integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
+
+"picomatch@^3 || ^4", picomatch@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz"
+ integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==
+
+postcss@^8.5.6:
+ version "8.5.6"
+ resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz"
+ integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
+ dependencies:
+ nanoid "^3.3.11"
+ picocolors "^1.1.1"
+ source-map-js "^1.2.1"
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+prop-types@^15.6.2, prop-types@^15.8.1:
+ version "15.8.1"
+ resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
+ integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
+ dependencies:
+ loose-envify "^1.4.0"
+ object-assign "^4.1.1"
+ react-is "^16.13.1"
+
+punycode@^2.1.0:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
+"react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0", react-dom@^19.2.0, react-dom@>=16.6.0, react-dom@>=18:
+ version "19.2.3"
+ resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz"
+ integrity sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==
+ dependencies:
+ scheduler "^0.27.0"
+
+react-is@^16.13.1, react-is@^16.7.0:
+ version "16.13.1"
+ resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
+react-is@^19.2.0:
+ version "19.2.3"
+ resolved "https://registry.npmjs.org/react-is/-/react-is-19.2.3.tgz"
+ integrity sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA==
+
+react-refresh@^0.18.0:
+ version "0.18.0"
+ resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz"
+ integrity sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==
+
+react-router-dom@^7.10.1:
+ version "7.10.1"
+ resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.10.1.tgz"
+ integrity sha512-JNBANI6ChGVjA5bwsUIwJk7LHKmqB4JYnYfzFwyp2t12Izva11elds2jx7Yfoup2zssedntwU0oZ5DEmk5Sdaw==
+ dependencies:
+ react-router "7.10.1"
+
+react-router@7.10.1:
+ version "7.10.1"
+ resolved "https://registry.npmjs.org/react-router/-/react-router-7.10.1.tgz"
+ integrity sha512-gHL89dRa3kwlUYtRQ+m8NmxGI6CgqN+k4XyGjwcFoQwwCWF6xXpOCUlDovkXClS0d0XJN/5q7kc5W3kiFEd0Yw==
+ dependencies:
+ cookie "^1.0.1"
+ set-cookie-parser "^2.6.0"
+
+react-transition-group@^4.4.5:
+ version "4.4.5"
+ resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz"
+ integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
+ dependencies:
+ "@babel/runtime" "^7.5.5"
+ dom-helpers "^5.0.1"
+ loose-envify "^1.4.0"
+ prop-types "^15.6.2"
+
+"react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0", react@^19.2.0, react@^19.2.3, react@>=16.6.0, react@>=16.8.0, react@>=18:
+ version "19.2.3"
+ resolved "https://registry.npmjs.org/react/-/react-19.2.3.tgz"
+ integrity sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve@^1.19.0:
+ version "1.22.11"
+ resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz"
+ integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==
+ dependencies:
+ is-core-module "^2.16.1"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+rollup@^4.43.0:
+ version "4.53.3"
+ resolved "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz"
+ integrity sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==
+ dependencies:
+ "@types/estree" "1.0.8"
+ optionalDependencies:
+ "@rollup/rollup-android-arm-eabi" "4.53.3"
+ "@rollup/rollup-android-arm64" "4.53.3"
+ "@rollup/rollup-darwin-arm64" "4.53.3"
+ "@rollup/rollup-darwin-x64" "4.53.3"
+ "@rollup/rollup-freebsd-arm64" "4.53.3"
+ "@rollup/rollup-freebsd-x64" "4.53.3"
+ "@rollup/rollup-linux-arm-gnueabihf" "4.53.3"
+ "@rollup/rollup-linux-arm-musleabihf" "4.53.3"
+ "@rollup/rollup-linux-arm64-gnu" "4.53.3"
+ "@rollup/rollup-linux-arm64-musl" "4.53.3"
+ "@rollup/rollup-linux-loong64-gnu" "4.53.3"
+ "@rollup/rollup-linux-ppc64-gnu" "4.53.3"
+ "@rollup/rollup-linux-riscv64-gnu" "4.53.3"
+ "@rollup/rollup-linux-riscv64-musl" "4.53.3"
+ "@rollup/rollup-linux-s390x-gnu" "4.53.3"
+ "@rollup/rollup-linux-x64-gnu" "4.53.3"
+ "@rollup/rollup-linux-x64-musl" "4.53.3"
+ "@rollup/rollup-openharmony-arm64" "4.53.3"
+ "@rollup/rollup-win32-arm64-msvc" "4.53.3"
+ "@rollup/rollup-win32-ia32-msvc" "4.53.3"
+ "@rollup/rollup-win32-x64-gnu" "4.53.3"
+ "@rollup/rollup-win32-x64-msvc" "4.53.3"
+ fsevents "~2.3.2"
+
+scheduler@^0.27.0:
+ version "0.27.0"
+ resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz"
+ integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==
+
+semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+set-cookie-parser@^2.6.0:
+ version "2.7.2"
+ resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz"
+ integrity sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+source-map-js@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz"
+ integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
+
+source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
+ integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
+
+strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+stylis@4.2.0:
+ version "4.2.0"
+ resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz"
+ integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+tinyglobby@^0.2.15:
+ version "0.2.15"
+ resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz"
+ integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==
+ dependencies:
+ fdir "^6.5.0"
+ picomatch "^4.0.3"
+
+tslib@^2.4.0:
+ version "2.8.1"
+ resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"
+ integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+update-browserslist-db@^1.2.0:
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz"
+ integrity sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==
+ dependencies:
+ escalade "^3.2.0"
+ picocolors "^1.1.1"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+"vite@^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", vite@^7.2.4:
+ version "7.2.7"
+ resolved "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz"
+ integrity sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==
+ dependencies:
+ esbuild "^0.25.0"
+ fdir "^6.5.0"
+ picomatch "^4.0.3"
+ postcss "^8.5.6"
+ rollup "^4.43.0"
+ tinyglobby "^0.2.15"
+ optionalDependencies:
+ fsevents "~2.3.3"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+word-wrap@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz"
+ integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
+
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yaml@^1.10.0:
+ version "1.10.2"
+ resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+
+"zod-validation-error@^3.5.0 || ^4.0.0":
+ version "4.0.2"
+ resolved "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz"
+ integrity sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==
+
+"zod@^3.25.0 || ^4.0.0":
+ version "4.1.13"
+ resolved "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz"
+ integrity sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==