A quick vibe-coded site to test response times of PLC.directory mirrors (over 3 attempts)

Initial commit from template vite_react_shadcn_ts_20250728_minor

+24
.gitignore
···
+
# 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?
+73
README.md
···
+
# Welcome to your Lovable project
+
+
## Project info
+
+
**URL**: https://lovable.dev/projects/186e5104-4723-467c-a30c-826aab8e6c65
+
+
## How can I edit this code?
+
+
There are several ways of editing your application.
+
+
**Use Lovable**
+
+
Simply visit the [Lovable Project](https://lovable.dev/projects/186e5104-4723-467c-a30c-826aab8e6c65) and start prompting.
+
+
Changes made via Lovable will be committed automatically to this repo.
+
+
**Use your preferred IDE**
+
+
If you want to work locally using your own IDE, you can clone this repo and push changes. Pushed changes will also be reflected in Lovable.
+
+
The only requirement is having Node.js & npm installed - [install with nvm](https://github.com/nvm-sh/nvm#installing-and-updating)
+
+
Follow these steps:
+
+
```sh
+
# Step 1: Clone the repository using the project's Git URL.
+
git clone <YOUR_GIT_URL>
+
+
# Step 2: Navigate to the project directory.
+
cd <YOUR_PROJECT_NAME>
+
+
# Step 3: Install the necessary dependencies.
+
npm i
+
+
# Step 4: Start the development server with auto-reloading and an instant preview.
+
npm run dev
+
```
+
+
**Edit a file directly in GitHub**
+
+
- Navigate to the desired file(s).
+
- Click the "Edit" button (pencil icon) at the top right of the file view.
+
- Make your changes and commit the changes.
+
+
**Use GitHub Codespaces**
+
+
- Navigate to the main page of your repository.
+
- Click on the "Code" button (green button) near the top right.
+
- Select the "Codespaces" tab.
+
- Click on "New codespace" to launch a new Codespace environment.
+
- Edit files directly within the Codespace and commit and push your changes once you're done.
+
+
## What technologies are used for this project?
+
+
This project is built with:
+
+
- Vite
+
- TypeScript
+
- React
+
- shadcn-ui
+
- Tailwind CSS
+
+
## How can I deploy this project?
+
+
Simply open [Lovable](https://lovable.dev/projects/186e5104-4723-467c-a30c-826aab8e6c65) and click on Share -> Publish.
+
+
## Can I connect a custom domain to my Lovable project?
+
+
Yes, you can!
+
+
To connect a domain, navigate to Project > Settings > Domains and click Connect Domain.
+
+
Read more here: [Setting up a custom domain](https://docs.lovable.dev/features/custom-domain#custom-domain)
bun.lockb

This is a binary file and will not be displayed.

+20
components.json
···
+
{
+
"$schema": "https://ui.shadcn.com/schema.json",
+
"style": "default",
+
"rsc": false,
+
"tsx": true,
+
"tailwind": {
+
"config": "tailwind.config.ts",
+
"css": "src/index.css",
+
"baseColor": "slate",
+
"cssVariables": true,
+
"prefix": ""
+
},
+
"aliases": {
+
"components": "@/components",
+
"utils": "@/lib/utils",
+
"ui": "@/components/ui",
+
"lib": "@/lib",
+
"hooks": "@/hooks"
+
}
+
}
+26
eslint.config.js
···
+
import js from "@eslint/js";
+
import globals from "globals";
+
import reactHooks from "eslint-plugin-react-hooks";
+
import reactRefresh from "eslint-plugin-react-refresh";
+
import tseslint from "typescript-eslint";
+
+
export default tseslint.config(
+
{ ignores: ["dist"] },
+
{
+
extends: [js.configs.recommended, ...tseslint.configs.recommended],
+
files: ["**/*.{ts,tsx}"],
+
languageOptions: {
+
ecmaVersion: 2020,
+
globals: globals.browser,
+
},
+
plugins: {
+
"react-hooks": reactHooks,
+
"react-refresh": reactRefresh,
+
},
+
rules: {
+
...reactHooks.configs.recommended.rules,
+
"react-refresh/only-export-components": ["warn", { allowConstantExport: true }],
+
"@typescript-eslint/no-unused-vars": "off",
+
},
+
},
+
);
+24
index.html
···
+
<!doctype html>
+
<html lang="en">
+
<head>
+
<meta charset="UTF-8" />
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
<title>186e5104-4723-467c-a30c-826aab8e6c65</title>
+
<meta name="description" content="Lovable Generated Project" />
+
<meta name="author" content="Lovable" />
+
+
<meta property="og:title" content="186e5104-4723-467c-a30c-826aab8e6c65" />
+
<meta property="og:description" content="Lovable Generated Project" />
+
<meta property="og:type" content="website" />
+
<meta property="og:image" content="https://lovable.dev/opengraph-image-p98pqg.png" />
+
+
<meta name="twitter:card" content="summary_large_image" />
+
<meta name="twitter:site" content="@Lovable" />
+
<meta name="twitter:image" content="https://lovable.dev/opengraph-image-p98pqg.png" />
+
</head>
+
+
<body>
+
<div id="root"></div>
+
<script type="module" src="/src/main.tsx"></script>
+
</body>
+
</html>
+6766
package-lock.json
···
+
{
+
"name": "vite_react_shadcn_ts",
+
"version": "0.0.0",
+
"lockfileVersion": 3,
+
"requires": true,
+
"packages": {
+
"": {
+
"name": "vite_react_shadcn_ts",
+
"version": "0.0.0",
+
"dependencies": {
+
"@hookform/resolvers": "^3.10.0",
+
"@radix-ui/react-accordion": "^1.2.11",
+
"@radix-ui/react-alert-dialog": "^1.1.14",
+
"@radix-ui/react-aspect-ratio": "^1.1.7",
+
"@radix-ui/react-avatar": "^1.1.10",
+
"@radix-ui/react-checkbox": "^1.3.2",
+
"@radix-ui/react-collapsible": "^1.1.11",
+
"@radix-ui/react-context-menu": "^2.2.15",
+
"@radix-ui/react-dialog": "^1.1.14",
+
"@radix-ui/react-dropdown-menu": "^2.1.15",
+
"@radix-ui/react-hover-card": "^1.1.14",
+
"@radix-ui/react-label": "^2.1.7",
+
"@radix-ui/react-menubar": "^1.1.15",
+
"@radix-ui/react-navigation-menu": "^1.2.13",
+
"@radix-ui/react-popover": "^1.1.14",
+
"@radix-ui/react-progress": "^1.1.7",
+
"@radix-ui/react-radio-group": "^1.3.7",
+
"@radix-ui/react-scroll-area": "^1.2.9",
+
"@radix-ui/react-select": "^2.2.5",
+
"@radix-ui/react-separator": "^1.1.7",
+
"@radix-ui/react-slider": "^1.3.5",
+
"@radix-ui/react-slot": "^1.2.3",
+
"@radix-ui/react-switch": "^1.2.5",
+
"@radix-ui/react-tabs": "^1.1.12",
+
"@radix-ui/react-toast": "^1.2.14",
+
"@radix-ui/react-toggle": "^1.1.9",
+
"@radix-ui/react-toggle-group": "^1.1.10",
+
"@radix-ui/react-tooltip": "^1.2.7",
+
"@tanstack/react-query": "^5.83.0",
+
"class-variance-authority": "^0.7.1",
+
"clsx": "^2.1.1",
+
"cmdk": "^1.1.1",
+
"date-fns": "^3.6.0",
+
"embla-carousel-react": "^8.6.0",
+
"input-otp": "^1.4.2",
+
"lucide-react": "^0.462.0",
+
"next-themes": "^0.3.0",
+
"react": "^18.3.1",
+
"react-day-picker": "^8.10.1",
+
"react-dom": "^18.3.1",
+
"react-hook-form": "^7.61.1",
+
"react-resizable-panels": "^2.1.9",
+
"react-router-dom": "^6.30.1",
+
"recharts": "^2.15.4",
+
"sonner": "^1.7.4",
+
"tailwind-merge": "^2.6.0",
+
"tailwindcss-animate": "^1.0.7",
+
"vaul": "^0.9.9",
+
"zod": "^3.25.76"
+
},
+
"devDependencies": {
+
"@eslint/js": "^9.32.0",
+
"@tailwindcss/typography": "^0.5.16",
+
"@types/node": "^22.16.5",
+
"@types/react": "^18.3.23",
+
"@types/react-dom": "^18.3.7",
+
"@vitejs/plugin-react-swc": "^3.11.0",
+
"autoprefixer": "^10.4.21",
+
"eslint": "^9.32.0",
+
"eslint-plugin-react-hooks": "^5.2.0",
+
"eslint-plugin-react-refresh": "^0.4.20",
+
"globals": "^15.15.0",
+
"lovable-tagger": "^1.1.11",
+
"postcss": "^8.5.6",
+
"tailwindcss": "^3.4.17",
+
"typescript": "^5.8.3",
+
"typescript-eslint": "^8.38.0",
+
"vite": "^5.4.19"
+
}
+
},
+
"node_modules/@alloc/quick-lru": {
+
"version": "5.2.0",
+
"resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+
"integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/@babel/helper-string-parser": {
+
"version": "7.25.9",
+
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+
"integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/helper-validator-identifier": {
+
"version": "7.25.9",
+
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+
"integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/parser": {
+
"version": "7.25.9",
+
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.9.tgz",
+
"integrity": "sha512-aI3jjAAO1fh7vY/pBGsn1i9LDbRP43+asrRlkPuTXW5yHXtd1NgTEMudbBoDDxrf1daEEfPJqR+JBMakzrR4Dg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/types": "^7.25.9"
+
},
+
"bin": {
+
"parser": "bin/babel-parser.js"
+
},
+
"engines": {
+
"node": ">=6.0.0"
+
}
+
},
+
"node_modules/@babel/runtime": {
+
"version": "7.28.2",
+
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz",
+
"integrity": "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/types": {
+
"version": "7.25.9",
+
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.9.tgz",
+
"integrity": "sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/helper-string-parser": "^7.25.9",
+
"@babel/helper-validator-identifier": "^7.25.9"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@esbuild/aix-ppc64": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+
"integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+
"cpu": [
+
"ppc64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"aix"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/android-arm": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+
"integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+
"cpu": [
+
"arm"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"android"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/android-arm64": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+
"integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"android"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/android-x64": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+
"integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"android"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/darwin-arm64": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+
"integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/darwin-x64": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+
"integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/freebsd-arm64": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+
"integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"freebsd"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/freebsd-x64": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+
"integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"freebsd"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/linux-arm": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+
"integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+
"cpu": [
+
"arm"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/linux-arm64": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+
"integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/linux-ia32": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+
"integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+
"cpu": [
+
"ia32"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/linux-loong64": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+
"integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+
"cpu": [
+
"loong64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/linux-mips64el": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+
"integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+
"cpu": [
+
"mips64el"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/linux-ppc64": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+
"integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+
"cpu": [
+
"ppc64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/linux-riscv64": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+
"integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+
"cpu": [
+
"riscv64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/linux-s390x": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+
"integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+
"cpu": [
+
"s390x"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/linux-x64": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+
"integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/netbsd-arm64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz",
+
"integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"netbsd"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/@esbuild/netbsd-x64": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+
"integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"netbsd"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/openbsd-arm64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz",
+
"integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"openbsd"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/@esbuild/openbsd-x64": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+
"integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"openbsd"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/sunos-x64": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+
"integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"sunos"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/win32-arm64": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+
"integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"win32"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/win32-ia32": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+
"integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+
"cpu": [
+
"ia32"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"win32"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@esbuild/win32-x64": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+
"integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"win32"
+
],
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@eslint-community/eslint-utils": {
+
"version": "4.7.0",
+
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
+
"integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
+
"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.1",
+
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+
"integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+
}
+
},
+
"node_modules/@eslint/config-array": {
+
"version": "0.21.0",
+
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz",
+
"integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"dependencies": {
+
"@eslint/object-schema": "^2.1.6",
+
"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.3.0",
+
"resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz",
+
"integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
}
+
},
+
"node_modules/@eslint/core": {
+
"version": "0.15.1",
+
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz",
+
"integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==",
+
"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.1",
+
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+
"integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
+
"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.0",
+
"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.32.0",
+
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz",
+
"integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==",
+
"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.6",
+
"resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+
"integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
}
+
},
+
"node_modules/@eslint/plugin-kit": {
+
"version": "0.3.4",
+
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz",
+
"integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"dependencies": {
+
"@eslint/core": "^0.15.1",
+
"levn": "^0.4.1"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
}
+
},
+
"node_modules/@floating-ui/core": {
+
"version": "1.7.2",
+
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.2.tgz",
+
"integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==",
+
"license": "MIT",
+
"dependencies": {
+
"@floating-ui/utils": "^0.2.10"
+
}
+
},
+
"node_modules/@floating-ui/dom": {
+
"version": "1.7.2",
+
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.2.tgz",
+
"integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==",
+
"license": "MIT",
+
"dependencies": {
+
"@floating-ui/core": "^1.7.2",
+
"@floating-ui/utils": "^0.2.10"
+
}
+
},
+
"node_modules/@floating-ui/react-dom": {
+
"version": "2.1.4",
+
"resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.4.tgz",
+
"integrity": "sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==",
+
"license": "MIT",
+
"dependencies": {
+
"@floating-ui/dom": "^1.7.2"
+
},
+
"peerDependencies": {
+
"react": ">=16.8.0",
+
"react-dom": ">=16.8.0"
+
}
+
},
+
"node_modules/@floating-ui/utils": {
+
"version": "0.2.10",
+
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz",
+
"integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
+
"license": "MIT"
+
},
+
"node_modules/@hookform/resolvers": {
+
"version": "3.10.0",
+
"resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.10.0.tgz",
+
"integrity": "sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==",
+
"license": "MIT",
+
"peerDependencies": {
+
"react-hook-form": "^7.0.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.6",
+
"resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
+
"integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"dependencies": {
+
"@humanfs/core": "^0.19.1",
+
"@humanwhocodes/retry": "^0.3.0"
+
},
+
"engines": {
+
"node": ">=18.18.0"
+
}
+
},
+
"node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
+
"version": "0.3.1",
+
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
+
"integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": ">=18.18"
+
},
+
"funding": {
+
"type": "github",
+
"url": "https://github.com/sponsors/nzakas"
+
}
+
},
+
"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/@isaacs/cliui": {
+
"version": "8.0.2",
+
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+
"integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+
"license": "ISC",
+
"dependencies": {
+
"string-width": "^5.1.2",
+
"string-width-cjs": "npm:string-width@^4.2.0",
+
"strip-ansi": "^7.0.1",
+
"strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+
"wrap-ansi": "^8.1.0",
+
"wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+
},
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/@jridgewell/gen-mapping": {
+
"version": "0.3.5",
+
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+
"integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+
"license": "MIT",
+
"dependencies": {
+
"@jridgewell/set-array": "^1.2.1",
+
"@jridgewell/sourcemap-codec": "^1.4.10",
+
"@jridgewell/trace-mapping": "^0.3.24"
+
},
+
"engines": {
+
"node": ">=6.0.0"
+
}
+
},
+
"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/set-array": {
+
"version": "1.2.1",
+
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+
"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.0.0"
+
}
+
},
+
"node_modules/@jridgewell/sourcemap-codec": {
+
"version": "1.5.0",
+
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+
"license": "MIT"
+
},
+
"node_modules/@jridgewell/trace-mapping": {
+
"version": "0.3.25",
+
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+
"integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+
"license": "MIT",
+
"dependencies": {
+
"@jridgewell/resolve-uri": "^3.1.0",
+
"@jridgewell/sourcemap-codec": "^1.4.14"
+
}
+
},
+
"node_modules/@nodelib/fs.scandir": {
+
"version": "2.1.5",
+
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+
"license": "MIT",
+
"dependencies": {
+
"@nodelib/fs.stat": "2.0.5",
+
"run-parallel": "^1.1.9"
+
},
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/@nodelib/fs.stat": {
+
"version": "2.0.5",
+
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+
"license": "MIT",
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/@nodelib/fs.walk": {
+
"version": "1.2.8",
+
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+
"license": "MIT",
+
"dependencies": {
+
"@nodelib/fs.scandir": "2.1.5",
+
"fastq": "^1.6.0"
+
},
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/@pkgjs/parseargs": {
+
"version": "0.11.0",
+
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+
"integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+
"license": "MIT",
+
"optional": true,
+
"engines": {
+
"node": ">=14"
+
}
+
},
+
"node_modules/@radix-ui/number": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz",
+
"integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==",
+
"license": "MIT"
+
},
+
"node_modules/@radix-ui/primitive": {
+
"version": "1.1.2",
+
"resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz",
+
"integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==",
+
"license": "MIT"
+
},
+
"node_modules/@radix-ui/react-accordion": {
+
"version": "1.2.11",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.11.tgz",
+
"integrity": "sha512-l3W5D54emV2ues7jjeG1xcyN7S3jnK3zE2zHqgn0CmMsy9lNJwmgcrmaxS+7ipw15FAivzKNzH3d5EcGoFKw0A==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-collapsible": "1.1.11",
+
"@radix-ui/react-collection": "1.1.7",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-direction": "1.1.1",
+
"@radix-ui/react-id": "1.1.1",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-use-controllable-state": "1.2.2"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-alert-dialog": {
+
"version": "1.1.14",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.14.tgz",
+
"integrity": "sha512-IOZfZ3nPvN6lXpJTBCunFQPRSvK8MDgSc1FB85xnIpUKOw9en0dJj8JmCAxV7BiZdtYlUpmrQjoTFkVYtdoWzQ==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-dialog": "1.1.14",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-slot": "1.2.3"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-arrow": {
+
"version": "1.1.7",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz",
+
"integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-primitive": "2.1.3"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-aspect-ratio": {
+
"version": "1.1.7",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.7.tgz",
+
"integrity": "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-primitive": "2.1.3"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-avatar": {
+
"version": "1.1.10",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz",
+
"integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-use-callback-ref": "1.1.1",
+
"@radix-ui/react-use-is-hydrated": "0.1.0",
+
"@radix-ui/react-use-layout-effect": "1.1.1"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-checkbox": {
+
"version": "1.3.2",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.2.tgz",
+
"integrity": "sha512-yd+dI56KZqawxKZrJ31eENUwqc1QSqg4OZ15rybGjF2ZNwMO+wCyHzAVLRp9qoYJf7kYy0YpZ2b0JCzJ42HZpA==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-presence": "1.1.4",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-use-controllable-state": "1.2.2",
+
"@radix-ui/react-use-previous": "1.1.1",
+
"@radix-ui/react-use-size": "1.1.1"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-collapsible": {
+
"version": "1.1.11",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.11.tgz",
+
"integrity": "sha512-2qrRsVGSCYasSz1RFOorXwl0H7g7J1frQtgpQgYrt+MOidtPAINHn9CPovQXb83r8ahapdx3Tu0fa/pdFFSdPg==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-id": "1.1.1",
+
"@radix-ui/react-presence": "1.1.4",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-use-controllable-state": "1.2.2",
+
"@radix-ui/react-use-layout-effect": "1.1.1"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-collection": {
+
"version": "1.1.7",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz",
+
"integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-slot": "1.2.3"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-compose-refs": {
+
"version": "1.1.2",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
+
"integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
+
"license": "MIT",
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-context": {
+
"version": "1.1.2",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz",
+
"integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
+
"license": "MIT",
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-context-menu": {
+
"version": "2.2.15",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.15.tgz",
+
"integrity": "sha512-UsQUMjcYTsBjTSXw0P3GO0werEQvUY2plgRQuKoCTtkNr45q1DiL51j4m7gxhABzZ0BadoXNsIbg7F3KwiUBbw==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-menu": "2.1.15",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-use-callback-ref": "1.1.1",
+
"@radix-ui/react-use-controllable-state": "1.2.2"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-dialog": {
+
"version": "1.1.14",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.14.tgz",
+
"integrity": "sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-dismissable-layer": "1.1.10",
+
"@radix-ui/react-focus-guards": "1.1.2",
+
"@radix-ui/react-focus-scope": "1.1.7",
+
"@radix-ui/react-id": "1.1.1",
+
"@radix-ui/react-portal": "1.1.9",
+
"@radix-ui/react-presence": "1.1.4",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-slot": "1.2.3",
+
"@radix-ui/react-use-controllable-state": "1.2.2",
+
"aria-hidden": "^1.2.4",
+
"react-remove-scroll": "^2.6.3"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-direction": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz",
+
"integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==",
+
"license": "MIT",
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-dismissable-layer": {
+
"version": "1.1.10",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz",
+
"integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-use-callback-ref": "1.1.1",
+
"@radix-ui/react-use-escape-keydown": "1.1.1"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-dropdown-menu": {
+
"version": "2.1.15",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.15.tgz",
+
"integrity": "sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-id": "1.1.1",
+
"@radix-ui/react-menu": "2.1.15",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-use-controllable-state": "1.2.2"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-focus-guards": {
+
"version": "1.1.2",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz",
+
"integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==",
+
"license": "MIT",
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-focus-scope": {
+
"version": "1.1.7",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz",
+
"integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-use-callback-ref": "1.1.1"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-hover-card": {
+
"version": "1.1.14",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.14.tgz",
+
"integrity": "sha512-CPYZ24Mhirm+g6D8jArmLzjYu4Eyg3TTUHswR26QgzXBHBe64BO/RHOJKzmF/Dxb4y4f9PKyJdwm/O/AhNkb+Q==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-dismissable-layer": "1.1.10",
+
"@radix-ui/react-popper": "1.2.7",
+
"@radix-ui/react-portal": "1.1.9",
+
"@radix-ui/react-presence": "1.1.4",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-use-controllable-state": "1.2.2"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-id": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz",
+
"integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-use-layout-effect": "1.1.1"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-label": {
+
"version": "2.1.7",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz",
+
"integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-primitive": "2.1.3"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-menu": {
+
"version": "2.1.15",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.15.tgz",
+
"integrity": "sha512-tVlmA3Vb9n8SZSd+YSbuFR66l87Wiy4du+YE+0hzKQEANA+7cWKH1WgqcEX4pXqxUFQKrWQGHdvEfw00TjFiew==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-collection": "1.1.7",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-direction": "1.1.1",
+
"@radix-ui/react-dismissable-layer": "1.1.10",
+
"@radix-ui/react-focus-guards": "1.1.2",
+
"@radix-ui/react-focus-scope": "1.1.7",
+
"@radix-ui/react-id": "1.1.1",
+
"@radix-ui/react-popper": "1.2.7",
+
"@radix-ui/react-portal": "1.1.9",
+
"@radix-ui/react-presence": "1.1.4",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-roving-focus": "1.1.10",
+
"@radix-ui/react-slot": "1.2.3",
+
"@radix-ui/react-use-callback-ref": "1.1.1",
+
"aria-hidden": "^1.2.4",
+
"react-remove-scroll": "^2.6.3"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-menubar": {
+
"version": "1.1.15",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.15.tgz",
+
"integrity": "sha512-Z71C7LGD+YDYo3TV81paUs8f3Zbmkvg6VLRQpKYfzioOE6n7fOhA3ApK/V/2Odolxjoc4ENk8AYCjohCNayd5A==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-collection": "1.1.7",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-direction": "1.1.1",
+
"@radix-ui/react-id": "1.1.1",
+
"@radix-ui/react-menu": "2.1.15",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-roving-focus": "1.1.10",
+
"@radix-ui/react-use-controllable-state": "1.2.2"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-navigation-menu": {
+
"version": "1.2.13",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.13.tgz",
+
"integrity": "sha512-WG8wWfDiJlSF5hELjwfjSGOXcBR/ZMhBFCGYe8vERpC39CQYZeq1PQ2kaYHdye3V95d06H89KGMsVCIE4LWo3g==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-collection": "1.1.7",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-direction": "1.1.1",
+
"@radix-ui/react-dismissable-layer": "1.1.10",
+
"@radix-ui/react-id": "1.1.1",
+
"@radix-ui/react-presence": "1.1.4",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-use-callback-ref": "1.1.1",
+
"@radix-ui/react-use-controllable-state": "1.2.2",
+
"@radix-ui/react-use-layout-effect": "1.1.1",
+
"@radix-ui/react-use-previous": "1.1.1",
+
"@radix-ui/react-visually-hidden": "1.2.3"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-popover": {
+
"version": "1.1.14",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.14.tgz",
+
"integrity": "sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-dismissable-layer": "1.1.10",
+
"@radix-ui/react-focus-guards": "1.1.2",
+
"@radix-ui/react-focus-scope": "1.1.7",
+
"@radix-ui/react-id": "1.1.1",
+
"@radix-ui/react-popper": "1.2.7",
+
"@radix-ui/react-portal": "1.1.9",
+
"@radix-ui/react-presence": "1.1.4",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-slot": "1.2.3",
+
"@radix-ui/react-use-controllable-state": "1.2.2",
+
"aria-hidden": "^1.2.4",
+
"react-remove-scroll": "^2.6.3"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-popper": {
+
"version": "1.2.7",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz",
+
"integrity": "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==",
+
"license": "MIT",
+
"dependencies": {
+
"@floating-ui/react-dom": "^2.0.0",
+
"@radix-ui/react-arrow": "1.1.7",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-use-callback-ref": "1.1.1",
+
"@radix-ui/react-use-layout-effect": "1.1.1",
+
"@radix-ui/react-use-rect": "1.1.1",
+
"@radix-ui/react-use-size": "1.1.1",
+
"@radix-ui/rect": "1.1.1"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-portal": {
+
"version": "1.1.9",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz",
+
"integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-use-layout-effect": "1.1.1"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-presence": {
+
"version": "1.1.4",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz",
+
"integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-use-layout-effect": "1.1.1"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-primitive": {
+
"version": "2.1.3",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz",
+
"integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-slot": "1.2.3"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-progress": {
+
"version": "1.1.7",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz",
+
"integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-primitive": "2.1.3"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-radio-group": {
+
"version": "1.3.7",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.7.tgz",
+
"integrity": "sha512-9w5XhD0KPOrm92OTTE0SysH3sYzHsSTHNvZgUBo/VZ80VdYyB5RneDbc0dKpURS24IxkoFRu/hI0i4XyfFwY6g==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-direction": "1.1.1",
+
"@radix-ui/react-presence": "1.1.4",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-roving-focus": "1.1.10",
+
"@radix-ui/react-use-controllable-state": "1.2.2",
+
"@radix-ui/react-use-previous": "1.1.1",
+
"@radix-ui/react-use-size": "1.1.1"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-roving-focus": {
+
"version": "1.1.10",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.10.tgz",
+
"integrity": "sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-collection": "1.1.7",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-direction": "1.1.1",
+
"@radix-ui/react-id": "1.1.1",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-use-callback-ref": "1.1.1",
+
"@radix-ui/react-use-controllable-state": "1.2.2"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-scroll-area": {
+
"version": "1.2.9",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.9.tgz",
+
"integrity": "sha512-YSjEfBXnhUELsO2VzjdtYYD4CfQjvao+lhhrX5XsHD7/cyUNzljF1FHEbgTPN7LH2MClfwRMIsYlqTYpKTTe2A==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/number": "1.1.1",
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-direction": "1.1.1",
+
"@radix-ui/react-presence": "1.1.4",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-use-callback-ref": "1.1.1",
+
"@radix-ui/react-use-layout-effect": "1.1.1"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-select": {
+
"version": "2.2.5",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.5.tgz",
+
"integrity": "sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/number": "1.1.1",
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-collection": "1.1.7",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-direction": "1.1.1",
+
"@radix-ui/react-dismissable-layer": "1.1.10",
+
"@radix-ui/react-focus-guards": "1.1.2",
+
"@radix-ui/react-focus-scope": "1.1.7",
+
"@radix-ui/react-id": "1.1.1",
+
"@radix-ui/react-popper": "1.2.7",
+
"@radix-ui/react-portal": "1.1.9",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-slot": "1.2.3",
+
"@radix-ui/react-use-callback-ref": "1.1.1",
+
"@radix-ui/react-use-controllable-state": "1.2.2",
+
"@radix-ui/react-use-layout-effect": "1.1.1",
+
"@radix-ui/react-use-previous": "1.1.1",
+
"@radix-ui/react-visually-hidden": "1.2.3",
+
"aria-hidden": "^1.2.4",
+
"react-remove-scroll": "^2.6.3"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-separator": {
+
"version": "1.1.7",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz",
+
"integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-primitive": "2.1.3"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-slider": {
+
"version": "1.3.5",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.5.tgz",
+
"integrity": "sha512-rkfe2pU2NBAYfGaxa3Mqosi7VZEWX5CxKaanRv0vZd4Zhl9fvQrg0VM93dv3xGLGfrHuoTRF3JXH8nb9g+B3fw==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/number": "1.1.1",
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-collection": "1.1.7",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-direction": "1.1.1",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-use-controllable-state": "1.2.2",
+
"@radix-ui/react-use-layout-effect": "1.1.1",
+
"@radix-ui/react-use-previous": "1.1.1",
+
"@radix-ui/react-use-size": "1.1.1"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-slot": {
+
"version": "1.2.3",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
+
"integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-compose-refs": "1.1.2"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-switch": {
+
"version": "1.2.5",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.5.tgz",
+
"integrity": "sha512-5ijLkak6ZMylXsaImpZ8u4Rlf5grRmoc0p0QeX9VJtlrM4f5m3nCTX8tWga/zOA8PZYIR/t0p2Mnvd7InrJ6yQ==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-use-controllable-state": "1.2.2",
+
"@radix-ui/react-use-previous": "1.1.1",
+
"@radix-ui/react-use-size": "1.1.1"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-tabs": {
+
"version": "1.1.12",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.12.tgz",
+
"integrity": "sha512-GTVAlRVrQrSw3cEARM0nAx73ixrWDPNZAruETn3oHCNP6SbZ/hNxdxp+u7VkIEv3/sFoLq1PfcHrl7Pnp0CDpw==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-direction": "1.1.1",
+
"@radix-ui/react-id": "1.1.1",
+
"@radix-ui/react-presence": "1.1.4",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-roving-focus": "1.1.10",
+
"@radix-ui/react-use-controllable-state": "1.2.2"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-toast": {
+
"version": "1.2.14",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.14.tgz",
+
"integrity": "sha512-nAP5FBxBJGQ/YfUB+r+O6USFVkWq3gAInkxyEnmvEV5jtSbfDhfa4hwX8CraCnbjMLsE7XSf/K75l9xXY7joWg==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-collection": "1.1.7",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-dismissable-layer": "1.1.10",
+
"@radix-ui/react-portal": "1.1.9",
+
"@radix-ui/react-presence": "1.1.4",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-use-callback-ref": "1.1.1",
+
"@radix-ui/react-use-controllable-state": "1.2.2",
+
"@radix-ui/react-use-layout-effect": "1.1.1",
+
"@radix-ui/react-visually-hidden": "1.2.3"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-toggle": {
+
"version": "1.1.9",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.9.tgz",
+
"integrity": "sha512-ZoFkBBz9zv9GWer7wIjvdRxmh2wyc2oKWw6C6CseWd6/yq1DK/l5lJ+wnsmFwJZbBYqr02mrf8A2q/CVCuM3ZA==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-use-controllable-state": "1.2.2"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-toggle-group": {
+
"version": "1.1.10",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.10.tgz",
+
"integrity": "sha512-kiU694Km3WFLTC75DdqgM/3Jauf3rD9wxeS9XtyWFKsBUeZA337lC+6uUazT7I1DhanZ5gyD5Stf8uf2dbQxOQ==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-direction": "1.1.1",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-roving-focus": "1.1.10",
+
"@radix-ui/react-toggle": "1.1.9",
+
"@radix-ui/react-use-controllable-state": "1.2.2"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-tooltip": {
+
"version": "1.2.7",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.7.tgz",
+
"integrity": "sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/primitive": "1.1.2",
+
"@radix-ui/react-compose-refs": "1.1.2",
+
"@radix-ui/react-context": "1.1.2",
+
"@radix-ui/react-dismissable-layer": "1.1.10",
+
"@radix-ui/react-id": "1.1.1",
+
"@radix-ui/react-popper": "1.2.7",
+
"@radix-ui/react-portal": "1.1.9",
+
"@radix-ui/react-presence": "1.1.4",
+
"@radix-ui/react-primitive": "2.1.3",
+
"@radix-ui/react-slot": "1.2.3",
+
"@radix-ui/react-use-controllable-state": "1.2.2",
+
"@radix-ui/react-visually-hidden": "1.2.3"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-use-callback-ref": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
+
"integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==",
+
"license": "MIT",
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-use-controllable-state": {
+
"version": "1.2.2",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz",
+
"integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-use-effect-event": "0.0.2",
+
"@radix-ui/react-use-layout-effect": "1.1.1"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-use-effect-event": {
+
"version": "0.0.2",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz",
+
"integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-use-layout-effect": "1.1.1"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-use-escape-keydown": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz",
+
"integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-use-callback-ref": "1.1.1"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-use-is-hydrated": {
+
"version": "0.1.0",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz",
+
"integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==",
+
"license": "MIT",
+
"dependencies": {
+
"use-sync-external-store": "^1.5.0"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-use-layout-effect": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
+
"integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
+
"license": "MIT",
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-use-previous": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz",
+
"integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==",
+
"license": "MIT",
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-use-rect": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz",
+
"integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/rect": "1.1.1"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-use-size": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz",
+
"integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-use-layout-effect": "1.1.1"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/react-visually-hidden": {
+
"version": "1.2.3",
+
"resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz",
+
"integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-primitive": "2.1.3"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"@types/react-dom": "*",
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
},
+
"@types/react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@radix-ui/rect": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz",
+
"integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==",
+
"license": "MIT"
+
},
+
"node_modules/@remix-run/router": {
+
"version": "1.23.0",
+
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz",
+
"integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=14.0.0"
+
}
+
},
+
"node_modules/@rolldown/pluginutils": {
+
"version": "1.0.0-beta.27",
+
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
+
"integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/@rollup/rollup-android-arm-eabi": {
+
"version": "4.24.0",
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz",
+
"integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==",
+
"cpu": [
+
"arm"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"android"
+
]
+
},
+
"node_modules/@rollup/rollup-android-arm64": {
+
"version": "4.24.0",
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz",
+
"integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"android"
+
]
+
},
+
"node_modules/@rollup/rollup-darwin-arm64": {
+
"version": "4.24.0",
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz",
+
"integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"darwin"
+
]
+
},
+
"node_modules/@rollup/rollup-darwin-x64": {
+
"version": "4.24.0",
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz",
+
"integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"darwin"
+
]
+
},
+
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+
"version": "4.24.0",
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz",
+
"integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==",
+
"cpu": [
+
"arm"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
]
+
},
+
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
+
"version": "4.24.0",
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz",
+
"integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==",
+
"cpu": [
+
"arm"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
]
+
},
+
"node_modules/@rollup/rollup-linux-arm64-gnu": {
+
"version": "4.24.0",
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz",
+
"integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
]
+
},
+
"node_modules/@rollup/rollup-linux-arm64-musl": {
+
"version": "4.24.0",
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz",
+
"integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
]
+
},
+
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+
"version": "4.24.0",
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz",
+
"integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==",
+
"cpu": [
+
"ppc64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
]
+
},
+
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
+
"version": "4.24.0",
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz",
+
"integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==",
+
"cpu": [
+
"riscv64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
]
+
},
+
"node_modules/@rollup/rollup-linux-s390x-gnu": {
+
"version": "4.24.0",
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz",
+
"integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==",
+
"cpu": [
+
"s390x"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
]
+
},
+
"node_modules/@rollup/rollup-linux-x64-gnu": {
+
"version": "4.24.0",
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz",
+
"integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
]
+
},
+
"node_modules/@rollup/rollup-linux-x64-musl": {
+
"version": "4.24.0",
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz",
+
"integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
]
+
},
+
"node_modules/@rollup/rollup-win32-arm64-msvc": {
+
"version": "4.24.0",
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz",
+
"integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"win32"
+
]
+
},
+
"node_modules/@rollup/rollup-win32-ia32-msvc": {
+
"version": "4.24.0",
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz",
+
"integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==",
+
"cpu": [
+
"ia32"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"win32"
+
]
+
},
+
"node_modules/@rollup/rollup-win32-x64-msvc": {
+
"version": "4.24.0",
+
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz",
+
"integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"win32"
+
]
+
},
+
"node_modules/@swc/core": {
+
"version": "1.13.2",
+
"resolved": "https://registry.npmjs.org/@swc/core/-/core-1.13.2.tgz",
+
"integrity": "sha512-YWqn+0IKXDhqVLKoac4v2tV6hJqB/wOh8/Br8zjqeqBkKa77Qb0Kw2i7LOFzjFNZbZaPH6AlMGlBwNrxaauaAg==",
+
"dev": true,
+
"hasInstallScript": true,
+
"license": "Apache-2.0",
+
"dependencies": {
+
"@swc/counter": "^0.1.3",
+
"@swc/types": "^0.1.23"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/swc"
+
},
+
"optionalDependencies": {
+
"@swc/core-darwin-arm64": "1.13.2",
+
"@swc/core-darwin-x64": "1.13.2",
+
"@swc/core-linux-arm-gnueabihf": "1.13.2",
+
"@swc/core-linux-arm64-gnu": "1.13.2",
+
"@swc/core-linux-arm64-musl": "1.13.2",
+
"@swc/core-linux-x64-gnu": "1.13.2",
+
"@swc/core-linux-x64-musl": "1.13.2",
+
"@swc/core-win32-arm64-msvc": "1.13.2",
+
"@swc/core-win32-ia32-msvc": "1.13.2",
+
"@swc/core-win32-x64-msvc": "1.13.2"
+
},
+
"peerDependencies": {
+
"@swc/helpers": ">=0.5.17"
+
},
+
"peerDependenciesMeta": {
+
"@swc/helpers": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@swc/core-darwin-arm64": {
+
"version": "1.13.2",
+
"resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.13.2.tgz",
+
"integrity": "sha512-44p7ivuLSGFJ15Vly4ivLJjg3ARo4879LtEBAabcHhSZygpmkP8eyjyWxrH3OxkY1eRZSIJe8yRZPFw4kPXFPw==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "Apache-2.0 AND MIT",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": ">=10"
+
}
+
},
+
"node_modules/@swc/core-darwin-x64": {
+
"version": "1.13.2",
+
"resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.13.2.tgz",
+
"integrity": "sha512-Lb9EZi7X2XDAVmuUlBm2UvVAgSCbD3qKqDCxSI4jEOddzVOpNCnyZ/xEampdngUIyDDhhJLYU9duC+Mcsv5Y+A==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "Apache-2.0 AND MIT",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": ">=10"
+
}
+
},
+
"node_modules/@swc/core-linux-arm-gnueabihf": {
+
"version": "1.13.2",
+
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.13.2.tgz",
+
"integrity": "sha512-9TDe/92ee1x57x+0OqL1huG4BeljVx0nWW4QOOxp8CCK67Rpc/HHl2wciJ0Kl9Dxf2NvpNtkPvqj9+BUmM9WVA==",
+
"cpu": [
+
"arm"
+
],
+
"dev": true,
+
"license": "Apache-2.0",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=10"
+
}
+
},
+
"node_modules/@swc/core-linux-arm64-gnu": {
+
"version": "1.13.2",
+
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.13.2.tgz",
+
"integrity": "sha512-KJUSl56DBk7AWMAIEcU83zl5mg3vlQYhLELhjwRFkGFMvghQvdqQ3zFOYa4TexKA7noBZa3C8fb24rI5sw9Exg==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "Apache-2.0 AND MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=10"
+
}
+
},
+
"node_modules/@swc/core-linux-arm64-musl": {
+
"version": "1.13.2",
+
"resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.13.2.tgz",
+
"integrity": "sha512-teU27iG1oyWpNh9CzcGQ48ClDRt/RCem7mYO7ehd2FY102UeTws2+OzLESS1TS1tEZipq/5xwx3FzbVgiolCiQ==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "Apache-2.0 AND MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=10"
+
}
+
},
+
"node_modules/@swc/core-linux-x64-gnu": {
+
"version": "1.13.2",
+
"resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.13.2.tgz",
+
"integrity": "sha512-dRPsyPyqpLD0HMRCRpYALIh4kdOir8pPg4AhNQZLehKowigRd30RcLXGNVZcc31Ua8CiPI4QSgjOIxK+EQe4LQ==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "Apache-2.0 AND MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=10"
+
}
+
},
+
"node_modules/@swc/core-linux-x64-musl": {
+
"version": "1.13.2",
+
"resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.13.2.tgz",
+
"integrity": "sha512-CCxETW+KkYEQDqz1SYC15YIWYheqFC+PJVOW76Maa/8yu8Biw+HTAcblKf2isrlUtK8RvrQN94v3UXkC2NzCEw==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "Apache-2.0 AND MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=10"
+
}
+
},
+
"node_modules/@swc/core-win32-arm64-msvc": {
+
"version": "1.13.2",
+
"resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.13.2.tgz",
+
"integrity": "sha512-Wv/QTA6PjyRLlmKcN6AmSI4jwSMRl0VTLGs57PHTqYRwwfwd7y4s2fIPJVBNbAlXd795dOEP6d/bGSQSyhOX3A==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "Apache-2.0 AND MIT",
+
"optional": true,
+
"os": [
+
"win32"
+
],
+
"engines": {
+
"node": ">=10"
+
}
+
},
+
"node_modules/@swc/core-win32-ia32-msvc": {
+
"version": "1.13.2",
+
"resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.13.2.tgz",
+
"integrity": "sha512-PuCdtNynEkUNbUXX/wsyUC+t4mamIU5y00lT5vJcAvco3/r16Iaxl5UCzhXYaWZSNVZMzPp9qN8NlSL8M5pPxw==",
+
"cpu": [
+
"ia32"
+
],
+
"dev": true,
+
"license": "Apache-2.0 AND MIT",
+
"optional": true,
+
"os": [
+
"win32"
+
],
+
"engines": {
+
"node": ">=10"
+
}
+
},
+
"node_modules/@swc/core-win32-x64-msvc": {
+
"version": "1.13.2",
+
"resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.13.2.tgz",
+
"integrity": "sha512-qlmMkFZJus8cYuBURx1a3YAG2G7IW44i+FEYV5/32ylKkzGNAr9tDJSA53XNnNXkAB5EXSPsOz7bn5C3JlEtdQ==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "Apache-2.0 AND MIT",
+
"optional": true,
+
"os": [
+
"win32"
+
],
+
"engines": {
+
"node": ">=10"
+
}
+
},
+
"node_modules/@swc/counter": {
+
"version": "0.1.3",
+
"resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
+
"integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
+
"dev": true,
+
"license": "Apache-2.0"
+
},
+
"node_modules/@swc/types": {
+
"version": "0.1.23",
+
"resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.23.tgz",
+
"integrity": "sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"dependencies": {
+
"@swc/counter": "^0.1.3"
+
}
+
},
+
"node_modules/@tailwindcss/typography": {
+
"version": "0.5.16",
+
"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz",
+
"integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"lodash.castarray": "^4.4.0",
+
"lodash.isplainobject": "^4.0.6",
+
"lodash.merge": "^4.6.2",
+
"postcss-selector-parser": "6.0.10"
+
},
+
"peerDependencies": {
+
"tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1"
+
}
+
},
+
"node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": {
+
"version": "6.0.10",
+
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+
"integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+
"dev": true,
+
"dependencies": {
+
"cssesc": "^3.0.0",
+
"util-deprecate": "^1.0.2"
+
},
+
"engines": {
+
"node": ">=4"
+
}
+
},
+
"node_modules/@tanstack/query-core": {
+
"version": "5.83.0",
+
"resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.83.0.tgz",
+
"integrity": "sha512-0M8dA+amXUkyz5cVUm/B+zSk3xkQAcuXuz5/Q/LveT4ots2rBpPTZOzd7yJa2Utsf8D2Upl5KyjhHRY+9lB/XA==",
+
"license": "MIT",
+
"funding": {
+
"type": "github",
+
"url": "https://github.com/sponsors/tannerlinsley"
+
}
+
},
+
"node_modules/@tanstack/react-query": {
+
"version": "5.83.0",
+
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.83.0.tgz",
+
"integrity": "sha512-/XGYhZ3foc5H0VM2jLSD/NyBRIOK4q9kfeml4+0x2DlL6xVuAcVEW+hTlTapAmejObg0i3eNqhkr2dT+eciwoQ==",
+
"license": "MIT",
+
"dependencies": {
+
"@tanstack/query-core": "5.83.0"
+
},
+
"funding": {
+
"type": "github",
+
"url": "https://github.com/sponsors/tannerlinsley"
+
},
+
"peerDependencies": {
+
"react": "^18 || ^19"
+
}
+
},
+
"node_modules/@types/d3-array": {
+
"version": "3.2.1",
+
"resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz",
+
"integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==",
+
"license": "MIT"
+
},
+
"node_modules/@types/d3-color": {
+
"version": "3.1.3",
+
"resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
+
"integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",
+
"license": "MIT"
+
},
+
"node_modules/@types/d3-ease": {
+
"version": "3.0.2",
+
"resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
+
"integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",
+
"license": "MIT"
+
},
+
"node_modules/@types/d3-interpolate": {
+
"version": "3.0.4",
+
"resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
+
"integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
+
"license": "MIT",
+
"dependencies": {
+
"@types/d3-color": "*"
+
}
+
},
+
"node_modules/@types/d3-path": {
+
"version": "3.1.0",
+
"resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz",
+
"integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==",
+
"license": "MIT"
+
},
+
"node_modules/@types/d3-scale": {
+
"version": "4.0.8",
+
"resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz",
+
"integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==",
+
"license": "MIT",
+
"dependencies": {
+
"@types/d3-time": "*"
+
}
+
},
+
"node_modules/@types/d3-shape": {
+
"version": "3.1.6",
+
"resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz",
+
"integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==",
+
"license": "MIT",
+
"dependencies": {
+
"@types/d3-path": "*"
+
}
+
},
+
"node_modules/@types/d3-time": {
+
"version": "3.0.3",
+
"resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz",
+
"integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==",
+
"license": "MIT"
+
},
+
"node_modules/@types/d3-timer": {
+
"version": "3.0.2",
+
"resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
+
"integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
+
"license": "MIT"
+
},
+
"node_modules/@types/estree": {
+
"version": "1.0.6",
+
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+
"integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+
"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/node": {
+
"version": "22.16.5",
+
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.5.tgz",
+
"integrity": "sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"undici-types": "~6.21.0"
+
}
+
},
+
"node_modules/@types/prop-types": {
+
"version": "15.7.13",
+
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz",
+
"integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==",
+
"devOptional": true,
+
"license": "MIT"
+
},
+
"node_modules/@types/react": {
+
"version": "18.3.23",
+
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz",
+
"integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==",
+
"devOptional": true,
+
"license": "MIT",
+
"dependencies": {
+
"@types/prop-types": "*",
+
"csstype": "^3.0.2"
+
}
+
},
+
"node_modules/@types/react-dom": {
+
"version": "18.3.7",
+
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
+
"integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
+
"devOptional": true,
+
"license": "MIT",
+
"peerDependencies": {
+
"@types/react": "^18.0.0"
+
}
+
},
+
"node_modules/@typescript-eslint/eslint-plugin": {
+
"version": "8.38.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz",
+
"integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@eslint-community/regexpp": "^4.10.0",
+
"@typescript-eslint/scope-manager": "8.38.0",
+
"@typescript-eslint/type-utils": "8.38.0",
+
"@typescript-eslint/utils": "8.38.0",
+
"@typescript-eslint/visitor-keys": "8.38.0",
+
"graphemer": "^1.4.0",
+
"ignore": "^7.0.0",
+
"natural-compare": "^1.4.0",
+
"ts-api-utils": "^2.1.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"@typescript-eslint/parser": "^8.38.0",
+
"eslint": "^8.57.0 || ^9.0.0",
+
"typescript": ">=4.8.4 <5.9.0"
+
}
+
},
+
"node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+
"version": "7.0.5",
+
"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+
"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">= 4"
+
}
+
},
+
"node_modules/@typescript-eslint/parser": {
+
"version": "8.38.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz",
+
"integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/scope-manager": "8.38.0",
+
"@typescript-eslint/types": "8.38.0",
+
"@typescript-eslint/typescript-estree": "8.38.0",
+
"@typescript-eslint/visitor-keys": "8.38.0",
+
"debug": "^4.3.4"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"eslint": "^8.57.0 || ^9.0.0",
+
"typescript": ">=4.8.4 <5.9.0"
+
}
+
},
+
"node_modules/@typescript-eslint/project-service": {
+
"version": "8.38.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz",
+
"integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/tsconfig-utils": "^8.38.0",
+
"@typescript-eslint/types": "^8.38.0",
+
"debug": "^4.3.4"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"typescript": ">=4.8.4 <5.9.0"
+
}
+
},
+
"node_modules/@typescript-eslint/scope-manager": {
+
"version": "8.38.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz",
+
"integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/types": "8.38.0",
+
"@typescript-eslint/visitor-keys": "8.38.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
}
+
},
+
"node_modules/@typescript-eslint/tsconfig-utils": {
+
"version": "8.38.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz",
+
"integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"typescript": ">=4.8.4 <5.9.0"
+
}
+
},
+
"node_modules/@typescript-eslint/type-utils": {
+
"version": "8.38.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz",
+
"integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/types": "8.38.0",
+
"@typescript-eslint/typescript-estree": "8.38.0",
+
"@typescript-eslint/utils": "8.38.0",
+
"debug": "^4.3.4",
+
"ts-api-utils": "^2.1.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"eslint": "^8.57.0 || ^9.0.0",
+
"typescript": ">=4.8.4 <5.9.0"
+
}
+
},
+
"node_modules/@typescript-eslint/types": {
+
"version": "8.38.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
+
"integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
}
+
},
+
"node_modules/@typescript-eslint/typescript-estree": {
+
"version": "8.38.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz",
+
"integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/project-service": "8.38.0",
+
"@typescript-eslint/tsconfig-utils": "8.38.0",
+
"@typescript-eslint/types": "8.38.0",
+
"@typescript-eslint/visitor-keys": "8.38.0",
+
"debug": "^4.3.4",
+
"fast-glob": "^3.3.2",
+
"is-glob": "^4.0.3",
+
"minimatch": "^9.0.4",
+
"semver": "^7.6.0",
+
"ts-api-utils": "^2.1.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"typescript": ">=4.8.4 <5.9.0"
+
}
+
},
+
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+
"version": "2.0.2",
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"balanced-match": "^1.0.0"
+
}
+
},
+
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+
"version": "9.0.5",
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+
"dev": true,
+
"license": "ISC",
+
"dependencies": {
+
"brace-expansion": "^2.0.1"
+
},
+
"engines": {
+
"node": ">=16 || 14 >=14.17"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/isaacs"
+
}
+
},
+
"node_modules/@typescript-eslint/utils": {
+
"version": "8.38.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz",
+
"integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@eslint-community/eslint-utils": "^4.7.0",
+
"@typescript-eslint/scope-manager": "8.38.0",
+
"@typescript-eslint/types": "8.38.0",
+
"@typescript-eslint/typescript-estree": "8.38.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"eslint": "^8.57.0 || ^9.0.0",
+
"typescript": ">=4.8.4 <5.9.0"
+
}
+
},
+
"node_modules/@typescript-eslint/visitor-keys": {
+
"version": "8.38.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz",
+
"integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/types": "8.38.0",
+
"eslint-visitor-keys": "^4.2.1"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
}
+
},
+
"node_modules/@vitejs/plugin-react-swc": {
+
"version": "3.11.0",
+
"resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.11.0.tgz",
+
"integrity": "sha512-YTJCGFdNMHCMfjODYtxRNVAYmTWQ1Lb8PulP/2/f/oEEtglw8oKxKIZmmRkyXrVrHfsKOaVkAc3NT9/dMutO5w==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@rolldown/pluginutils": "1.0.0-beta.27",
+
"@swc/core": "^1.12.11"
+
},
+
"peerDependencies": {
+
"vite": "^4 || ^5 || ^6 || ^7"
+
}
+
},
+
"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",
+
"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-regex": {
+
"version": "6.1.0",
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=12"
+
},
+
"funding": {
+
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
+
}
+
},
+
"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==",
+
"license": "MIT",
+
"dependencies": {
+
"color-convert": "^2.0.1"
+
},
+
"engines": {
+
"node": ">=8"
+
},
+
"funding": {
+
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
+
}
+
},
+
"node_modules/any-promise": {
+
"version": "1.3.0",
+
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+
"integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+
"license": "MIT"
+
},
+
"node_modules/anymatch": {
+
"version": "3.1.3",
+
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+
"license": "ISC",
+
"dependencies": {
+
"normalize-path": "^3.0.0",
+
"picomatch": "^2.0.4"
+
},
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/arg": {
+
"version": "5.0.2",
+
"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+
"integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+
"license": "MIT"
+
},
+
"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/aria-hidden": {
+
"version": "1.2.4",
+
"resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz",
+
"integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==",
+
"license": "MIT",
+
"dependencies": {
+
"tslib": "^2.0.0"
+
},
+
"engines": {
+
"node": ">=10"
+
}
+
},
+
"node_modules/autoprefixer": {
+
"version": "10.4.21",
+
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
+
"integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
+
"dev": true,
+
"funding": [
+
{
+
"type": "opencollective",
+
"url": "https://opencollective.com/postcss/"
+
},
+
{
+
"type": "tidelift",
+
"url": "https://tidelift.com/funding/github/npm/autoprefixer"
+
},
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "MIT",
+
"dependencies": {
+
"browserslist": "^4.24.4",
+
"caniuse-lite": "^1.0.30001702",
+
"fraction.js": "^4.3.7",
+
"normalize-range": "^0.1.2",
+
"picocolors": "^1.1.1",
+
"postcss-value-parser": "^4.2.0"
+
},
+
"bin": {
+
"autoprefixer": "bin/autoprefixer"
+
},
+
"engines": {
+
"node": "^10 || ^12 || >=14"
+
},
+
"peerDependencies": {
+
"postcss": "^8.1.0"
+
}
+
},
+
"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==",
+
"license": "MIT"
+
},
+
"node_modules/binary-extensions": {
+
"version": "2.3.0",
+
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+
"integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"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/braces": {
+
"version": "3.0.3",
+
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+
"license": "MIT",
+
"dependencies": {
+
"fill-range": "^7.1.1"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/browserslist": {
+
"version": "4.25.1",
+
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz",
+
"integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==",
+
"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": {
+
"caniuse-lite": "^1.0.30001726",
+
"electron-to-chromium": "^1.5.173",
+
"node-releases": "^2.0.19",
+
"update-browserslist-db": "^1.1.3"
+
},
+
"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==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/camelcase-css": {
+
"version": "2.0.1",
+
"resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+
"integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+
"license": "MIT",
+
"engines": {
+
"node": ">= 6"
+
}
+
},
+
"node_modules/caniuse-lite": {
+
"version": "1.0.30001727",
+
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz",
+
"integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==",
+
"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/chokidar": {
+
"version": "3.6.0",
+
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+
"license": "MIT",
+
"dependencies": {
+
"anymatch": "~3.1.2",
+
"braces": "~3.0.2",
+
"glob-parent": "~5.1.2",
+
"is-binary-path": "~2.1.0",
+
"is-glob": "~4.0.1",
+
"normalize-path": "~3.0.0",
+
"readdirp": "~3.6.0"
+
},
+
"engines": {
+
"node": ">= 8.10.0"
+
},
+
"funding": {
+
"url": "https://paulmillr.com/funding/"
+
},
+
"optionalDependencies": {
+
"fsevents": "~2.3.2"
+
}
+
},
+
"node_modules/chokidar/node_modules/glob-parent": {
+
"version": "5.1.2",
+
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+
"license": "ISC",
+
"dependencies": {
+
"is-glob": "^4.0.1"
+
},
+
"engines": {
+
"node": ">= 6"
+
}
+
},
+
"node_modules/class-variance-authority": {
+
"version": "0.7.1",
+
"resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
+
"integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
+
"dependencies": {
+
"clsx": "^2.1.1"
+
},
+
"funding": {
+
"url": "https://polar.sh/cva"
+
}
+
},
+
"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/cmdk": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz",
+
"integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-compose-refs": "^1.1.1",
+
"@radix-ui/react-dialog": "^1.1.6",
+
"@radix-ui/react-id": "^1.1.0",
+
"@radix-ui/react-primitive": "^2.0.2"
+
},
+
"peerDependencies": {
+
"react": "^18 || ^19 || ^19.0.0-rc",
+
"react-dom": "^18 || ^19 || ^19.0.0-rc"
+
}
+
},
+
"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==",
+
"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==",
+
"license": "MIT"
+
},
+
"node_modules/commander": {
+
"version": "4.1.1",
+
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+
"integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+
"license": "MIT",
+
"engines": {
+
"node": ">= 6"
+
}
+
},
+
"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/cross-spawn": {
+
"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"
+
},
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/cssesc": {
+
"version": "3.0.0",
+
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+
"license": "MIT",
+
"bin": {
+
"cssesc": "bin/cssesc"
+
},
+
"engines": {
+
"node": ">=4"
+
}
+
},
+
"node_modules/csstype": {
+
"version": "3.1.3",
+
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+
"license": "MIT"
+
},
+
"node_modules/d3-array": {
+
"version": "3.2.4",
+
"resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
+
"integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
+
"license": "ISC",
+
"dependencies": {
+
"internmap": "1 - 2"
+
},
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/d3-color": {
+
"version": "3.1.0",
+
"resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
+
"integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
+
"license": "ISC",
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/d3-ease": {
+
"version": "3.0.1",
+
"resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
+
"integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
+
"license": "BSD-3-Clause",
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/d3-format": {
+
"version": "3.1.0",
+
"resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
+
"integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
+
"license": "ISC",
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/d3-interpolate": {
+
"version": "3.0.1",
+
"resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+
"integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
+
"license": "ISC",
+
"dependencies": {
+
"d3-color": "1 - 3"
+
},
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/d3-path": {
+
"version": "3.1.0",
+
"resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
+
"integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
+
"license": "ISC",
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/d3-scale": {
+
"version": "4.0.2",
+
"resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
+
"integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
+
"license": "ISC",
+
"dependencies": {
+
"d3-array": "2.10.0 - 3",
+
"d3-format": "1 - 3",
+
"d3-interpolate": "1.2.0 - 3",
+
"d3-time": "2.1.1 - 3",
+
"d3-time-format": "2 - 4"
+
},
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/d3-shape": {
+
"version": "3.2.0",
+
"resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
+
"integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
+
"license": "ISC",
+
"dependencies": {
+
"d3-path": "^3.1.0"
+
},
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/d3-time": {
+
"version": "3.1.0",
+
"resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
+
"integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
+
"license": "ISC",
+
"dependencies": {
+
"d3-array": "2 - 3"
+
},
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/d3-time-format": {
+
"version": "4.1.0",
+
"resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
+
"integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
+
"license": "ISC",
+
"dependencies": {
+
"d3-time": "1 - 3"
+
},
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/d3-timer": {
+
"version": "3.0.1",
+
"resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
+
"integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
+
"license": "ISC",
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/date-fns": {
+
"version": "3.6.0",
+
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz",
+
"integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==",
+
"license": "MIT",
+
"funding": {
+
"type": "github",
+
"url": "https://github.com/sponsors/kossnocorp"
+
}
+
},
+
"node_modules/debug": {
+
"version": "4.3.7",
+
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+
"integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"ms": "^2.1.3"
+
},
+
"engines": {
+
"node": ">=6.0"
+
},
+
"peerDependenciesMeta": {
+
"supports-color": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/decimal.js-light": {
+
"version": "2.5.1",
+
"resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
+
"integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==",
+
"license": "MIT"
+
},
+
"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/detect-node-es": {
+
"version": "1.1.0",
+
"resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+
"integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
+
"license": "MIT"
+
},
+
"node_modules/didyoumean": {
+
"version": "1.2.2",
+
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+
"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+
"license": "Apache-2.0"
+
},
+
"node_modules/dlv": {
+
"version": "1.1.3",
+
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+
"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/eastasianwidth": {
+
"version": "0.2.0",
+
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+
"license": "MIT"
+
},
+
"node_modules/electron-to-chromium": {
+
"version": "1.5.192",
+
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.192.tgz",
+
"integrity": "sha512-rP8Ez0w7UNw/9j5eSXCe10o1g/8B1P5SM90PCCMVkIRQn2R0LEHWz4Eh9RnxkniuDe1W0cTSOB3MLlkTGDcuCg==",
+
"dev": true,
+
"license": "ISC"
+
},
+
"node_modules/embla-carousel": {
+
"version": "8.6.0",
+
"resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz",
+
"integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==",
+
"license": "MIT"
+
},
+
"node_modules/embla-carousel-react": {
+
"version": "8.6.0",
+
"resolved": "https://registry.npmjs.org/embla-carousel-react/-/embla-carousel-react-8.6.0.tgz",
+
"integrity": "sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==",
+
"license": "MIT",
+
"dependencies": {
+
"embla-carousel": "8.6.0",
+
"embla-carousel-reactive-utils": "8.6.0"
+
},
+
"peerDependencies": {
+
"react": "^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+
}
+
},
+
"node_modules/embla-carousel-reactive-utils": {
+
"version": "8.6.0",
+
"resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.6.0.tgz",
+
"integrity": "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==",
+
"license": "MIT",
+
"peerDependencies": {
+
"embla-carousel": "8.6.0"
+
}
+
},
+
"node_modules/emoji-regex": {
+
"version": "9.2.2",
+
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+
"license": "MIT"
+
},
+
"node_modules/esbuild": {
+
"version": "0.21.5",
+
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+
"integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+
"dev": true,
+
"hasInstallScript": true,
+
"license": "MIT",
+
"bin": {
+
"esbuild": "bin/esbuild"
+
},
+
"engines": {
+
"node": ">=12"
+
},
+
"optionalDependencies": {
+
"@esbuild/aix-ppc64": "0.21.5",
+
"@esbuild/android-arm": "0.21.5",
+
"@esbuild/android-arm64": "0.21.5",
+
"@esbuild/android-x64": "0.21.5",
+
"@esbuild/darwin-arm64": "0.21.5",
+
"@esbuild/darwin-x64": "0.21.5",
+
"@esbuild/freebsd-arm64": "0.21.5",
+
"@esbuild/freebsd-x64": "0.21.5",
+
"@esbuild/linux-arm": "0.21.5",
+
"@esbuild/linux-arm64": "0.21.5",
+
"@esbuild/linux-ia32": "0.21.5",
+
"@esbuild/linux-loong64": "0.21.5",
+
"@esbuild/linux-mips64el": "0.21.5",
+
"@esbuild/linux-ppc64": "0.21.5",
+
"@esbuild/linux-riscv64": "0.21.5",
+
"@esbuild/linux-s390x": "0.21.5",
+
"@esbuild/linux-x64": "0.21.5",
+
"@esbuild/netbsd-x64": "0.21.5",
+
"@esbuild/openbsd-x64": "0.21.5",
+
"@esbuild/sunos-x64": "0.21.5",
+
"@esbuild/win32-arm64": "0.21.5",
+
"@esbuild/win32-ia32": "0.21.5",
+
"@esbuild/win32-x64": "0.21.5"
+
}
+
},
+
"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==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/eslint": {
+
"version": "9.32.0",
+
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz",
+
"integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@eslint-community/eslint-utils": "^4.2.0",
+
"@eslint-community/regexpp": "^4.12.1",
+
"@eslint/config-array": "^0.21.0",
+
"@eslint/config-helpers": "^0.3.0",
+
"@eslint/core": "^0.15.0",
+
"@eslint/eslintrc": "^3.3.1",
+
"@eslint/js": "9.32.0",
+
"@eslint/plugin-kit": "^0.3.4",
+
"@humanfs/node": "^0.16.6",
+
"@humanwhocodes/module-importer": "^1.0.1",
+
"@humanwhocodes/retry": "^0.4.2",
+
"@types/estree": "^1.0.6",
+
"@types/json-schema": "^7.0.15",
+
"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": "5.2.0",
+
"resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
+
"integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=10"
+
},
+
"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.20",
+
"resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz",
+
"integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==",
+
"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/estree-walker": {
+
"version": "3.0.3",
+
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+
"integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@types/estree": "^1.0.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/eventemitter3": {
+
"version": "4.0.7",
+
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+
"license": "MIT"
+
},
+
"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-equals": {
+
"version": "5.2.2",
+
"resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz",
+
"integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.0.0"
+
}
+
},
+
"node_modules/fast-glob": {
+
"version": "3.3.2",
+
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+
"integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+
"license": "MIT",
+
"dependencies": {
+
"@nodelib/fs.stat": "^2.0.2",
+
"@nodelib/fs.walk": "^1.2.3",
+
"glob-parent": "^5.1.2",
+
"merge2": "^1.3.0",
+
"micromatch": "^4.0.4"
+
},
+
"engines": {
+
"node": ">=8.6.0"
+
}
+
},
+
"node_modules/fast-glob/node_modules/glob-parent": {
+
"version": "5.1.2",
+
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+
"license": "ISC",
+
"dependencies": {
+
"is-glob": "^4.0.1"
+
},
+
"engines": {
+
"node": ">= 6"
+
}
+
},
+
"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/fastq": {
+
"version": "1.17.1",
+
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+
"integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+
"license": "ISC",
+
"dependencies": {
+
"reusify": "^1.0.4"
+
}
+
},
+
"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/fill-range": {
+
"version": "7.1.1",
+
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+
"license": "MIT",
+
"dependencies": {
+
"to-regex-range": "^5.0.1"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"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.1",
+
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+
"integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
+
"dev": true,
+
"license": "ISC"
+
},
+
"node_modules/foreground-child": {
+
"version": "3.3.0",
+
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+
"integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+
"license": "ISC",
+
"dependencies": {
+
"cross-spawn": "^7.0.0",
+
"signal-exit": "^4.0.1"
+
},
+
"engines": {
+
"node": ">=14"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/isaacs"
+
}
+
},
+
"node_modules/fraction.js": {
+
"version": "4.3.7",
+
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+
"integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": "*"
+
},
+
"funding": {
+
"type": "patreon",
+
"url": "https://github.com/sponsors/rawify"
+
}
+
},
+
"node_modules/fsevents": {
+
"version": "2.3.3",
+
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+
"hasInstallScript": 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/get-nonce": {
+
"version": "1.0.1",
+
"resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+
"integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/glob": {
+
"version": "10.4.5",
+
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+
"integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+
"license": "ISC",
+
"dependencies": {
+
"foreground-child": "^3.1.0",
+
"jackspeak": "^3.1.2",
+
"minimatch": "^9.0.4",
+
"minipass": "^7.1.2",
+
"package-json-from-dist": "^1.0.0",
+
"path-scurry": "^1.11.1"
+
},
+
"bin": {
+
"glob": "dist/esm/bin.mjs"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/isaacs"
+
}
+
},
+
"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==",
+
"license": "ISC",
+
"dependencies": {
+
"is-glob": "^4.0.3"
+
},
+
"engines": {
+
"node": ">=10.13.0"
+
}
+
},
+
"node_modules/glob/node_modules/brace-expansion": {
+
"version": "2.0.2",
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+
"license": "MIT",
+
"dependencies": {
+
"balanced-match": "^1.0.0"
+
}
+
},
+
"node_modules/glob/node_modules/minimatch": {
+
"version": "9.0.5",
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+
"license": "ISC",
+
"dependencies": {
+
"brace-expansion": "^2.0.1"
+
},
+
"engines": {
+
"node": ">=16 || 14 >=14.17"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/isaacs"
+
}
+
},
+
"node_modules/globals": {
+
"version": "15.15.0",
+
"resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+
"integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=18"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/graphemer": {
+
"version": "1.4.0",
+
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+
"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"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/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==",
+
"dev": true,
+
"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/input-otp": {
+
"version": "1.4.2",
+
"resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz",
+
"integrity": "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==",
+
"license": "MIT",
+
"peerDependencies": {
+
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc",
+
"react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc"
+
}
+
},
+
"node_modules/internmap": {
+
"version": "2.0.3",
+
"resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
+
"integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
+
"license": "ISC",
+
"engines": {
+
"node": ">=12"
+
}
+
},
+
"node_modules/is-binary-path": {
+
"version": "2.1.0",
+
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+
"license": "MIT",
+
"dependencies": {
+
"binary-extensions": "^2.0.0"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/is-core-module": {
+
"version": "2.15.1",
+
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
+
"integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
+
"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==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/is-fullwidth-code-point": {
+
"version": "3.0.0",
+
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"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==",
+
"license": "MIT",
+
"dependencies": {
+
"is-extglob": "^2.1.1"
+
},
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/is-number": {
+
"version": "7.0.0",
+
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.12.0"
+
}
+
},
+
"node_modules/isexe": {
+
"version": "2.0.0",
+
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+
"license": "ISC"
+
},
+
"node_modules/jackspeak": {
+
"version": "3.4.3",
+
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+
"integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+
"license": "BlueOak-1.0.0",
+
"dependencies": {
+
"@isaacs/cliui": "^8.0.2"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/isaacs"
+
},
+
"optionalDependencies": {
+
"@pkgjs/parseargs": "^0.11.0"
+
}
+
},
+
"node_modules/jiti": {
+
"version": "1.21.6",
+
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz",
+
"integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==",
+
"license": "MIT",
+
"bin": {
+
"jiti": "bin/jiti.js"
+
}
+
},
+
"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.0",
+
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"argparse": "^2.0.1"
+
},
+
"bin": {
+
"js-yaml": "bin/js-yaml.js"
+
}
+
},
+
"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-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/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/lilconfig": {
+
"version": "3.1.3",
+
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+
"integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=14"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/antonk52"
+
}
+
},
+
"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": {
+
"version": "4.17.21",
+
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+
"license": "MIT"
+
},
+
"node_modules/lodash.castarray": {
+
"version": "4.4.0",
+
"resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
+
"integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==",
+
"dev": true
+
},
+
"node_modules/lodash.isplainobject": {
+
"version": "4.0.6",
+
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
+
"dev": true
+
},
+
"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/lovable-tagger": {
+
"version": "1.1.11",
+
"resolved": "https://registry.npmjs.org/lovable-tagger/-/lovable-tagger-1.1.11.tgz",
+
"integrity": "sha512-G1gUZi8CebQpB/5+IHWYekRyeRFF2RR7iXSjGO+iVWpwlpa19swgYCYem2z+IkBJO0fKRYJ98xz4yhdt++MzLA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/parser": "^7.25.9",
+
"@babel/types": "^7.25.8",
+
"esbuild": "^0.25.0",
+
"estree-walker": "^3.0.3",
+
"magic-string": "^0.30.12",
+
"tailwindcss": "^3.4.17"
+
},
+
"peerDependencies": {
+
"vite": ">=5.0.0 <8.0.0"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/aix-ppc64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz",
+
"integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==",
+
"cpu": [
+
"ppc64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"aix"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/android-arm": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz",
+
"integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==",
+
"cpu": [
+
"arm"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"android"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/android-arm64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz",
+
"integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"android"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/android-x64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz",
+
"integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"android"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/darwin-arm64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz",
+
"integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/darwin-x64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz",
+
"integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/freebsd-arm64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz",
+
"integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"freebsd"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/freebsd-x64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz",
+
"integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"freebsd"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/linux-arm": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz",
+
"integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==",
+
"cpu": [
+
"arm"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/linux-arm64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz",
+
"integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/linux-ia32": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz",
+
"integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==",
+
"cpu": [
+
"ia32"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/linux-loong64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz",
+
"integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==",
+
"cpu": [
+
"loong64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/linux-mips64el": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz",
+
"integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==",
+
"cpu": [
+
"mips64el"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/linux-ppc64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz",
+
"integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==",
+
"cpu": [
+
"ppc64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/linux-riscv64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz",
+
"integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==",
+
"cpu": [
+
"riscv64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/linux-s390x": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz",
+
"integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==",
+
"cpu": [
+
"s390x"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/linux-x64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz",
+
"integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"linux"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/netbsd-x64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz",
+
"integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"netbsd"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/openbsd-x64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz",
+
"integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"openbsd"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/sunos-x64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz",
+
"integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"sunos"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/win32-arm64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz",
+
"integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"win32"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/win32-ia32": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz",
+
"integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==",
+
"cpu": [
+
"ia32"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"win32"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/@esbuild/win32-x64": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz",
+
"integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==",
+
"cpu": [
+
"x64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"win32"
+
],
+
"engines": {
+
"node": ">=18"
+
}
+
},
+
"node_modules/lovable-tagger/node_modules/esbuild": {
+
"version": "0.25.0",
+
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz",
+
"integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==",
+
"dev": true,
+
"hasInstallScript": true,
+
"license": "MIT",
+
"bin": {
+
"esbuild": "bin/esbuild"
+
},
+
"engines": {
+
"node": ">=18"
+
},
+
"optionalDependencies": {
+
"@esbuild/aix-ppc64": "0.25.0",
+
"@esbuild/android-arm": "0.25.0",
+
"@esbuild/android-arm64": "0.25.0",
+
"@esbuild/android-x64": "0.25.0",
+
"@esbuild/darwin-arm64": "0.25.0",
+
"@esbuild/darwin-x64": "0.25.0",
+
"@esbuild/freebsd-arm64": "0.25.0",
+
"@esbuild/freebsd-x64": "0.25.0",
+
"@esbuild/linux-arm": "0.25.0",
+
"@esbuild/linux-arm64": "0.25.0",
+
"@esbuild/linux-ia32": "0.25.0",
+
"@esbuild/linux-loong64": "0.25.0",
+
"@esbuild/linux-mips64el": "0.25.0",
+
"@esbuild/linux-ppc64": "0.25.0",
+
"@esbuild/linux-riscv64": "0.25.0",
+
"@esbuild/linux-s390x": "0.25.0",
+
"@esbuild/linux-x64": "0.25.0",
+
"@esbuild/netbsd-arm64": "0.25.0",
+
"@esbuild/netbsd-x64": "0.25.0",
+
"@esbuild/openbsd-arm64": "0.25.0",
+
"@esbuild/openbsd-x64": "0.25.0",
+
"@esbuild/sunos-x64": "0.25.0",
+
"@esbuild/win32-arm64": "0.25.0",
+
"@esbuild/win32-ia32": "0.25.0",
+
"@esbuild/win32-x64": "0.25.0"
+
}
+
},
+
"node_modules/lru-cache": {
+
"version": "10.4.3",
+
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+
"integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+
"license": "ISC"
+
},
+
"node_modules/lucide-react": {
+
"version": "0.462.0",
+
"resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.462.0.tgz",
+
"integrity": "sha512-NTL7EbAao9IFtuSivSZgrAh4fZd09Lr+6MTkqIxuHaH2nnYiYIzXPo06cOxHg9wKLdj6LL8TByG4qpePqwgx/g==",
+
"peerDependencies": {
+
"react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc"
+
}
+
},
+
"node_modules/magic-string": {
+
"version": "0.30.12",
+
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz",
+
"integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@jridgewell/sourcemap-codec": "^1.5.0"
+
}
+
},
+
"node_modules/merge2": {
+
"version": "1.4.1",
+
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+
"license": "MIT",
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/micromatch": {
+
"version": "4.0.8",
+
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+
"license": "MIT",
+
"dependencies": {
+
"braces": "^3.0.3",
+
"picomatch": "^2.3.1"
+
},
+
"engines": {
+
"node": ">=8.6"
+
}
+
},
+
"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/minipass": {
+
"version": "7.1.2",
+
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+
"license": "ISC",
+
"engines": {
+
"node": ">=16 || 14 >=14.17"
+
}
+
},
+
"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==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/mz": {
+
"version": "2.7.0",
+
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+
"integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+
"license": "MIT",
+
"dependencies": {
+
"any-promise": "^1.0.0",
+
"object-assign": "^4.0.1",
+
"thenify-all": "^1.0.0"
+
}
+
},
+
"node_modules/nanoid": {
+
"version": "3.3.11",
+
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+
"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/next-themes": {
+
"version": "0.3.0",
+
"resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.3.0.tgz",
+
"integrity": "sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==",
+
"license": "MIT",
+
"peerDependencies": {
+
"react": "^16.8 || ^17 || ^18",
+
"react-dom": "^16.8 || ^17 || ^18"
+
}
+
},
+
"node_modules/node-releases": {
+
"version": "2.0.19",
+
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+
"integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/normalize-path": {
+
"version": "3.0.0",
+
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/normalize-range": {
+
"version": "0.1.2",
+
"resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+
"integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"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/object-hash": {
+
"version": "3.0.0",
+
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+
"license": "MIT",
+
"engines": {
+
"node": ">= 6"
+
}
+
},
+
"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/package-json-from-dist": {
+
"version": "1.0.1",
+
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+
"license": "BlueOak-1.0.0"
+
},
+
"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==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"callsites": "^3.0.0"
+
},
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"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==",
+
"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-scurry": {
+
"version": "1.11.1",
+
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+
"integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+
"license": "BlueOak-1.0.0",
+
"dependencies": {
+
"lru-cache": "^10.2.0",
+
"minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+
},
+
"engines": {
+
"node": ">=16 || 14 >=14.18"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/isaacs"
+
}
+
},
+
"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": "2.3.1",
+
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=8.6"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/jonschlinkert"
+
}
+
},
+
"node_modules/pify": {
+
"version": "2.3.0",
+
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+
"integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/pirates": {
+
"version": "4.0.6",
+
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+
"integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+
"license": "MIT",
+
"engines": {
+
"node": ">= 6"
+
}
+
},
+
"node_modules/postcss": {
+
"version": "8.5.6",
+
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+
"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/postcss-import": {
+
"version": "15.1.0",
+
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+
"integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+
"license": "MIT",
+
"dependencies": {
+
"postcss-value-parser": "^4.0.0",
+
"read-cache": "^1.0.0",
+
"resolve": "^1.1.7"
+
},
+
"engines": {
+
"node": ">=14.0.0"
+
},
+
"peerDependencies": {
+
"postcss": "^8.0.0"
+
}
+
},
+
"node_modules/postcss-js": {
+
"version": "4.0.1",
+
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+
"integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+
"license": "MIT",
+
"dependencies": {
+
"camelcase-css": "^2.0.1"
+
},
+
"engines": {
+
"node": "^12 || ^14 || >= 16"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/postcss/"
+
},
+
"peerDependencies": {
+
"postcss": "^8.4.21"
+
}
+
},
+
"node_modules/postcss-load-config": {
+
"version": "4.0.2",
+
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
+
"integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
+
"funding": [
+
{
+
"type": "opencollective",
+
"url": "https://opencollective.com/postcss/"
+
},
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "MIT",
+
"dependencies": {
+
"lilconfig": "^3.0.0",
+
"yaml": "^2.3.4"
+
},
+
"engines": {
+
"node": ">= 14"
+
},
+
"peerDependencies": {
+
"postcss": ">=8.0.9",
+
"ts-node": ">=9.0.0"
+
},
+
"peerDependenciesMeta": {
+
"postcss": {
+
"optional": true
+
},
+
"ts-node": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/postcss-nested": {
+
"version": "6.2.0",
+
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
+
"integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
+
"funding": [
+
{
+
"type": "opencollective",
+
"url": "https://opencollective.com/postcss/"
+
},
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "MIT",
+
"dependencies": {
+
"postcss-selector-parser": "^6.1.1"
+
},
+
"engines": {
+
"node": ">=12.0"
+
},
+
"peerDependencies": {
+
"postcss": "^8.2.14"
+
}
+
},
+
"node_modules/postcss-selector-parser": {
+
"version": "6.1.2",
+
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+
"integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+
"license": "MIT",
+
"dependencies": {
+
"cssesc": "^3.0.0",
+
"util-deprecate": "^1.0.2"
+
},
+
"engines": {
+
"node": ">=4"
+
}
+
},
+
"node_modules/postcss-value-parser": {
+
"version": "4.2.0",
+
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+
"license": "MIT"
+
},
+
"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/prop-types/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/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/queue-microtask": {
+
"version": "1.2.3",
+
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+
"funding": [
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/feross"
+
},
+
{
+
"type": "patreon",
+
"url": "https://www.patreon.com/feross"
+
},
+
{
+
"type": "consulting",
+
"url": "https://feross.org/support"
+
}
+
],
+
"license": "MIT"
+
},
+
"node_modules/react": {
+
"version": "18.3.1",
+
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+
"integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+
"license": "MIT",
+
"dependencies": {
+
"loose-envify": "^1.1.0"
+
},
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/react-day-picker": {
+
"version": "8.10.1",
+
"resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz",
+
"integrity": "sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==",
+
"license": "MIT",
+
"funding": {
+
"type": "individual",
+
"url": "https://github.com/sponsors/gpbl"
+
},
+
"peerDependencies": {
+
"date-fns": "^2.28.0 || ^3.0.0",
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+
}
+
},
+
"node_modules/react-dom": {
+
"version": "18.3.1",
+
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+
"integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+
"license": "MIT",
+
"dependencies": {
+
"loose-envify": "^1.1.0",
+
"scheduler": "^0.23.2"
+
},
+
"peerDependencies": {
+
"react": "^18.3.1"
+
}
+
},
+
"node_modules/react-hook-form": {
+
"version": "7.61.1",
+
"resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.61.1.tgz",
+
"integrity": "sha512-2vbXUFDYgqEgM2RcXcAT2PwDW/80QARi+PKmHy5q2KhuKvOlG8iIYgf7eIlIANR5trW9fJbP4r5aub3a4egsew==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=18.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/react-hook-form"
+
},
+
"peerDependencies": {
+
"react": "^16.8.0 || ^17 || ^18 || ^19"
+
}
+
},
+
"node_modules/react-is": {
+
"version": "18.3.1",
+
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+
"license": "MIT"
+
},
+
"node_modules/react-remove-scroll": {
+
"version": "2.7.1",
+
"resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz",
+
"integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==",
+
"license": "MIT",
+
"dependencies": {
+
"react-remove-scroll-bar": "^2.3.7",
+
"react-style-singleton": "^2.2.3",
+
"tslib": "^2.1.0",
+
"use-callback-ref": "^1.3.3",
+
"use-sidecar": "^1.1.3"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/react-remove-scroll-bar": {
+
"version": "2.3.8",
+
"resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
+
"integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
+
"license": "MIT",
+
"dependencies": {
+
"react-style-singleton": "^2.2.2",
+
"tslib": "^2.0.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/react-resizable-panels": {
+
"version": "2.1.9",
+
"resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.1.9.tgz",
+
"integrity": "sha512-z77+X08YDIrgAes4jl8xhnUu1LNIRp4+E7cv4xHmLOxxUPO/ML7PSrE813b90vj7xvQ1lcf7g2uA9GeMZonjhQ==",
+
"license": "MIT",
+
"peerDependencies": {
+
"react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc",
+
"react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+
}
+
},
+
"node_modules/react-router": {
+
"version": "6.30.1",
+
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz",
+
"integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==",
+
"license": "MIT",
+
"dependencies": {
+
"@remix-run/router": "1.23.0"
+
},
+
"engines": {
+
"node": ">=14.0.0"
+
},
+
"peerDependencies": {
+
"react": ">=16.8"
+
}
+
},
+
"node_modules/react-router-dom": {
+
"version": "6.30.1",
+
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz",
+
"integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==",
+
"license": "MIT",
+
"dependencies": {
+
"@remix-run/router": "1.23.0",
+
"react-router": "6.30.1"
+
},
+
"engines": {
+
"node": ">=14.0.0"
+
},
+
"peerDependencies": {
+
"react": ">=16.8",
+
"react-dom": ">=16.8"
+
}
+
},
+
"node_modules/react-smooth": {
+
"version": "4.0.4",
+
"resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz",
+
"integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==",
+
"license": "MIT",
+
"dependencies": {
+
"fast-equals": "^5.0.1",
+
"prop-types": "^15.8.1",
+
"react-transition-group": "^4.4.5"
+
},
+
"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/react-style-singleton": {
+
"version": "2.2.3",
+
"resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
+
"integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
+
"license": "MIT",
+
"dependencies": {
+
"get-nonce": "^1.0.0",
+
"tslib": "^2.0.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"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/read-cache": {
+
"version": "1.0.0",
+
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+
"integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+
"license": "MIT",
+
"dependencies": {
+
"pify": "^2.3.0"
+
}
+
},
+
"node_modules/readdirp": {
+
"version": "3.6.0",
+
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+
"license": "MIT",
+
"dependencies": {
+
"picomatch": "^2.2.1"
+
},
+
"engines": {
+
"node": ">=8.10.0"
+
}
+
},
+
"node_modules/recharts": {
+
"version": "2.15.4",
+
"resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.4.tgz",
+
"integrity": "sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==",
+
"license": "MIT",
+
"dependencies": {
+
"clsx": "^2.0.0",
+
"eventemitter3": "^4.0.1",
+
"lodash": "^4.17.21",
+
"react-is": "^18.3.1",
+
"react-smooth": "^4.0.4",
+
"recharts-scale": "^0.4.4",
+
"tiny-invariant": "^1.3.1",
+
"victory-vendor": "^36.6.8"
+
},
+
"engines": {
+
"node": ">=14"
+
},
+
"peerDependencies": {
+
"react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+
"react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+
}
+
},
+
"node_modules/recharts-scale": {
+
"version": "0.4.5",
+
"resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz",
+
"integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==",
+
"license": "MIT",
+
"dependencies": {
+
"decimal.js-light": "^2.4.1"
+
}
+
},
+
"node_modules/resolve": {
+
"version": "1.22.8",
+
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+
"integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+
"license": "MIT",
+
"dependencies": {
+
"is-core-module": "^2.13.0",
+
"path-parse": "^1.0.7",
+
"supports-preserve-symlinks-flag": "^1.0.0"
+
},
+
"bin": {
+
"resolve": "bin/resolve"
+
},
+
"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==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=4"
+
}
+
},
+
"node_modules/reusify": {
+
"version": "1.0.4",
+
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+
"license": "MIT",
+
"engines": {
+
"iojs": ">=1.0.0",
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/rollup": {
+
"version": "4.24.0",
+
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz",
+
"integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@types/estree": "1.0.6"
+
},
+
"bin": {
+
"rollup": "dist/bin/rollup"
+
},
+
"engines": {
+
"node": ">=18.0.0",
+
"npm": ">=8.0.0"
+
},
+
"optionalDependencies": {
+
"@rollup/rollup-android-arm-eabi": "4.24.0",
+
"@rollup/rollup-android-arm64": "4.24.0",
+
"@rollup/rollup-darwin-arm64": "4.24.0",
+
"@rollup/rollup-darwin-x64": "4.24.0",
+
"@rollup/rollup-linux-arm-gnueabihf": "4.24.0",
+
"@rollup/rollup-linux-arm-musleabihf": "4.24.0",
+
"@rollup/rollup-linux-arm64-gnu": "4.24.0",
+
"@rollup/rollup-linux-arm64-musl": "4.24.0",
+
"@rollup/rollup-linux-powerpc64le-gnu": "4.24.0",
+
"@rollup/rollup-linux-riscv64-gnu": "4.24.0",
+
"@rollup/rollup-linux-s390x-gnu": "4.24.0",
+
"@rollup/rollup-linux-x64-gnu": "4.24.0",
+
"@rollup/rollup-linux-x64-musl": "4.24.0",
+
"@rollup/rollup-win32-arm64-msvc": "4.24.0",
+
"@rollup/rollup-win32-ia32-msvc": "4.24.0",
+
"@rollup/rollup-win32-x64-msvc": "4.24.0",
+
"fsevents": "~2.3.2"
+
}
+
},
+
"node_modules/run-parallel": {
+
"version": "1.2.0",
+
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+
"funding": [
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/feross"
+
},
+
{
+
"type": "patreon",
+
"url": "https://www.patreon.com/feross"
+
},
+
{
+
"type": "consulting",
+
"url": "https://feross.org/support"
+
}
+
],
+
"license": "MIT",
+
"dependencies": {
+
"queue-microtask": "^1.2.2"
+
}
+
},
+
"node_modules/scheduler": {
+
"version": "0.23.2",
+
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+
"integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+
"license": "MIT",
+
"dependencies": {
+
"loose-envify": "^1.1.0"
+
}
+
},
+
"node_modules/semver": {
+
"version": "7.7.2",
+
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+
"dev": true,
+
"license": "ISC",
+
"bin": {
+
"semver": "bin/semver.js"
+
},
+
"engines": {
+
"node": ">=10"
+
}
+
},
+
"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==",
+
"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==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/signal-exit": {
+
"version": "4.1.0",
+
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+
"license": "ISC",
+
"engines": {
+
"node": ">=14"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/isaacs"
+
}
+
},
+
"node_modules/sonner": {
+
"version": "1.7.4",
+
"resolved": "https://registry.npmjs.org/sonner/-/sonner-1.7.4.tgz",
+
"integrity": "sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==",
+
"license": "MIT",
+
"peerDependencies": {
+
"react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc",
+
"react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+
}
+
},
+
"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==",
+
"license": "BSD-3-Clause",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/string-width": {
+
"version": "5.1.2",
+
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+
"license": "MIT",
+
"dependencies": {
+
"eastasianwidth": "^0.2.0",
+
"emoji-regex": "^9.2.2",
+
"strip-ansi": "^7.0.1"
+
},
+
"engines": {
+
"node": ">=12"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/string-width-cjs": {
+
"name": "string-width",
+
"version": "4.2.3",
+
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+
"license": "MIT",
+
"dependencies": {
+
"emoji-regex": "^8.0.0",
+
"is-fullwidth-code-point": "^3.0.0",
+
"strip-ansi": "^6.0.1"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/string-width-cjs/node_modules/ansi-regex": {
+
"version": "5.0.1",
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/string-width-cjs/node_modules/emoji-regex": {
+
"version": "8.0.0",
+
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+
"license": "MIT"
+
},
+
"node_modules/string-width-cjs/node_modules/strip-ansi": {
+
"version": "6.0.1",
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+
"license": "MIT",
+
"dependencies": {
+
"ansi-regex": "^5.0.1"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/strip-ansi": {
+
"version": "7.1.0",
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+
"license": "MIT",
+
"dependencies": {
+
"ansi-regex": "^6.0.1"
+
},
+
"engines": {
+
"node": ">=12"
+
},
+
"funding": {
+
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
+
}
+
},
+
"node_modules/strip-ansi-cjs": {
+
"name": "strip-ansi",
+
"version": "6.0.1",
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+
"license": "MIT",
+
"dependencies": {
+
"ansi-regex": "^5.0.1"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+
"version": "5.0.1",
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"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/sucrase": {
+
"version": "3.35.0",
+
"resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+
"integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+
"license": "MIT",
+
"dependencies": {
+
"@jridgewell/gen-mapping": "^0.3.2",
+
"commander": "^4.0.0",
+
"glob": "^10.3.10",
+
"lines-and-columns": "^1.1.6",
+
"mz": "^2.7.0",
+
"pirates": "^4.0.1",
+
"ts-interface-checker": "^0.1.9"
+
},
+
"bin": {
+
"sucrase": "bin/sucrase",
+
"sucrase-node": "bin/sucrase-node"
+
},
+
"engines": {
+
"node": ">=16 || 14 >=14.17"
+
}
+
},
+
"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/tailwind-merge": {
+
"version": "2.6.0",
+
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz",
+
"integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==",
+
"license": "MIT",
+
"funding": {
+
"type": "github",
+
"url": "https://github.com/sponsors/dcastil"
+
}
+
},
+
"node_modules/tailwindcss": {
+
"version": "3.4.17",
+
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
+
"integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
+
"license": "MIT",
+
"dependencies": {
+
"@alloc/quick-lru": "^5.2.0",
+
"arg": "^5.0.2",
+
"chokidar": "^3.6.0",
+
"didyoumean": "^1.2.2",
+
"dlv": "^1.1.3",
+
"fast-glob": "^3.3.2",
+
"glob-parent": "^6.0.2",
+
"is-glob": "^4.0.3",
+
"jiti": "^1.21.6",
+
"lilconfig": "^3.1.3",
+
"micromatch": "^4.0.8",
+
"normalize-path": "^3.0.0",
+
"object-hash": "^3.0.0",
+
"picocolors": "^1.1.1",
+
"postcss": "^8.4.47",
+
"postcss-import": "^15.1.0",
+
"postcss-js": "^4.0.1",
+
"postcss-load-config": "^4.0.2",
+
"postcss-nested": "^6.2.0",
+
"postcss-selector-parser": "^6.1.2",
+
"resolve": "^1.22.8",
+
"sucrase": "^3.35.0"
+
},
+
"bin": {
+
"tailwind": "lib/cli.js",
+
"tailwindcss": "lib/cli.js"
+
},
+
"engines": {
+
"node": ">=14.0.0"
+
}
+
},
+
"node_modules/tailwindcss-animate": {
+
"version": "1.0.7",
+
"resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz",
+
"integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==",
+
"license": "MIT",
+
"peerDependencies": {
+
"tailwindcss": ">=3.0.0 || insiders"
+
}
+
},
+
"node_modules/thenify": {
+
"version": "3.3.1",
+
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+
"integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+
"license": "MIT",
+
"dependencies": {
+
"any-promise": "^1.0.0"
+
}
+
},
+
"node_modules/thenify-all": {
+
"version": "1.6.0",
+
"resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+
"integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+
"license": "MIT",
+
"dependencies": {
+
"thenify": ">= 3.1.0 < 4"
+
},
+
"engines": {
+
"node": ">=0.8"
+
}
+
},
+
"node_modules/tiny-invariant": {
+
"version": "1.3.3",
+
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
+
"integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
+
"license": "MIT"
+
},
+
"node_modules/to-regex-range": {
+
"version": "5.0.1",
+
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+
"license": "MIT",
+
"dependencies": {
+
"is-number": "^7.0.0"
+
},
+
"engines": {
+
"node": ">=8.0"
+
}
+
},
+
"node_modules/ts-api-utils": {
+
"version": "2.1.0",
+
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+
"integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=18.12"
+
},
+
"peerDependencies": {
+
"typescript": ">=4.8.4"
+
}
+
},
+
"node_modules/ts-interface-checker": {
+
"version": "0.1.13",
+
"resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+
"integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+
"license": "Apache-2.0"
+
},
+
"node_modules/tslib": {
+
"version": "2.8.0",
+
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz",
+
"integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==",
+
"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/typescript": {
+
"version": "5.8.3",
+
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
+
"integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"bin": {
+
"tsc": "bin/tsc",
+
"tsserver": "bin/tsserver"
+
},
+
"engines": {
+
"node": ">=14.17"
+
}
+
},
+
"node_modules/typescript-eslint": {
+
"version": "8.38.0",
+
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.38.0.tgz",
+
"integrity": "sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/eslint-plugin": "8.38.0",
+
"@typescript-eslint/parser": "8.38.0",
+
"@typescript-eslint/typescript-estree": "8.38.0",
+
"@typescript-eslint/utils": "8.38.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"eslint": "^8.57.0 || ^9.0.0",
+
"typescript": ">=4.8.4 <5.9.0"
+
}
+
},
+
"node_modules/undici-types": {
+
"version": "6.21.0",
+
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/update-browserslist-db": {
+
"version": "1.1.3",
+
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+
"integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+
"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/use-callback-ref": {
+
"version": "1.3.3",
+
"resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
+
"integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
+
"license": "MIT",
+
"dependencies": {
+
"tslib": "^2.0.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/use-sidecar": {
+
"version": "1.1.3",
+
"resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
+
"integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
+
"license": "MIT",
+
"dependencies": {
+
"detect-node-es": "^1.1.0",
+
"tslib": "^2.0.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"peerDependencies": {
+
"@types/react": "*",
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+
},
+
"peerDependenciesMeta": {
+
"@types/react": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/use-sync-external-store": {
+
"version": "1.5.0",
+
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz",
+
"integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==",
+
"license": "MIT",
+
"peerDependencies": {
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+
}
+
},
+
"node_modules/util-deprecate": {
+
"version": "1.0.2",
+
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+
"license": "MIT"
+
},
+
"node_modules/vaul": {
+
"version": "0.9.9",
+
"resolved": "https://registry.npmjs.org/vaul/-/vaul-0.9.9.tgz",
+
"integrity": "sha512-7afKg48srluhZwIkaU+lgGtFCUsYBSGOl8vcc8N/M3YQlZFlynHD15AE+pwrYdc826o7nrIND4lL9Y6b9WWZZQ==",
+
"license": "MIT",
+
"dependencies": {
+
"@radix-ui/react-dialog": "^1.1.1"
+
},
+
"peerDependencies": {
+
"react": "^16.8 || ^17.0 || ^18.0",
+
"react-dom": "^16.8 || ^17.0 || ^18.0"
+
}
+
},
+
"node_modules/victory-vendor": {
+
"version": "36.9.2",
+
"resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz",
+
"integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==",
+
"license": "MIT AND ISC",
+
"dependencies": {
+
"@types/d3-array": "^3.0.3",
+
"@types/d3-ease": "^3.0.0",
+
"@types/d3-interpolate": "^3.0.1",
+
"@types/d3-scale": "^4.0.2",
+
"@types/d3-shape": "^3.1.0",
+
"@types/d3-time": "^3.0.0",
+
"@types/d3-timer": "^3.0.0",
+
"d3-array": "^3.1.6",
+
"d3-ease": "^3.0.1",
+
"d3-interpolate": "^3.0.1",
+
"d3-scale": "^4.0.2",
+
"d3-shape": "^3.1.0",
+
"d3-time": "^3.0.0",
+
"d3-timer": "^3.0.1"
+
}
+
},
+
"node_modules/vite": {
+
"version": "5.4.19",
+
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz",
+
"integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"esbuild": "^0.21.3",
+
"postcss": "^8.4.43",
+
"rollup": "^4.20.0"
+
},
+
"bin": {
+
"vite": "bin/vite.js"
+
},
+
"engines": {
+
"node": "^18.0.0 || >=20.0.0"
+
},
+
"funding": {
+
"url": "https://github.com/vitejs/vite?sponsor=1"
+
},
+
"optionalDependencies": {
+
"fsevents": "~2.3.3"
+
},
+
"peerDependencies": {
+
"@types/node": "^18.0.0 || >=20.0.0",
+
"less": "*",
+
"lightningcss": "^1.21.0",
+
"sass": "*",
+
"sass-embedded": "*",
+
"stylus": "*",
+
"sugarss": "*",
+
"terser": "^5.4.0"
+
},
+
"peerDependenciesMeta": {
+
"@types/node": {
+
"optional": true
+
},
+
"less": {
+
"optional": true
+
},
+
"lightningcss": {
+
"optional": true
+
},
+
"sass": {
+
"optional": true
+
},
+
"sass-embedded": {
+
"optional": true
+
},
+
"stylus": {
+
"optional": true
+
},
+
"sugarss": {
+
"optional": true
+
},
+
"terser": {
+
"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==",
+
"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/wrap-ansi": {
+
"version": "8.1.0",
+
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+
"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+
"license": "MIT",
+
"dependencies": {
+
"ansi-styles": "^6.1.0",
+
"string-width": "^5.0.1",
+
"strip-ansi": "^7.0.1"
+
},
+
"engines": {
+
"node": ">=12"
+
},
+
"funding": {
+
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+
}
+
},
+
"node_modules/wrap-ansi-cjs": {
+
"name": "wrap-ansi",
+
"version": "7.0.0",
+
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+
"license": "MIT",
+
"dependencies": {
+
"ansi-styles": "^4.0.0",
+
"string-width": "^4.1.0",
+
"strip-ansi": "^6.0.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+
}
+
},
+
"node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+
"version": "5.0.1",
+
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+
"version": "8.0.0",
+
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+
"license": "MIT"
+
},
+
"node_modules/wrap-ansi-cjs/node_modules/string-width": {
+
"version": "4.2.3",
+
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+
"license": "MIT",
+
"dependencies": {
+
"emoji-regex": "^8.0.0",
+
"is-fullwidth-code-point": "^3.0.0",
+
"strip-ansi": "^6.0.1"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+
"version": "6.0.1",
+
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+
"license": "MIT",
+
"dependencies": {
+
"ansi-regex": "^5.0.1"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/wrap-ansi/node_modules/ansi-styles": {
+
"version": "6.2.1",
+
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+
"license": "MIT",
+
"engines": {
+
"node": ">=12"
+
},
+
"funding": {
+
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
+
}
+
},
+
"node_modules/yaml": {
+
"version": "2.6.0",
+
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz",
+
"integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==",
+
"license": "ISC",
+
"bin": {
+
"yaml": "bin.mjs"
+
},
+
"engines": {
+
"node": ">= 14"
+
}
+
},
+
"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": "3.25.76",
+
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+
"license": "MIT",
+
"funding": {
+
"url": "https://github.com/sponsors/colinhacks"
+
}
+
}
+
}
+
}
+83
package.json
···
+
{
+
"name": "vite_react_shadcn_ts",
+
"private": true,
+
"version": "0.0.0",
+
"type": "module",
+
"scripts": {
+
"dev": "vite",
+
"build": "vite build",
+
"build:dev": "vite build --mode development",
+
"lint": "eslint .",
+
"preview": "vite preview"
+
},
+
"dependencies": {
+
"@hookform/resolvers": "^3.10.0",
+
"@radix-ui/react-accordion": "^1.2.11",
+
"@radix-ui/react-alert-dialog": "^1.1.14",
+
"@radix-ui/react-aspect-ratio": "^1.1.7",
+
"@radix-ui/react-avatar": "^1.1.10",
+
"@radix-ui/react-checkbox": "^1.3.2",
+
"@radix-ui/react-collapsible": "^1.1.11",
+
"@radix-ui/react-context-menu": "^2.2.15",
+
"@radix-ui/react-dialog": "^1.1.14",
+
"@radix-ui/react-dropdown-menu": "^2.1.15",
+
"@radix-ui/react-hover-card": "^1.1.14",
+
"@radix-ui/react-label": "^2.1.7",
+
"@radix-ui/react-menubar": "^1.1.15",
+
"@radix-ui/react-navigation-menu": "^1.2.13",
+
"@radix-ui/react-popover": "^1.1.14",
+
"@radix-ui/react-progress": "^1.1.7",
+
"@radix-ui/react-radio-group": "^1.3.7",
+
"@radix-ui/react-scroll-area": "^1.2.9",
+
"@radix-ui/react-select": "^2.2.5",
+
"@radix-ui/react-separator": "^1.1.7",
+
"@radix-ui/react-slider": "^1.3.5",
+
"@radix-ui/react-slot": "^1.2.3",
+
"@radix-ui/react-switch": "^1.2.5",
+
"@radix-ui/react-tabs": "^1.1.12",
+
"@radix-ui/react-toast": "^1.2.14",
+
"@radix-ui/react-toggle": "^1.1.9",
+
"@radix-ui/react-toggle-group": "^1.1.10",
+
"@radix-ui/react-tooltip": "^1.2.7",
+
"@tanstack/react-query": "^5.83.0",
+
"class-variance-authority": "^0.7.1",
+
"clsx": "^2.1.1",
+
"cmdk": "^1.1.1",
+
"date-fns": "^3.6.0",
+
"embla-carousel-react": "^8.6.0",
+
"input-otp": "^1.4.2",
+
"lucide-react": "^0.462.0",
+
"next-themes": "^0.3.0",
+
"react": "^18.3.1",
+
"react-day-picker": "^8.10.1",
+
"react-dom": "^18.3.1",
+
"react-hook-form": "^7.61.1",
+
"react-resizable-panels": "^2.1.9",
+
"react-router-dom": "^6.30.1",
+
"recharts": "^2.15.4",
+
"sonner": "^1.7.4",
+
"tailwind-merge": "^2.6.0",
+
"tailwindcss-animate": "^1.0.7",
+
"vaul": "^0.9.9",
+
"zod": "^3.25.76"
+
},
+
"devDependencies": {
+
"@eslint/js": "^9.32.0",
+
"@tailwindcss/typography": "^0.5.16",
+
"@types/node": "^22.16.5",
+
"@types/react": "^18.3.23",
+
"@types/react-dom": "^18.3.7",
+
"@vitejs/plugin-react-swc": "^3.11.0",
+
"autoprefixer": "^10.4.21",
+
"eslint": "^9.32.0",
+
"eslint-plugin-react-hooks": "^5.2.0",
+
"eslint-plugin-react-refresh": "^0.4.20",
+
"globals": "^15.15.0",
+
"lovable-tagger": "^1.1.11",
+
"postcss": "^8.5.6",
+
"tailwindcss": "^3.4.17",
+
"typescript": "^5.8.3",
+
"typescript-eslint": "^8.38.0",
+
"vite": "^5.4.19"
+
}
+
}
+6
postcss.config.js
···
+
export default {
+
plugins: {
+
tailwindcss: {},
+
autoprefixer: {},
+
},
+
};
public/favicon.ico

This is a binary file and will not be displayed.

+1
public/placeholder.svg
···
+
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="1200" fill="none"><rect width="1200" height="1200" fill="#EAEAEA" rx="3"/><g opacity=".5"><g opacity=".5"><path fill="#FAFAFA" d="M600.709 736.5c-75.454 0-136.621-61.167-136.621-136.62 0-75.454 61.167-136.621 136.621-136.621 75.453 0 136.62 61.167 136.62 136.621 0 75.453-61.167 136.62-136.62 136.62Z"/><path stroke="#C9C9C9" stroke-width="2.418" d="M600.709 736.5c-75.454 0-136.621-61.167-136.621-136.62 0-75.454 61.167-136.621 136.621-136.621 75.453 0 136.62 61.167 136.62 136.621 0 75.453-61.167 136.62-136.62 136.62Z"/></g><path stroke="url(#a)" stroke-width="2.418" d="M0-1.209h553.581" transform="scale(1 -1) rotate(45 1163.11 91.165)"/><path stroke="url(#b)" stroke-width="2.418" d="M404.846 598.671h391.726"/><path stroke="url(#c)" stroke-width="2.418" d="M599.5 795.742V404.017"/><path stroke="url(#d)" stroke-width="2.418" d="m795.717 796.597-391.441-391.44"/><path fill="#fff" d="M600.709 656.704c-31.384 0-56.825-25.441-56.825-56.824 0-31.384 25.441-56.825 56.825-56.825 31.383 0 56.824 25.441 56.824 56.825 0 31.383-25.441 56.824-56.824 56.824Z"/><g clip-path="url(#e)"><path fill="#666" fill-rule="evenodd" d="M616.426 586.58h-31.434v16.176l3.553-3.554.531-.531h9.068l.074-.074 8.463-8.463h2.565l7.18 7.181V586.58Zm-15.715 14.654 3.698 3.699 1.283 1.282-2.565 2.565-1.282-1.283-5.2-5.199h-6.066l-5.514 5.514-.073.073v2.876a2.418 2.418 0 0 0 2.418 2.418h26.598a2.418 2.418 0 0 0 2.418-2.418v-8.317l-8.463-8.463-7.181 7.181-.071.072Zm-19.347 5.442v4.085a6.045 6.045 0 0 0 6.046 6.045h26.598a6.044 6.044 0 0 0 6.045-6.045v-7.108l1.356-1.355-1.282-1.283-.074-.073v-17.989h-38.689v23.43l-.146.146.146.147Z" clip-rule="evenodd"/></g><path stroke="#C9C9C9" stroke-width="2.418" d="M600.709 656.704c-31.384 0-56.825-25.441-56.825-56.824 0-31.384 25.441-56.825 56.825-56.825 31.383 0 56.824 25.441 56.824 56.825 0 31.383-25.441 56.824-56.824 56.824Z"/></g><defs><linearGradient id="a" x1="554.061" x2="-.48" y1=".083" y2=".087" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="b" x1="796.912" x2="404.507" y1="599.963" y2="599.965" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="c" x1="600.792" x2="600.794" y1="403.677" y2="796.082" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="d" x1="404.85" x2="796.972" y1="403.903" y2="796.02" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><clipPath id="e"><path fill="#fff" d="M581.364 580.535h38.689v38.689h-38.689z"/></clipPath></defs></svg>
+14
public/robots.txt
···
+
User-agent: Googlebot
+
Allow: /
+
+
User-agent: Bingbot
+
Allow: /
+
+
User-agent: Twitterbot
+
Allow: /
+
+
User-agent: facebookexternalhit
+
Allow: /
+
+
User-agent: *
+
Allow: /
+42
src/App.css
···
+
#root {
+
max-width: 1280px;
+
margin: 0 auto;
+
padding: 2rem;
+
text-align: center;
+
}
+
+
.logo {
+
height: 6em;
+
padding: 1.5em;
+
will-change: filter;
+
transition: filter 300ms;
+
}
+
.logo:hover {
+
filter: drop-shadow(0 0 2em #646cffaa);
+
}
+
.logo.react:hover {
+
filter: drop-shadow(0 0 2em #61dafbaa);
+
}
+
+
@keyframes logo-spin {
+
from {
+
transform: rotate(0deg);
+
}
+
to {
+
transform: rotate(360deg);
+
}
+
}
+
+
@media (prefers-reduced-motion: no-preference) {
+
a:nth-of-type(2) .logo {
+
animation: logo-spin infinite 20s linear;
+
}
+
}
+
+
.card {
+
padding: 2em;
+
}
+
+
.read-the-docs {
+
color: #888;
+
}
+27
src/App.tsx
···
+
import { Toaster } from "@/components/ui/toaster";
+
import { Toaster as Sonner } from "@/components/ui/sonner";
+
import { TooltipProvider } from "@/components/ui/tooltip";
+
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
+
import { BrowserRouter, Routes, Route } from "react-router-dom";
+
import Index from "./pages/Index";
+
import NotFound from "./pages/NotFound";
+
+
const queryClient = new QueryClient();
+
+
const App = () => (
+
<QueryClientProvider client={queryClient}>
+
<TooltipProvider>
+
<Toaster />
+
<Sonner />
+
<BrowserRouter>
+
<Routes>
+
<Route path="/" element={<Index />} />
+
{/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */}
+
<Route path="*" element={<NotFound />} />
+
</Routes>
+
</BrowserRouter>
+
</TooltipProvider>
+
</QueryClientProvider>
+
);
+
+
export default App;
+28
src/components/NavLink.tsx
···
+
import { NavLink as RouterNavLink, NavLinkProps } from "react-router-dom";
+
import { forwardRef } from "react";
+
import { cn } from "@/lib/utils";
+
+
interface NavLinkCompatProps extends Omit<NavLinkProps, "className"> {
+
className?: string;
+
activeClassName?: string;
+
pendingClassName?: string;
+
}
+
+
const NavLink = forwardRef<HTMLAnchorElement, NavLinkCompatProps>(
+
({ className, activeClassName, pendingClassName, to, ...props }, ref) => {
+
return (
+
<RouterNavLink
+
ref={ref}
+
to={to}
+
className={({ isActive, isPending }) =>
+
cn(className, isActive && activeClassName, isPending && pendingClassName)
+
}
+
{...props}
+
/>
+
);
+
},
+
);
+
+
NavLink.displayName = "NavLink";
+
+
export { NavLink };
+52
src/components/ui/accordion.tsx
···
+
import * as React from "react";
+
import * as AccordionPrimitive from "@radix-ui/react-accordion";
+
import { ChevronDown } from "lucide-react";
+
+
import { cn } from "@/lib/utils";
+
+
const Accordion = AccordionPrimitive.Root;
+
+
const AccordionItem = React.forwardRef<
+
React.ElementRef<typeof AccordionPrimitive.Item>,
+
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>
+
>(({ className, ...props }, ref) => (
+
<AccordionPrimitive.Item ref={ref} className={cn("border-b", className)} {...props} />
+
));
+
AccordionItem.displayName = "AccordionItem";
+
+
const AccordionTrigger = React.forwardRef<
+
React.ElementRef<typeof AccordionPrimitive.Trigger>,
+
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>
+
>(({ className, children, ...props }, ref) => (
+
<AccordionPrimitive.Header className="flex">
+
<AccordionPrimitive.Trigger
+
ref={ref}
+
className={cn(
+
"flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180",
+
className,
+
)}
+
{...props}
+
>
+
{children}
+
<ChevronDown className="h-4 w-4 shrink-0 transition-transform duration-200" />
+
</AccordionPrimitive.Trigger>
+
</AccordionPrimitive.Header>
+
));
+
AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
+
+
const AccordionContent = React.forwardRef<
+
React.ElementRef<typeof AccordionPrimitive.Content>,
+
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>
+
>(({ className, children, ...props }, ref) => (
+
<AccordionPrimitive.Content
+
ref={ref}
+
className="overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down"
+
{...props}
+
>
+
<div className={cn("pb-4 pt-0", className)}>{children}</div>
+
</AccordionPrimitive.Content>
+
));
+
+
AccordionContent.displayName = AccordionPrimitive.Content.displayName;
+
+
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
+104
src/components/ui/alert-dialog.tsx
···
+
import * as React from "react";
+
import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
+
+
import { cn } from "@/lib/utils";
+
import { buttonVariants } from "@/components/ui/button";
+
+
const AlertDialog = AlertDialogPrimitive.Root;
+
+
const AlertDialogTrigger = AlertDialogPrimitive.Trigger;
+
+
const AlertDialogPortal = AlertDialogPrimitive.Portal;
+
+
const AlertDialogOverlay = React.forwardRef<
+
React.ElementRef<typeof AlertDialogPrimitive.Overlay>,
+
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>
+
>(({ className, ...props }, ref) => (
+
<AlertDialogPrimitive.Overlay
+
className={cn(
+
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
+
className,
+
)}
+
{...props}
+
ref={ref}
+
/>
+
));
+
AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
+
+
const AlertDialogContent = React.forwardRef<
+
React.ElementRef<typeof AlertDialogPrimitive.Content>,
+
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>
+
>(({ className, ...props }, ref) => (
+
<AlertDialogPortal>
+
<AlertDialogOverlay />
+
<AlertDialogPrimitive.Content
+
ref={ref}
+
className={cn(
+
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
+
className,
+
)}
+
{...props}
+
/>
+
</AlertDialogPortal>
+
));
+
AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;
+
+
const AlertDialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
+
<div className={cn("flex flex-col space-y-2 text-center sm:text-left", className)} {...props} />
+
);
+
AlertDialogHeader.displayName = "AlertDialogHeader";
+
+
const AlertDialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
+
<div className={cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className)} {...props} />
+
);
+
AlertDialogFooter.displayName = "AlertDialogFooter";
+
+
const AlertDialogTitle = React.forwardRef<
+
React.ElementRef<typeof AlertDialogPrimitive.Title>,
+
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>
+
>(({ className, ...props }, ref) => (
+
<AlertDialogPrimitive.Title ref={ref} className={cn("text-lg font-semibold", className)} {...props} />
+
));
+
AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
+
+
const AlertDialogDescription = React.forwardRef<
+
React.ElementRef<typeof AlertDialogPrimitive.Description>,
+
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>
+
>(({ className, ...props }, ref) => (
+
<AlertDialogPrimitive.Description ref={ref} className={cn("text-sm text-muted-foreground", className)} {...props} />
+
));
+
AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;
+
+
const AlertDialogAction = React.forwardRef<
+
React.ElementRef<typeof AlertDialogPrimitive.Action>,
+
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>
+
>(({ className, ...props }, ref) => (
+
<AlertDialogPrimitive.Action ref={ref} className={cn(buttonVariants(), className)} {...props} />
+
));
+
AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
+
+
const AlertDialogCancel = React.forwardRef<
+
React.ElementRef<typeof AlertDialogPrimitive.Cancel>,
+
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>
+
>(({ className, ...props }, ref) => (
+
<AlertDialogPrimitive.Cancel
+
ref={ref}
+
className={cn(buttonVariants({ variant: "outline" }), "mt-2 sm:mt-0", className)}
+
{...props}
+
/>
+
));
+
AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;
+
+
export {
+
AlertDialog,
+
AlertDialogPortal,
+
AlertDialogOverlay,
+
AlertDialogTrigger,
+
AlertDialogContent,
+
AlertDialogHeader,
+
AlertDialogFooter,
+
AlertDialogTitle,
+
AlertDialogDescription,
+
AlertDialogAction,
+
AlertDialogCancel,
+
};
+43
src/components/ui/alert.tsx
···
+
import * as React from "react";
+
import { cva, type VariantProps } from "class-variance-authority";
+
+
import { cn } from "@/lib/utils";
+
+
const alertVariants = cva(
+
"relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground",
+
{
+
variants: {
+
variant: {
+
default: "bg-background text-foreground",
+
destructive: "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
+
},
+
},
+
defaultVariants: {
+
variant: "default",
+
},
+
},
+
);
+
+
const Alert = React.forwardRef<
+
HTMLDivElement,
+
React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>
+
>(({ className, variant, ...props }, ref) => (
+
<div ref={ref} role="alert" className={cn(alertVariants({ variant }), className)} {...props} />
+
));
+
Alert.displayName = "Alert";
+
+
const AlertTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(
+
({ className, ...props }, ref) => (
+
<h5 ref={ref} className={cn("mb-1 font-medium leading-none tracking-tight", className)} {...props} />
+
),
+
);
+
AlertTitle.displayName = "AlertTitle";
+
+
const AlertDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(
+
({ className, ...props }, ref) => (
+
<div ref={ref} className={cn("text-sm [&_p]:leading-relaxed", className)} {...props} />
+
),
+
);
+
AlertDescription.displayName = "AlertDescription";
+
+
export { Alert, AlertTitle, AlertDescription };
+5
src/components/ui/aspect-ratio.tsx
···
+
import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio";
+
+
const AspectRatio = AspectRatioPrimitive.Root;
+
+
export { AspectRatio };
+38
src/components/ui/avatar.tsx
···
+
import * as React from "react";
+
import * as AvatarPrimitive from "@radix-ui/react-avatar";
+
+
import { cn } from "@/lib/utils";
+
+
const Avatar = React.forwardRef<
+
React.ElementRef<typeof AvatarPrimitive.Root>,
+
React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>
+
>(({ className, ...props }, ref) => (
+
<AvatarPrimitive.Root
+
ref={ref}
+
className={cn("relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full", className)}
+
{...props}
+
/>
+
));
+
Avatar.displayName = AvatarPrimitive.Root.displayName;
+
+
const AvatarImage = React.forwardRef<
+
React.ElementRef<typeof AvatarPrimitive.Image>,
+
React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>
+
>(({ className, ...props }, ref) => (
+
<AvatarPrimitive.Image ref={ref} className={cn("aspect-square h-full w-full", className)} {...props} />
+
));
+
AvatarImage.displayName = AvatarPrimitive.Image.displayName;
+
+
const AvatarFallback = React.forwardRef<
+
React.ElementRef<typeof AvatarPrimitive.Fallback>,
+
React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>
+
>(({ className, ...props }, ref) => (
+
<AvatarPrimitive.Fallback
+
ref={ref}
+
className={cn("flex h-full w-full items-center justify-center rounded-full bg-muted", className)}
+
{...props}
+
/>
+
));
+
AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
+
+
export { Avatar, AvatarImage, AvatarFallback };
+29
src/components/ui/badge.tsx
···
+
import * as React from "react";
+
import { cva, type VariantProps } from "class-variance-authority";
+
+
import { cn } from "@/lib/utils";
+
+
const badgeVariants = cva(
+
"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
+
{
+
variants: {
+
variant: {
+
default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
+
secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
+
destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
+
outline: "text-foreground",
+
},
+
},
+
defaultVariants: {
+
variant: "default",
+
},
+
},
+
);
+
+
export interface BadgeProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {}
+
+
function Badge({ className, variant, ...props }: BadgeProps) {
+
return <div className={cn(badgeVariants({ variant }), className)} {...props} />;
+
}
+
+
export { Badge, badgeVariants };
+90
src/components/ui/breadcrumb.tsx
···
+
import * as React from "react";
+
import { Slot } from "@radix-ui/react-slot";
+
import { ChevronRight, MoreHorizontal } from "lucide-react";
+
+
import { cn } from "@/lib/utils";
+
+
const Breadcrumb = React.forwardRef<
+
HTMLElement,
+
React.ComponentPropsWithoutRef<"nav"> & {
+
separator?: React.ReactNode;
+
}
+
>(({ ...props }, ref) => <nav ref={ref} aria-label="breadcrumb" {...props} />);
+
Breadcrumb.displayName = "Breadcrumb";
+
+
const BreadcrumbList = React.forwardRef<HTMLOListElement, React.ComponentPropsWithoutRef<"ol">>(
+
({ className, ...props }, ref) => (
+
<ol
+
ref={ref}
+
className={cn(
+
"flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5",
+
className,
+
)}
+
{...props}
+
/>
+
),
+
);
+
BreadcrumbList.displayName = "BreadcrumbList";
+
+
const BreadcrumbItem = React.forwardRef<HTMLLIElement, React.ComponentPropsWithoutRef<"li">>(
+
({ className, ...props }, ref) => (
+
<li ref={ref} className={cn("inline-flex items-center gap-1.5", className)} {...props} />
+
),
+
);
+
BreadcrumbItem.displayName = "BreadcrumbItem";
+
+
const BreadcrumbLink = React.forwardRef<
+
HTMLAnchorElement,
+
React.ComponentPropsWithoutRef<"a"> & {
+
asChild?: boolean;
+
}
+
>(({ asChild, className, ...props }, ref) => {
+
const Comp = asChild ? Slot : "a";
+
+
return <Comp ref={ref} className={cn("transition-colors hover:text-foreground", className)} {...props} />;
+
});
+
BreadcrumbLink.displayName = "BreadcrumbLink";
+
+
const BreadcrumbPage = React.forwardRef<HTMLSpanElement, React.ComponentPropsWithoutRef<"span">>(
+
({ className, ...props }, ref) => (
+
<span
+
ref={ref}
+
role="link"
+
aria-disabled="true"
+
aria-current="page"
+
className={cn("font-normal text-foreground", className)}
+
{...props}
+
/>
+
),
+
);
+
BreadcrumbPage.displayName = "BreadcrumbPage";
+
+
const BreadcrumbSeparator = ({ children, className, ...props }: React.ComponentProps<"li">) => (
+
<li role="presentation" aria-hidden="true" className={cn("[&>svg]:size-3.5", className)} {...props}>
+
{children ?? <ChevronRight />}
+
</li>
+
);
+
BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
+
+
const BreadcrumbEllipsis = ({ className, ...props }: React.ComponentProps<"span">) => (
+
<span
+
role="presentation"
+
aria-hidden="true"
+
className={cn("flex h-9 w-9 items-center justify-center", className)}
+
{...props}
+
>
+
<MoreHorizontal className="h-4 w-4" />
+
<span className="sr-only">More</span>
+
</span>
+
);
+
BreadcrumbEllipsis.displayName = "BreadcrumbElipssis";
+
+
export {
+
Breadcrumb,
+
BreadcrumbList,
+
BreadcrumbItem,
+
BreadcrumbLink,
+
BreadcrumbPage,
+
BreadcrumbSeparator,
+
BreadcrumbEllipsis,
+
};
+47
src/components/ui/button.tsx
···
+
import * as React from "react";
+
import { Slot } from "@radix-ui/react-slot";
+
import { cva, type VariantProps } from "class-variance-authority";
+
+
import { cn } from "@/lib/utils";
+
+
const buttonVariants = cva(
+
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
+
{
+
variants: {
+
variant: {
+
default: "bg-primary text-primary-foreground hover:bg-primary/90",
+
destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
+
outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
+
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
+
ghost: "hover:bg-accent hover:text-accent-foreground",
+
link: "text-primary underline-offset-4 hover:underline",
+
},
+
size: {
+
default: "h-10 px-4 py-2",
+
sm: "h-9 rounded-md px-3",
+
lg: "h-11 rounded-md px-8",
+
icon: "h-10 w-10",
+
},
+
},
+
defaultVariants: {
+
variant: "default",
+
size: "default",
+
},
+
},
+
);
+
+
export interface ButtonProps
+
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
+
VariantProps<typeof buttonVariants> {
+
asChild?: boolean;
+
}
+
+
const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
+
({ className, variant, size, asChild = false, ...props }, ref) => {
+
const Comp = asChild ? Slot : "button";
+
return <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />;
+
},
+
);
+
Button.displayName = "Button";
+
+
export { Button, buttonVariants };
+54
src/components/ui/calendar.tsx
···
+
import * as React from "react";
+
import { ChevronLeft, ChevronRight } from "lucide-react";
+
import { DayPicker } from "react-day-picker";
+
+
import { cn } from "@/lib/utils";
+
import { buttonVariants } from "@/components/ui/button";
+
+
export type CalendarProps = React.ComponentProps<typeof DayPicker>;
+
+
function Calendar({ className, classNames, showOutsideDays = true, ...props }: CalendarProps) {
+
return (
+
<DayPicker
+
showOutsideDays={showOutsideDays}
+
className={cn("p-3", className)}
+
classNames={{
+
months: "flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0",
+
month: "space-y-4",
+
caption: "flex justify-center pt-1 relative items-center",
+
caption_label: "text-sm font-medium",
+
nav: "space-x-1 flex items-center",
+
nav_button: cn(
+
buttonVariants({ variant: "outline" }),
+
"h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100",
+
),
+
nav_button_previous: "absolute left-1",
+
nav_button_next: "absolute right-1",
+
table: "w-full border-collapse space-y-1",
+
head_row: "flex",
+
head_cell: "text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]",
+
row: "flex w-full mt-2",
+
cell: "h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20",
+
day: cn(buttonVariants({ variant: "ghost" }), "h-9 w-9 p-0 font-normal aria-selected:opacity-100"),
+
day_range_end: "day-range-end",
+
day_selected:
+
"bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground",
+
day_today: "bg-accent text-accent-foreground",
+
day_outside:
+
"day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 aria-selected:text-muted-foreground aria-selected:opacity-30",
+
day_disabled: "text-muted-foreground opacity-50",
+
day_range_middle: "aria-selected:bg-accent aria-selected:text-accent-foreground",
+
day_hidden: "invisible",
+
...classNames,
+
}}
+
components={{
+
IconLeft: ({ ..._props }) => <ChevronLeft className="h-4 w-4" />,
+
IconRight: ({ ..._props }) => <ChevronRight className="h-4 w-4" />,
+
}}
+
{...props}
+
/>
+
);
+
}
+
Calendar.displayName = "Calendar";
+
+
export { Calendar };
+43
src/components/ui/card.tsx
···
+
import * as React from "react";
+
+
import { cn } from "@/lib/utils";
+
+
const Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (
+
<div ref={ref} className={cn("rounded-lg border bg-card text-card-foreground shadow-sm", className)} {...props} />
+
));
+
Card.displayName = "Card";
+
+
const CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
+
({ className, ...props }, ref) => (
+
<div ref={ref} className={cn("flex flex-col space-y-1.5 p-6", className)} {...props} />
+
),
+
);
+
CardHeader.displayName = "CardHeader";
+
+
const CardTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(
+
({ className, ...props }, ref) => (
+
<h3 ref={ref} className={cn("text-2xl font-semibold leading-none tracking-tight", className)} {...props} />
+
),
+
);
+
CardTitle.displayName = "CardTitle";
+
+
const CardDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(
+
({ className, ...props }, ref) => (
+
<p ref={ref} className={cn("text-sm text-muted-foreground", className)} {...props} />
+
),
+
);
+
CardDescription.displayName = "CardDescription";
+
+
const CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
+
({ className, ...props }, ref) => <div ref={ref} className={cn("p-6 pt-0", className)} {...props} />,
+
);
+
CardContent.displayName = "CardContent";
+
+
const CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
+
({ className, ...props }, ref) => (
+
<div ref={ref} className={cn("flex items-center p-6 pt-0", className)} {...props} />
+
),
+
);
+
CardFooter.displayName = "CardFooter";
+
+
export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };
+224
src/components/ui/carousel.tsx
···
+
import * as React from "react";
+
import useEmblaCarousel, { type UseEmblaCarouselType } from "embla-carousel-react";
+
import { ArrowLeft, ArrowRight } from "lucide-react";
+
+
import { cn } from "@/lib/utils";
+
import { Button } from "@/components/ui/button";
+
+
type CarouselApi = UseEmblaCarouselType[1];
+
type UseCarouselParameters = Parameters<typeof useEmblaCarousel>;
+
type CarouselOptions = UseCarouselParameters[0];
+
type CarouselPlugin = UseCarouselParameters[1];
+
+
type CarouselProps = {
+
opts?: CarouselOptions;
+
plugins?: CarouselPlugin;
+
orientation?: "horizontal" | "vertical";
+
setApi?: (api: CarouselApi) => void;
+
};
+
+
type CarouselContextProps = {
+
carouselRef: ReturnType<typeof useEmblaCarousel>[0];
+
api: ReturnType<typeof useEmblaCarousel>[1];
+
scrollPrev: () => void;
+
scrollNext: () => void;
+
canScrollPrev: boolean;
+
canScrollNext: boolean;
+
} & CarouselProps;
+
+
const CarouselContext = React.createContext<CarouselContextProps | null>(null);
+
+
function useCarousel() {
+
const context = React.useContext(CarouselContext);
+
+
if (!context) {
+
throw new Error("useCarousel must be used within a <Carousel />");
+
}
+
+
return context;
+
}
+
+
const Carousel = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement> & CarouselProps>(
+
({ orientation = "horizontal", opts, setApi, plugins, className, children, ...props }, ref) => {
+
const [carouselRef, api] = useEmblaCarousel(
+
{
+
...opts,
+
axis: orientation === "horizontal" ? "x" : "y",
+
},
+
plugins,
+
);
+
const [canScrollPrev, setCanScrollPrev] = React.useState(false);
+
const [canScrollNext, setCanScrollNext] = React.useState(false);
+
+
const onSelect = React.useCallback((api: CarouselApi) => {
+
if (!api) {
+
return;
+
}
+
+
setCanScrollPrev(api.canScrollPrev());
+
setCanScrollNext(api.canScrollNext());
+
}, []);
+
+
const scrollPrev = React.useCallback(() => {
+
api?.scrollPrev();
+
}, [api]);
+
+
const scrollNext = React.useCallback(() => {
+
api?.scrollNext();
+
}, [api]);
+
+
const handleKeyDown = React.useCallback(
+
(event: React.KeyboardEvent<HTMLDivElement>) => {
+
if (event.key === "ArrowLeft") {
+
event.preventDefault();
+
scrollPrev();
+
} else if (event.key === "ArrowRight") {
+
event.preventDefault();
+
scrollNext();
+
}
+
},
+
[scrollPrev, scrollNext],
+
);
+
+
React.useEffect(() => {
+
if (!api || !setApi) {
+
return;
+
}
+
+
setApi(api);
+
}, [api, setApi]);
+
+
React.useEffect(() => {
+
if (!api) {
+
return;
+
}
+
+
onSelect(api);
+
api.on("reInit", onSelect);
+
api.on("select", onSelect);
+
+
return () => {
+
api?.off("select", onSelect);
+
};
+
}, [api, onSelect]);
+
+
return (
+
<CarouselContext.Provider
+
value={{
+
carouselRef,
+
api: api,
+
opts,
+
orientation: orientation || (opts?.axis === "y" ? "vertical" : "horizontal"),
+
scrollPrev,
+
scrollNext,
+
canScrollPrev,
+
canScrollNext,
+
}}
+
>
+
<div
+
ref={ref}
+
onKeyDownCapture={handleKeyDown}
+
className={cn("relative", className)}
+
role="region"
+
aria-roledescription="carousel"
+
{...props}
+
>
+
{children}
+
</div>
+
</CarouselContext.Provider>
+
);
+
},
+
);
+
Carousel.displayName = "Carousel";
+
+
const CarouselContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
+
({ className, ...props }, ref) => {
+
const { carouselRef, orientation } = useCarousel();
+
+
return (
+
<div ref={carouselRef} className="overflow-hidden">
+
<div
+
ref={ref}
+
className={cn("flex", orientation === "horizontal" ? "-ml-4" : "-mt-4 flex-col", className)}
+
{...props}
+
/>
+
</div>
+
);
+
},
+
);
+
CarouselContent.displayName = "CarouselContent";
+
+
const CarouselItem = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
+
({ className, ...props }, ref) => {
+
const { orientation } = useCarousel();
+
+
return (
+
<div
+
ref={ref}
+
role="group"
+
aria-roledescription="slide"
+
className={cn("min-w-0 shrink-0 grow-0 basis-full", orientation === "horizontal" ? "pl-4" : "pt-4", className)}
+
{...props}
+
/>
+
);
+
},
+
);
+
CarouselItem.displayName = "CarouselItem";
+
+
const CarouselPrevious = React.forwardRef<HTMLButtonElement, React.ComponentProps<typeof Button>>(
+
({ className, variant = "outline", size = "icon", ...props }, ref) => {
+
const { orientation, scrollPrev, canScrollPrev } = useCarousel();
+
+
return (
+
<Button
+
ref={ref}
+
variant={variant}
+
size={size}
+
className={cn(
+
"absolute h-8 w-8 rounded-full",
+
orientation === "horizontal"
+
? "-left-12 top-1/2 -translate-y-1/2"
+
: "-top-12 left-1/2 -translate-x-1/2 rotate-90",
+
className,
+
)}
+
disabled={!canScrollPrev}
+
onClick={scrollPrev}
+
{...props}
+
>
+
<ArrowLeft className="h-4 w-4" />
+
<span className="sr-only">Previous slide</span>
+
</Button>
+
);
+
},
+
);
+
CarouselPrevious.displayName = "CarouselPrevious";
+
+
const CarouselNext = React.forwardRef<HTMLButtonElement, React.ComponentProps<typeof Button>>(
+
({ className, variant = "outline", size = "icon", ...props }, ref) => {
+
const { orientation, scrollNext, canScrollNext } = useCarousel();
+
+
return (
+
<Button
+
ref={ref}
+
variant={variant}
+
size={size}
+
className={cn(
+
"absolute h-8 w-8 rounded-full",
+
orientation === "horizontal"
+
? "-right-12 top-1/2 -translate-y-1/2"
+
: "-bottom-12 left-1/2 -translate-x-1/2 rotate-90",
+
className,
+
)}
+
disabled={!canScrollNext}
+
onClick={scrollNext}
+
{...props}
+
>
+
<ArrowRight className="h-4 w-4" />
+
<span className="sr-only">Next slide</span>
+
</Button>
+
);
+
},
+
);
+
CarouselNext.displayName = "CarouselNext";
+
+
export { type CarouselApi, Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext };
+303
src/components/ui/chart.tsx
···
+
import * as React from "react";
+
import * as RechartsPrimitive from "recharts";
+
+
import { cn } from "@/lib/utils";
+
+
// Format: { THEME_NAME: CSS_SELECTOR }
+
const THEMES = { light: "", dark: ".dark" } as const;
+
+
export type ChartConfig = {
+
[k in string]: {
+
label?: React.ReactNode;
+
icon?: React.ComponentType;
+
} & ({ color?: string; theme?: never } | { color?: never; theme: Record<keyof typeof THEMES, string> });
+
};
+
+
type ChartContextProps = {
+
config: ChartConfig;
+
};
+
+
const ChartContext = React.createContext<ChartContextProps | null>(null);
+
+
function useChart() {
+
const context = React.useContext(ChartContext);
+
+
if (!context) {
+
throw new Error("useChart must be used within a <ChartContainer />");
+
}
+
+
return context;
+
}
+
+
const ChartContainer = React.forwardRef<
+
HTMLDivElement,
+
React.ComponentProps<"div"> & {
+
config: ChartConfig;
+
children: React.ComponentProps<typeof RechartsPrimitive.ResponsiveContainer>["children"];
+
}
+
>(({ id, className, children, config, ...props }, ref) => {
+
const uniqueId = React.useId();
+
const chartId = `chart-${id || uniqueId.replace(/:/g, "")}`;
+
+
return (
+
<ChartContext.Provider value={{ config }}>
+
<div
+
data-chart={chartId}
+
ref={ref}
+
className={cn(
+
"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none",
+
className,
+
)}
+
{...props}
+
>
+
<ChartStyle id={chartId} config={config} />
+
<RechartsPrimitive.ResponsiveContainer>{children}</RechartsPrimitive.ResponsiveContainer>
+
</div>
+
</ChartContext.Provider>
+
);
+
});
+
ChartContainer.displayName = "Chart";
+
+
const ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {
+
const colorConfig = Object.entries(config).filter(([_, config]) => config.theme || config.color);
+
+
if (!colorConfig.length) {
+
return null;
+
}
+
+
return (
+
<style
+
dangerouslySetInnerHTML={{
+
__html: Object.entries(THEMES)
+
.map(
+
([theme, prefix]) => `
+
${prefix} [data-chart=${id}] {
+
${colorConfig
+
.map(([key, itemConfig]) => {
+
const color = itemConfig.theme?.[theme as keyof typeof itemConfig.theme] || itemConfig.color;
+
return color ? ` --color-${key}: ${color};` : null;
+
})
+
.join("\n")}
+
}
+
`,
+
)
+
.join("\n"),
+
}}
+
/>
+
);
+
};
+
+
const ChartTooltip = RechartsPrimitive.Tooltip;
+
+
const ChartTooltipContent = React.forwardRef<
+
HTMLDivElement,
+
React.ComponentProps<typeof RechartsPrimitive.Tooltip> &
+
React.ComponentProps<"div"> & {
+
hideLabel?: boolean;
+
hideIndicator?: boolean;
+
indicator?: "line" | "dot" | "dashed";
+
nameKey?: string;
+
labelKey?: string;
+
}
+
>(
+
(
+
{
+
active,
+
payload,
+
className,
+
indicator = "dot",
+
hideLabel = false,
+
hideIndicator = false,
+
label,
+
labelFormatter,
+
labelClassName,
+
formatter,
+
color,
+
nameKey,
+
labelKey,
+
},
+
ref,
+
) => {
+
const { config } = useChart();
+
+
const tooltipLabel = React.useMemo(() => {
+
if (hideLabel || !payload?.length) {
+
return null;
+
}
+
+
const [item] = payload;
+
const key = `${labelKey || item.dataKey || item.name || "value"}`;
+
const itemConfig = getPayloadConfigFromPayload(config, item, key);
+
const value =
+
!labelKey && typeof label === "string"
+
? config[label as keyof typeof config]?.label || label
+
: itemConfig?.label;
+
+
if (labelFormatter) {
+
return <div className={cn("font-medium", labelClassName)}>{labelFormatter(value, payload)}</div>;
+
}
+
+
if (!value) {
+
return null;
+
}
+
+
return <div className={cn("font-medium", labelClassName)}>{value}</div>;
+
}, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey]);
+
+
if (!active || !payload?.length) {
+
return null;
+
}
+
+
const nestLabel = payload.length === 1 && indicator !== "dot";
+
+
return (
+
<div
+
ref={ref}
+
className={cn(
+
"grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl",
+
className,
+
)}
+
>
+
{!nestLabel ? tooltipLabel : null}
+
<div className="grid gap-1.5">
+
{payload.map((item, index) => {
+
const key = `${nameKey || item.name || item.dataKey || "value"}`;
+
const itemConfig = getPayloadConfigFromPayload(config, item, key);
+
const indicatorColor = color || item.payload.fill || item.color;
+
+
return (
+
<div
+
key={item.dataKey}
+
className={cn(
+
"flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground",
+
indicator === "dot" && "items-center",
+
)}
+
>
+
{formatter && item?.value !== undefined && item.name ? (
+
formatter(item.value, item.name, item, index, item.payload)
+
) : (
+
<>
+
{itemConfig?.icon ? (
+
<itemConfig.icon />
+
) : (
+
!hideIndicator && (
+
<div
+
className={cn("shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]", {
+
"h-2.5 w-2.5": indicator === "dot",
+
"w-1": indicator === "line",
+
"w-0 border-[1.5px] border-dashed bg-transparent": indicator === "dashed",
+
"my-0.5": nestLabel && indicator === "dashed",
+
})}
+
style={
+
{
+
"--color-bg": indicatorColor,
+
"--color-border": indicatorColor,
+
} as React.CSSProperties
+
}
+
/>
+
)
+
)}
+
<div
+
className={cn(
+
"flex flex-1 justify-between leading-none",
+
nestLabel ? "items-end" : "items-center",
+
)}
+
>
+
<div className="grid gap-1.5">
+
{nestLabel ? tooltipLabel : null}
+
<span className="text-muted-foreground">{itemConfig?.label || item.name}</span>
+
</div>
+
{item.value && (
+
<span className="font-mono font-medium tabular-nums text-foreground">
+
{item.value.toLocaleString()}
+
</span>
+
)}
+
</div>
+
</>
+
)}
+
</div>
+
);
+
})}
+
</div>
+
</div>
+
);
+
},
+
);
+
ChartTooltipContent.displayName = "ChartTooltip";
+
+
const ChartLegend = RechartsPrimitive.Legend;
+
+
const ChartLegendContent = React.forwardRef<
+
HTMLDivElement,
+
React.ComponentProps<"div"> &
+
Pick<RechartsPrimitive.LegendProps, "payload" | "verticalAlign"> & {
+
hideIcon?: boolean;
+
nameKey?: string;
+
}
+
>(({ className, hideIcon = false, payload, verticalAlign = "bottom", nameKey }, ref) => {
+
const { config } = useChart();
+
+
if (!payload?.length) {
+
return null;
+
}
+
+
return (
+
<div
+
ref={ref}
+
className={cn("flex items-center justify-center gap-4", verticalAlign === "top" ? "pb-3" : "pt-3", className)}
+
>
+
{payload.map((item) => {
+
const key = `${nameKey || item.dataKey || "value"}`;
+
const itemConfig = getPayloadConfigFromPayload(config, item, key);
+
+
return (
+
<div
+
key={item.value}
+
className={cn("flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground")}
+
>
+
{itemConfig?.icon && !hideIcon ? (
+
<itemConfig.icon />
+
) : (
+
<div
+
className="h-2 w-2 shrink-0 rounded-[2px]"
+
style={{
+
backgroundColor: item.color,
+
}}
+
/>
+
)}
+
{itemConfig?.label}
+
</div>
+
);
+
})}
+
</div>
+
);
+
});
+
ChartLegendContent.displayName = "ChartLegend";
+
+
// Helper to extract item config from a payload.
+
function getPayloadConfigFromPayload(config: ChartConfig, payload: unknown, key: string) {
+
if (typeof payload !== "object" || payload === null) {
+
return undefined;
+
}
+
+
const payloadPayload =
+
"payload" in payload && typeof payload.payload === "object" && payload.payload !== null
+
? payload.payload
+
: undefined;
+
+
let configLabelKey: string = key;
+
+
if (key in payload && typeof payload[key as keyof typeof payload] === "string") {
+
configLabelKey = payload[key as keyof typeof payload] as string;
+
} else if (
+
payloadPayload &&
+
key in payloadPayload &&
+
typeof payloadPayload[key as keyof typeof payloadPayload] === "string"
+
) {
+
configLabelKey = payloadPayload[key as keyof typeof payloadPayload] as string;
+
}
+
+
return configLabelKey in config ? config[configLabelKey] : config[key as keyof typeof config];
+
}
+
+
export { ChartContainer, ChartTooltip, ChartTooltipContent, ChartLegend, ChartLegendContent, ChartStyle };
+26
src/components/ui/checkbox.tsx
···
+
import * as React from "react";
+
import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
+
import { Check } from "lucide-react";
+
+
import { cn } from "@/lib/utils";
+
+
const Checkbox = React.forwardRef<
+
React.ElementRef<typeof CheckboxPrimitive.Root>,
+
React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>
+
>(({ className, ...props }, ref) => (
+
<CheckboxPrimitive.Root
+
ref={ref}
+
className={cn(
+
"peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
+
className,
+
)}
+
{...props}
+
>
+
<CheckboxPrimitive.Indicator className={cn("flex items-center justify-center text-current")}>
+
<Check className="h-4 w-4" />
+
</CheckboxPrimitive.Indicator>
+
</CheckboxPrimitive.Root>
+
));
+
Checkbox.displayName = CheckboxPrimitive.Root.displayName;
+
+
export { Checkbox };
+9
src/components/ui/collapsible.tsx
···
+
import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
+
+
const Collapsible = CollapsiblePrimitive.Root;
+
+
const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;
+
+
const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;
+
+
export { Collapsible, CollapsibleTrigger, CollapsibleContent };
+132
src/components/ui/command.tsx
···
+
import * as React from "react";
+
import { type DialogProps } from "@radix-ui/react-dialog";
+
import { Command as CommandPrimitive } from "cmdk";
+
import { Search } from "lucide-react";
+
+
import { cn } from "@/lib/utils";
+
import { Dialog, DialogContent } from "@/components/ui/dialog";
+
+
const Command = React.forwardRef<
+
React.ElementRef<typeof CommandPrimitive>,
+
React.ComponentPropsWithoutRef<typeof CommandPrimitive>
+
>(({ className, ...props }, ref) => (
+
<CommandPrimitive
+
ref={ref}
+
className={cn(
+
"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
Command.displayName = CommandPrimitive.displayName;
+
+
interface CommandDialogProps extends DialogProps {}
+
+
const CommandDialog = ({ children, ...props }: CommandDialogProps) => {
+
return (
+
<Dialog {...props}>
+
<DialogContent className="overflow-hidden p-0 shadow-lg">
+
<Command className="[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5">
+
{children}
+
</Command>
+
</DialogContent>
+
</Dialog>
+
);
+
};
+
+
const CommandInput = React.forwardRef<
+
React.ElementRef<typeof CommandPrimitive.Input>,
+
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>
+
>(({ className, ...props }, ref) => (
+
<div className="flex items-center border-b px-3" cmdk-input-wrapper="">
+
<Search className="mr-2 h-4 w-4 shrink-0 opacity-50" />
+
<CommandPrimitive.Input
+
ref={ref}
+
className={cn(
+
"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
+
className,
+
)}
+
{...props}
+
/>
+
</div>
+
));
+
+
CommandInput.displayName = CommandPrimitive.Input.displayName;
+
+
const CommandList = React.forwardRef<
+
React.ElementRef<typeof CommandPrimitive.List>,
+
React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>
+
>(({ className, ...props }, ref) => (
+
<CommandPrimitive.List
+
ref={ref}
+
className={cn("max-h-[300px] overflow-y-auto overflow-x-hidden", className)}
+
{...props}
+
/>
+
));
+
+
CommandList.displayName = CommandPrimitive.List.displayName;
+
+
const CommandEmpty = React.forwardRef<
+
React.ElementRef<typeof CommandPrimitive.Empty>,
+
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>
+
>((props, ref) => <CommandPrimitive.Empty ref={ref} className="py-6 text-center text-sm" {...props} />);
+
+
CommandEmpty.displayName = CommandPrimitive.Empty.displayName;
+
+
const CommandGroup = React.forwardRef<
+
React.ElementRef<typeof CommandPrimitive.Group>,
+
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>
+
>(({ className, ...props }, ref) => (
+
<CommandPrimitive.Group
+
ref={ref}
+
className={cn(
+
"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
+
CommandGroup.displayName = CommandPrimitive.Group.displayName;
+
+
const CommandSeparator = React.forwardRef<
+
React.ElementRef<typeof CommandPrimitive.Separator>,
+
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>
+
>(({ className, ...props }, ref) => (
+
<CommandPrimitive.Separator ref={ref} className={cn("-mx-1 h-px bg-border", className)} {...props} />
+
));
+
CommandSeparator.displayName = CommandPrimitive.Separator.displayName;
+
+
const CommandItem = React.forwardRef<
+
React.ElementRef<typeof CommandPrimitive.Item>,
+
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>
+
>(({ className, ...props }, ref) => (
+
<CommandPrimitive.Item
+
ref={ref}
+
className={cn(
+
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected='true']:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
+
CommandItem.displayName = CommandPrimitive.Item.displayName;
+
+
const CommandShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {
+
return <span className={cn("ml-auto text-xs tracking-widest text-muted-foreground", className)} {...props} />;
+
};
+
CommandShortcut.displayName = "CommandShortcut";
+
+
export {
+
Command,
+
CommandDialog,
+
CommandInput,
+
CommandList,
+
CommandEmpty,
+
CommandGroup,
+
CommandItem,
+
CommandShortcut,
+
CommandSeparator,
+
};
+178
src/components/ui/context-menu.tsx
···
+
import * as React from "react";
+
import * as ContextMenuPrimitive from "@radix-ui/react-context-menu";
+
import { Check, ChevronRight, Circle } from "lucide-react";
+
+
import { cn } from "@/lib/utils";
+
+
const ContextMenu = ContextMenuPrimitive.Root;
+
+
const ContextMenuTrigger = ContextMenuPrimitive.Trigger;
+
+
const ContextMenuGroup = ContextMenuPrimitive.Group;
+
+
const ContextMenuPortal = ContextMenuPrimitive.Portal;
+
+
const ContextMenuSub = ContextMenuPrimitive.Sub;
+
+
const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;
+
+
const ContextMenuSubTrigger = React.forwardRef<
+
React.ElementRef<typeof ContextMenuPrimitive.SubTrigger>,
+
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger> & {
+
inset?: boolean;
+
}
+
>(({ className, inset, children, ...props }, ref) => (
+
<ContextMenuPrimitive.SubTrigger
+
ref={ref}
+
className={cn(
+
"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[state=open]:bg-accent data-[state=open]:text-accent-foreground focus:bg-accent focus:text-accent-foreground",
+
inset && "pl-8",
+
className,
+
)}
+
{...props}
+
>
+
{children}
+
<ChevronRight className="ml-auto h-4 w-4" />
+
</ContextMenuPrimitive.SubTrigger>
+
));
+
ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName;
+
+
const ContextMenuSubContent = React.forwardRef<
+
React.ElementRef<typeof ContextMenuPrimitive.SubContent>,
+
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubContent>
+
>(({ className, ...props }, ref) => (
+
<ContextMenuPrimitive.SubContent
+
ref={ref}
+
className={cn(
+
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName;
+
+
const ContextMenuContent = React.forwardRef<
+
React.ElementRef<typeof ContextMenuPrimitive.Content>,
+
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Content>
+
>(({ className, ...props }, ref) => (
+
<ContextMenuPrimitive.Portal>
+
<ContextMenuPrimitive.Content
+
ref={ref}
+
className={cn(
+
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
+
className,
+
)}
+
{...props}
+
/>
+
</ContextMenuPrimitive.Portal>
+
));
+
ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName;
+
+
const ContextMenuItem = React.forwardRef<
+
React.ElementRef<typeof ContextMenuPrimitive.Item>,
+
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Item> & {
+
inset?: boolean;
+
}
+
>(({ className, inset, ...props }, ref) => (
+
<ContextMenuPrimitive.Item
+
ref={ref}
+
className={cn(
+
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground",
+
inset && "pl-8",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName;
+
+
const ContextMenuCheckboxItem = React.forwardRef<
+
React.ElementRef<typeof ContextMenuPrimitive.CheckboxItem>,
+
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.CheckboxItem>
+
>(({ className, children, checked, ...props }, ref) => (
+
<ContextMenuPrimitive.CheckboxItem
+
ref={ref}
+
className={cn(
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground",
+
className,
+
)}
+
checked={checked}
+
{...props}
+
>
+
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
+
<ContextMenuPrimitive.ItemIndicator>
+
<Check className="h-4 w-4" />
+
</ContextMenuPrimitive.ItemIndicator>
+
</span>
+
{children}
+
</ContextMenuPrimitive.CheckboxItem>
+
));
+
ContextMenuCheckboxItem.displayName = ContextMenuPrimitive.CheckboxItem.displayName;
+
+
const ContextMenuRadioItem = React.forwardRef<
+
React.ElementRef<typeof ContextMenuPrimitive.RadioItem>,
+
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.RadioItem>
+
>(({ className, children, ...props }, ref) => (
+
<ContextMenuPrimitive.RadioItem
+
ref={ref}
+
className={cn(
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground",
+
className,
+
)}
+
{...props}
+
>
+
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
+
<ContextMenuPrimitive.ItemIndicator>
+
<Circle className="h-2 w-2 fill-current" />
+
</ContextMenuPrimitive.ItemIndicator>
+
</span>
+
{children}
+
</ContextMenuPrimitive.RadioItem>
+
));
+
ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName;
+
+
const ContextMenuLabel = React.forwardRef<
+
React.ElementRef<typeof ContextMenuPrimitive.Label>,
+
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Label> & {
+
inset?: boolean;
+
}
+
>(({ className, inset, ...props }, ref) => (
+
<ContextMenuPrimitive.Label
+
ref={ref}
+
className={cn("px-2 py-1.5 text-sm font-semibold text-foreground", inset && "pl-8", className)}
+
{...props}
+
/>
+
));
+
ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName;
+
+
const ContextMenuSeparator = React.forwardRef<
+
React.ElementRef<typeof ContextMenuPrimitive.Separator>,
+
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Separator>
+
>(({ className, ...props }, ref) => (
+
<ContextMenuPrimitive.Separator ref={ref} className={cn("-mx-1 my-1 h-px bg-border", className)} {...props} />
+
));
+
ContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName;
+
+
const ContextMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {
+
return <span className={cn("ml-auto text-xs tracking-widest text-muted-foreground", className)} {...props} />;
+
};
+
ContextMenuShortcut.displayName = "ContextMenuShortcut";
+
+
export {
+
ContextMenu,
+
ContextMenuTrigger,
+
ContextMenuContent,
+
ContextMenuItem,
+
ContextMenuCheckboxItem,
+
ContextMenuRadioItem,
+
ContextMenuLabel,
+
ContextMenuSeparator,
+
ContextMenuShortcut,
+
ContextMenuGroup,
+
ContextMenuPortal,
+
ContextMenuSub,
+
ContextMenuSubContent,
+
ContextMenuSubTrigger,
+
ContextMenuRadioGroup,
+
};
+95
src/components/ui/dialog.tsx
···
+
import * as React from "react";
+
import * as DialogPrimitive from "@radix-ui/react-dialog";
+
import { X } from "lucide-react";
+
+
import { cn } from "@/lib/utils";
+
+
const Dialog = DialogPrimitive.Root;
+
+
const DialogTrigger = DialogPrimitive.Trigger;
+
+
const DialogPortal = DialogPrimitive.Portal;
+
+
const DialogClose = DialogPrimitive.Close;
+
+
const DialogOverlay = React.forwardRef<
+
React.ElementRef<typeof DialogPrimitive.Overlay>,
+
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
+
>(({ className, ...props }, ref) => (
+
<DialogPrimitive.Overlay
+
ref={ref}
+
className={cn(
+
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
+
+
const DialogContent = React.forwardRef<
+
React.ElementRef<typeof DialogPrimitive.Content>,
+
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>
+
>(({ className, children, ...props }, ref) => (
+
<DialogPortal>
+
<DialogOverlay />
+
<DialogPrimitive.Content
+
ref={ref}
+
className={cn(
+
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
+
className,
+
)}
+
{...props}
+
>
+
{children}
+
<DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity data-[state=open]:bg-accent data-[state=open]:text-muted-foreground hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none">
+
<X className="h-4 w-4" />
+
<span className="sr-only">Close</span>
+
</DialogPrimitive.Close>
+
</DialogPrimitive.Content>
+
</DialogPortal>
+
));
+
DialogContent.displayName = DialogPrimitive.Content.displayName;
+
+
const DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
+
<div className={cn("flex flex-col space-y-1.5 text-center sm:text-left", className)} {...props} />
+
);
+
DialogHeader.displayName = "DialogHeader";
+
+
const DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
+
<div className={cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className)} {...props} />
+
);
+
DialogFooter.displayName = "DialogFooter";
+
+
const DialogTitle = React.forwardRef<
+
React.ElementRef<typeof DialogPrimitive.Title>,
+
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>
+
>(({ className, ...props }, ref) => (
+
<DialogPrimitive.Title
+
ref={ref}
+
className={cn("text-lg font-semibold leading-none tracking-tight", className)}
+
{...props}
+
/>
+
));
+
DialogTitle.displayName = DialogPrimitive.Title.displayName;
+
+
const DialogDescription = React.forwardRef<
+
React.ElementRef<typeof DialogPrimitive.Description>,
+
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>
+
>(({ className, ...props }, ref) => (
+
<DialogPrimitive.Description ref={ref} className={cn("text-sm text-muted-foreground", className)} {...props} />
+
));
+
DialogDescription.displayName = DialogPrimitive.Description.displayName;
+
+
export {
+
Dialog,
+
DialogPortal,
+
DialogOverlay,
+
DialogClose,
+
DialogTrigger,
+
DialogContent,
+
DialogHeader,
+
DialogFooter,
+
DialogTitle,
+
DialogDescription,
+
};
+87
src/components/ui/drawer.tsx
···
+
import * as React from "react";
+
import { Drawer as DrawerPrimitive } from "vaul";
+
+
import { cn } from "@/lib/utils";
+
+
const Drawer = ({ shouldScaleBackground = true, ...props }: React.ComponentProps<typeof DrawerPrimitive.Root>) => (
+
<DrawerPrimitive.Root shouldScaleBackground={shouldScaleBackground} {...props} />
+
);
+
Drawer.displayName = "Drawer";
+
+
const DrawerTrigger = DrawerPrimitive.Trigger;
+
+
const DrawerPortal = DrawerPrimitive.Portal;
+
+
const DrawerClose = DrawerPrimitive.Close;
+
+
const DrawerOverlay = React.forwardRef<
+
React.ElementRef<typeof DrawerPrimitive.Overlay>,
+
React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Overlay>
+
>(({ className, ...props }, ref) => (
+
<DrawerPrimitive.Overlay ref={ref} className={cn("fixed inset-0 z-50 bg-black/80", className)} {...props} />
+
));
+
DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName;
+
+
const DrawerContent = React.forwardRef<
+
React.ElementRef<typeof DrawerPrimitive.Content>,
+
React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Content>
+
>(({ className, children, ...props }, ref) => (
+
<DrawerPortal>
+
<DrawerOverlay />
+
<DrawerPrimitive.Content
+
ref={ref}
+
className={cn(
+
"fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border bg-background",
+
className,
+
)}
+
{...props}
+
>
+
<div className="mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted" />
+
{children}
+
</DrawerPrimitive.Content>
+
</DrawerPortal>
+
));
+
DrawerContent.displayName = "DrawerContent";
+
+
const DrawerHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
+
<div className={cn("grid gap-1.5 p-4 text-center sm:text-left", className)} {...props} />
+
);
+
DrawerHeader.displayName = "DrawerHeader";
+
+
const DrawerFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
+
<div className={cn("mt-auto flex flex-col gap-2 p-4", className)} {...props} />
+
);
+
DrawerFooter.displayName = "DrawerFooter";
+
+
const DrawerTitle = React.forwardRef<
+
React.ElementRef<typeof DrawerPrimitive.Title>,
+
React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Title>
+
>(({ className, ...props }, ref) => (
+
<DrawerPrimitive.Title
+
ref={ref}
+
className={cn("text-lg font-semibold leading-none tracking-tight", className)}
+
{...props}
+
/>
+
));
+
DrawerTitle.displayName = DrawerPrimitive.Title.displayName;
+
+
const DrawerDescription = React.forwardRef<
+
React.ElementRef<typeof DrawerPrimitive.Description>,
+
React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Description>
+
>(({ className, ...props }, ref) => (
+
<DrawerPrimitive.Description ref={ref} className={cn("text-sm text-muted-foreground", className)} {...props} />
+
));
+
DrawerDescription.displayName = DrawerPrimitive.Description.displayName;
+
+
export {
+
Drawer,
+
DrawerPortal,
+
DrawerOverlay,
+
DrawerTrigger,
+
DrawerClose,
+
DrawerContent,
+
DrawerHeader,
+
DrawerFooter,
+
DrawerTitle,
+
DrawerDescription,
+
};
+179
src/components/ui/dropdown-menu.tsx
···
+
import * as React from "react";
+
import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
+
import { Check, ChevronRight, Circle } from "lucide-react";
+
+
import { cn } from "@/lib/utils";
+
+
const DropdownMenu = DropdownMenuPrimitive.Root;
+
+
const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
+
+
const DropdownMenuGroup = DropdownMenuPrimitive.Group;
+
+
const DropdownMenuPortal = DropdownMenuPrimitive.Portal;
+
+
const DropdownMenuSub = DropdownMenuPrimitive.Sub;
+
+
const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
+
+
const DropdownMenuSubTrigger = React.forwardRef<
+
React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {
+
inset?: boolean;
+
}
+
>(({ className, inset, children, ...props }, ref) => (
+
<DropdownMenuPrimitive.SubTrigger
+
ref={ref}
+
className={cn(
+
"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[state=open]:bg-accent focus:bg-accent",
+
inset && "pl-8",
+
className,
+
)}
+
{...props}
+
>
+
{children}
+
<ChevronRight className="ml-auto h-4 w-4" />
+
</DropdownMenuPrimitive.SubTrigger>
+
));
+
DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
+
+
const DropdownMenuSubContent = React.forwardRef<
+
React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>
+
>(({ className, ...props }, ref) => (
+
<DropdownMenuPrimitive.SubContent
+
ref={ref}
+
className={cn(
+
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
+
+
const DropdownMenuContent = React.forwardRef<
+
React.ElementRef<typeof DropdownMenuPrimitive.Content>,
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>
+
>(({ className, sideOffset = 4, ...props }, ref) => (
+
<DropdownMenuPrimitive.Portal>
+
<DropdownMenuPrimitive.Content
+
ref={ref}
+
sideOffset={sideOffset}
+
className={cn(
+
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
+
className,
+
)}
+
{...props}
+
/>
+
</DropdownMenuPrimitive.Portal>
+
));
+
DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
+
+
const DropdownMenuItem = React.forwardRef<
+
React.ElementRef<typeof DropdownMenuPrimitive.Item>,
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {
+
inset?: boolean;
+
}
+
>(({ className, inset, ...props }, ref) => (
+
<DropdownMenuPrimitive.Item
+
ref={ref}
+
className={cn(
+
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground",
+
inset && "pl-8",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
+
+
const DropdownMenuCheckboxItem = React.forwardRef<
+
React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>
+
>(({ className, children, checked, ...props }, ref) => (
+
<DropdownMenuPrimitive.CheckboxItem
+
ref={ref}
+
className={cn(
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground",
+
className,
+
)}
+
checked={checked}
+
{...props}
+
>
+
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
+
<DropdownMenuPrimitive.ItemIndicator>
+
<Check className="h-4 w-4" />
+
</DropdownMenuPrimitive.ItemIndicator>
+
</span>
+
{children}
+
</DropdownMenuPrimitive.CheckboxItem>
+
));
+
DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
+
+
const DropdownMenuRadioItem = React.forwardRef<
+
React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>
+
>(({ className, children, ...props }, ref) => (
+
<DropdownMenuPrimitive.RadioItem
+
ref={ref}
+
className={cn(
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground",
+
className,
+
)}
+
{...props}
+
>
+
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
+
<DropdownMenuPrimitive.ItemIndicator>
+
<Circle className="h-2 w-2 fill-current" />
+
</DropdownMenuPrimitive.ItemIndicator>
+
</span>
+
{children}
+
</DropdownMenuPrimitive.RadioItem>
+
));
+
DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
+
+
const DropdownMenuLabel = React.forwardRef<
+
React.ElementRef<typeof DropdownMenuPrimitive.Label>,
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {
+
inset?: boolean;
+
}
+
>(({ className, inset, ...props }, ref) => (
+
<DropdownMenuPrimitive.Label
+
ref={ref}
+
className={cn("px-2 py-1.5 text-sm font-semibold", inset && "pl-8", className)}
+
{...props}
+
/>
+
));
+
DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
+
+
const DropdownMenuSeparator = React.forwardRef<
+
React.ElementRef<typeof DropdownMenuPrimitive.Separator>,
+
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>
+
>(({ className, ...props }, ref) => (
+
<DropdownMenuPrimitive.Separator ref={ref} className={cn("-mx-1 my-1 h-px bg-muted", className)} {...props} />
+
));
+
DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
+
+
const DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {
+
return <span className={cn("ml-auto text-xs tracking-widest opacity-60", className)} {...props} />;
+
};
+
DropdownMenuShortcut.displayName = "DropdownMenuShortcut";
+
+
export {
+
DropdownMenu,
+
DropdownMenuTrigger,
+
DropdownMenuContent,
+
DropdownMenuItem,
+
DropdownMenuCheckboxItem,
+
DropdownMenuRadioItem,
+
DropdownMenuLabel,
+
DropdownMenuSeparator,
+
DropdownMenuShortcut,
+
DropdownMenuGroup,
+
DropdownMenuPortal,
+
DropdownMenuSub,
+
DropdownMenuSubContent,
+
DropdownMenuSubTrigger,
+
DropdownMenuRadioGroup,
+
};
+129
src/components/ui/form.tsx
···
+
import * as React from "react";
+
import * as LabelPrimitive from "@radix-ui/react-label";
+
import { Slot } from "@radix-ui/react-slot";
+
import { Controller, ControllerProps, FieldPath, FieldValues, FormProvider, useFormContext } from "react-hook-form";
+
+
import { cn } from "@/lib/utils";
+
import { Label } from "@/components/ui/label";
+
+
const Form = FormProvider;
+
+
type FormFieldContextValue<
+
TFieldValues extends FieldValues = FieldValues,
+
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
+
> = {
+
name: TName;
+
};
+
+
const FormFieldContext = React.createContext<FormFieldContextValue>({} as FormFieldContextValue);
+
+
const FormField = <
+
TFieldValues extends FieldValues = FieldValues,
+
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
+
>({
+
...props
+
}: ControllerProps<TFieldValues, TName>) => {
+
return (
+
<FormFieldContext.Provider value={{ name: props.name }}>
+
<Controller {...props} />
+
</FormFieldContext.Provider>
+
);
+
};
+
+
const useFormField = () => {
+
const fieldContext = React.useContext(FormFieldContext);
+
const itemContext = React.useContext(FormItemContext);
+
const { getFieldState, formState } = useFormContext();
+
+
const fieldState = getFieldState(fieldContext.name, formState);
+
+
if (!fieldContext) {
+
throw new Error("useFormField should be used within <FormField>");
+
}
+
+
const { id } = itemContext;
+
+
return {
+
id,
+
name: fieldContext.name,
+
formItemId: `${id}-form-item`,
+
formDescriptionId: `${id}-form-item-description`,
+
formMessageId: `${id}-form-item-message`,
+
...fieldState,
+
};
+
};
+
+
type FormItemContextValue = {
+
id: string;
+
};
+
+
const FormItemContext = React.createContext<FormItemContextValue>({} as FormItemContextValue);
+
+
const FormItem = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
+
({ className, ...props }, ref) => {
+
const id = React.useId();
+
+
return (
+
<FormItemContext.Provider value={{ id }}>
+
<div ref={ref} className={cn("space-y-2", className)} {...props} />
+
</FormItemContext.Provider>
+
);
+
},
+
);
+
FormItem.displayName = "FormItem";
+
+
const FormLabel = React.forwardRef<
+
React.ElementRef<typeof LabelPrimitive.Root>,
+
React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>
+
>(({ className, ...props }, ref) => {
+
const { error, formItemId } = useFormField();
+
+
return <Label ref={ref} className={cn(error && "text-destructive", className)} htmlFor={formItemId} {...props} />;
+
});
+
FormLabel.displayName = "FormLabel";
+
+
const FormControl = React.forwardRef<React.ElementRef<typeof Slot>, React.ComponentPropsWithoutRef<typeof Slot>>(
+
({ ...props }, ref) => {
+
const { error, formItemId, formDescriptionId, formMessageId } = useFormField();
+
+
return (
+
<Slot
+
ref={ref}
+
id={formItemId}
+
aria-describedby={!error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`}
+
aria-invalid={!!error}
+
{...props}
+
/>
+
);
+
},
+
);
+
FormControl.displayName = "FormControl";
+
+
const FormDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(
+
({ className, ...props }, ref) => {
+
const { formDescriptionId } = useFormField();
+
+
return <p ref={ref} id={formDescriptionId} className={cn("text-sm text-muted-foreground", className)} {...props} />;
+
},
+
);
+
FormDescription.displayName = "FormDescription";
+
+
const FormMessage = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(
+
({ className, children, ...props }, ref) => {
+
const { error, formMessageId } = useFormField();
+
const body = error ? String(error?.message) : children;
+
+
if (!body) {
+
return null;
+
}
+
+
return (
+
<p ref={ref} id={formMessageId} className={cn("text-sm font-medium text-destructive", className)} {...props}>
+
{body}
+
</p>
+
);
+
},
+
);
+
FormMessage.displayName = "FormMessage";
+
+
export { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField };
+27
src/components/ui/hover-card.tsx
···
+
import * as React from "react";
+
import * as HoverCardPrimitive from "@radix-ui/react-hover-card";
+
+
import { cn } from "@/lib/utils";
+
+
const HoverCard = HoverCardPrimitive.Root;
+
+
const HoverCardTrigger = HoverCardPrimitive.Trigger;
+
+
const HoverCardContent = React.forwardRef<
+
React.ElementRef<typeof HoverCardPrimitive.Content>,
+
React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>
+
>(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
+
<HoverCardPrimitive.Content
+
ref={ref}
+
align={align}
+
sideOffset={sideOffset}
+
className={cn(
+
"z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
HoverCardContent.displayName = HoverCardPrimitive.Content.displayName;
+
+
export { HoverCard, HoverCardTrigger, HoverCardContent };
+61
src/components/ui/input-otp.tsx
···
+
import * as React from "react";
+
import { OTPInput, OTPInputContext } from "input-otp";
+
import { Dot } from "lucide-react";
+
+
import { cn } from "@/lib/utils";
+
+
const InputOTP = React.forwardRef<React.ElementRef<typeof OTPInput>, React.ComponentPropsWithoutRef<typeof OTPInput>>(
+
({ className, containerClassName, ...props }, ref) => (
+
<OTPInput
+
ref={ref}
+
containerClassName={cn("flex items-center gap-2 has-[:disabled]:opacity-50", containerClassName)}
+
className={cn("disabled:cursor-not-allowed", className)}
+
{...props}
+
/>
+
),
+
);
+
InputOTP.displayName = "InputOTP";
+
+
const InputOTPGroup = React.forwardRef<React.ElementRef<"div">, React.ComponentPropsWithoutRef<"div">>(
+
({ className, ...props }, ref) => <div ref={ref} className={cn("flex items-center", className)} {...props} />,
+
);
+
InputOTPGroup.displayName = "InputOTPGroup";
+
+
const InputOTPSlot = React.forwardRef<
+
React.ElementRef<"div">,
+
React.ComponentPropsWithoutRef<"div"> & { index: number }
+
>(({ index, className, ...props }, ref) => {
+
const inputOTPContext = React.useContext(OTPInputContext);
+
const { char, hasFakeCaret, isActive } = inputOTPContext.slots[index];
+
+
return (
+
<div
+
ref={ref}
+
className={cn(
+
"relative flex h-10 w-10 items-center justify-center border-y border-r border-input text-sm transition-all first:rounded-l-md first:border-l last:rounded-r-md",
+
isActive && "z-10 ring-2 ring-ring ring-offset-background",
+
className,
+
)}
+
{...props}
+
>
+
{char}
+
{hasFakeCaret && (
+
<div className="pointer-events-none absolute inset-0 flex items-center justify-center">
+
<div className="animate-caret-blink h-4 w-px bg-foreground duration-1000" />
+
</div>
+
)}
+
</div>
+
);
+
});
+
InputOTPSlot.displayName = "InputOTPSlot";
+
+
const InputOTPSeparator = React.forwardRef<React.ElementRef<"div">, React.ComponentPropsWithoutRef<"div">>(
+
({ ...props }, ref) => (
+
<div ref={ref} role="separator" {...props}>
+
<Dot />
+
</div>
+
),
+
);
+
InputOTPSeparator.displayName = "InputOTPSeparator";
+
+
export { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator };
+22
src/components/ui/input.tsx
···
+
import * as React from "react";
+
+
import { cn } from "@/lib/utils";
+
+
const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<"input">>(
+
({ className, type, ...props }, ref) => {
+
return (
+
<input
+
type={type}
+
className={cn(
+
"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
+
className,
+
)}
+
ref={ref}
+
{...props}
+
/>
+
);
+
},
+
);
+
Input.displayName = "Input";
+
+
export { Input };
+17
src/components/ui/label.tsx
···
+
import * as React from "react";
+
import * as LabelPrimitive from "@radix-ui/react-label";
+
import { cva, type VariantProps } from "class-variance-authority";
+
+
import { cn } from "@/lib/utils";
+
+
const labelVariants = cva("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70");
+
+
const Label = React.forwardRef<
+
React.ElementRef<typeof LabelPrimitive.Root>,
+
React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & VariantProps<typeof labelVariants>
+
>(({ className, ...props }, ref) => (
+
<LabelPrimitive.Root ref={ref} className={cn(labelVariants(), className)} {...props} />
+
));
+
Label.displayName = LabelPrimitive.Root.displayName;
+
+
export { Label };
+207
src/components/ui/menubar.tsx
···
+
import * as React from "react";
+
import * as MenubarPrimitive from "@radix-ui/react-menubar";
+
import { Check, ChevronRight, Circle } from "lucide-react";
+
+
import { cn } from "@/lib/utils";
+
+
const MenubarMenu = MenubarPrimitive.Menu;
+
+
const MenubarGroup = MenubarPrimitive.Group;
+
+
const MenubarPortal = MenubarPrimitive.Portal;
+
+
const MenubarSub = MenubarPrimitive.Sub;
+
+
const MenubarRadioGroup = MenubarPrimitive.RadioGroup;
+
+
const Menubar = React.forwardRef<
+
React.ElementRef<typeof MenubarPrimitive.Root>,
+
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Root>
+
>(({ className, ...props }, ref) => (
+
<MenubarPrimitive.Root
+
ref={ref}
+
className={cn("flex h-10 items-center space-x-1 rounded-md border bg-background p-1", className)}
+
{...props}
+
/>
+
));
+
Menubar.displayName = MenubarPrimitive.Root.displayName;
+
+
const MenubarTrigger = React.forwardRef<
+
React.ElementRef<typeof MenubarPrimitive.Trigger>,
+
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Trigger>
+
>(({ className, ...props }, ref) => (
+
<MenubarPrimitive.Trigger
+
ref={ref}
+
className={cn(
+
"flex cursor-default select-none items-center rounded-sm px-3 py-1.5 text-sm font-medium outline-none data-[state=open]:bg-accent data-[state=open]:text-accent-foreground focus:bg-accent focus:text-accent-foreground",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
MenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName;
+
+
const MenubarSubTrigger = React.forwardRef<
+
React.ElementRef<typeof MenubarPrimitive.SubTrigger>,
+
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubTrigger> & {
+
inset?: boolean;
+
}
+
>(({ className, inset, children, ...props }, ref) => (
+
<MenubarPrimitive.SubTrigger
+
ref={ref}
+
className={cn(
+
"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[state=open]:bg-accent data-[state=open]:text-accent-foreground focus:bg-accent focus:text-accent-foreground",
+
inset && "pl-8",
+
className,
+
)}
+
{...props}
+
>
+
{children}
+
<ChevronRight className="ml-auto h-4 w-4" />
+
</MenubarPrimitive.SubTrigger>
+
));
+
MenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName;
+
+
const MenubarSubContent = React.forwardRef<
+
React.ElementRef<typeof MenubarPrimitive.SubContent>,
+
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubContent>
+
>(({ className, ...props }, ref) => (
+
<MenubarPrimitive.SubContent
+
ref={ref}
+
className={cn(
+
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
MenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName;
+
+
const MenubarContent = React.forwardRef<
+
React.ElementRef<typeof MenubarPrimitive.Content>,
+
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Content>
+
>(({ className, align = "start", alignOffset = -4, sideOffset = 8, ...props }, ref) => (
+
<MenubarPrimitive.Portal>
+
<MenubarPrimitive.Content
+
ref={ref}
+
align={align}
+
alignOffset={alignOffset}
+
sideOffset={sideOffset}
+
className={cn(
+
"z-50 min-w-[12rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
+
className,
+
)}
+
{...props}
+
/>
+
</MenubarPrimitive.Portal>
+
));
+
MenubarContent.displayName = MenubarPrimitive.Content.displayName;
+
+
const MenubarItem = React.forwardRef<
+
React.ElementRef<typeof MenubarPrimitive.Item>,
+
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Item> & {
+
inset?: boolean;
+
}
+
>(({ className, inset, ...props }, ref) => (
+
<MenubarPrimitive.Item
+
ref={ref}
+
className={cn(
+
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground",
+
inset && "pl-8",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
MenubarItem.displayName = MenubarPrimitive.Item.displayName;
+
+
const MenubarCheckboxItem = React.forwardRef<
+
React.ElementRef<typeof MenubarPrimitive.CheckboxItem>,
+
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.CheckboxItem>
+
>(({ className, children, checked, ...props }, ref) => (
+
<MenubarPrimitive.CheckboxItem
+
ref={ref}
+
className={cn(
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground",
+
className,
+
)}
+
checked={checked}
+
{...props}
+
>
+
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
+
<MenubarPrimitive.ItemIndicator>
+
<Check className="h-4 w-4" />
+
</MenubarPrimitive.ItemIndicator>
+
</span>
+
{children}
+
</MenubarPrimitive.CheckboxItem>
+
));
+
MenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName;
+
+
const MenubarRadioItem = React.forwardRef<
+
React.ElementRef<typeof MenubarPrimitive.RadioItem>,
+
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.RadioItem>
+
>(({ className, children, ...props }, ref) => (
+
<MenubarPrimitive.RadioItem
+
ref={ref}
+
className={cn(
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground",
+
className,
+
)}
+
{...props}
+
>
+
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
+
<MenubarPrimitive.ItemIndicator>
+
<Circle className="h-2 w-2 fill-current" />
+
</MenubarPrimitive.ItemIndicator>
+
</span>
+
{children}
+
</MenubarPrimitive.RadioItem>
+
));
+
MenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName;
+
+
const MenubarLabel = React.forwardRef<
+
React.ElementRef<typeof MenubarPrimitive.Label>,
+
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Label> & {
+
inset?: boolean;
+
}
+
>(({ className, inset, ...props }, ref) => (
+
<MenubarPrimitive.Label
+
ref={ref}
+
className={cn("px-2 py-1.5 text-sm font-semibold", inset && "pl-8", className)}
+
{...props}
+
/>
+
));
+
MenubarLabel.displayName = MenubarPrimitive.Label.displayName;
+
+
const MenubarSeparator = React.forwardRef<
+
React.ElementRef<typeof MenubarPrimitive.Separator>,
+
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Separator>
+
>(({ className, ...props }, ref) => (
+
<MenubarPrimitive.Separator ref={ref} className={cn("-mx-1 my-1 h-px bg-muted", className)} {...props} />
+
));
+
MenubarSeparator.displayName = MenubarPrimitive.Separator.displayName;
+
+
const MenubarShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {
+
return <span className={cn("ml-auto text-xs tracking-widest text-muted-foreground", className)} {...props} />;
+
};
+
MenubarShortcut.displayname = "MenubarShortcut";
+
+
export {
+
Menubar,
+
MenubarMenu,
+
MenubarTrigger,
+
MenubarContent,
+
MenubarItem,
+
MenubarSeparator,
+
MenubarLabel,
+
MenubarCheckboxItem,
+
MenubarRadioGroup,
+
MenubarRadioItem,
+
MenubarPortal,
+
MenubarSubContent,
+
MenubarSubTrigger,
+
MenubarGroup,
+
MenubarSub,
+
MenubarShortcut,
+
};
+120
src/components/ui/navigation-menu.tsx
···
+
import * as React from "react";
+
import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu";
+
import { cva } from "class-variance-authority";
+
import { ChevronDown } from "lucide-react";
+
+
import { cn } from "@/lib/utils";
+
+
const NavigationMenu = React.forwardRef<
+
React.ElementRef<typeof NavigationMenuPrimitive.Root>,
+
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Root>
+
>(({ className, children, ...props }, ref) => (
+
<NavigationMenuPrimitive.Root
+
ref={ref}
+
className={cn("relative z-10 flex max-w-max flex-1 items-center justify-center", className)}
+
{...props}
+
>
+
{children}
+
<NavigationMenuViewport />
+
</NavigationMenuPrimitive.Root>
+
));
+
NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName;
+
+
const NavigationMenuList = React.forwardRef<
+
React.ElementRef<typeof NavigationMenuPrimitive.List>,
+
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.List>
+
>(({ className, ...props }, ref) => (
+
<NavigationMenuPrimitive.List
+
ref={ref}
+
className={cn("group flex flex-1 list-none items-center justify-center space-x-1", className)}
+
{...props}
+
/>
+
));
+
NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName;
+
+
const NavigationMenuItem = NavigationMenuPrimitive.Item;
+
+
const navigationMenuTriggerStyle = cva(
+
"group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50",
+
);
+
+
const NavigationMenuTrigger = React.forwardRef<
+
React.ElementRef<typeof NavigationMenuPrimitive.Trigger>,
+
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Trigger>
+
>(({ className, children, ...props }, ref) => (
+
<NavigationMenuPrimitive.Trigger
+
ref={ref}
+
className={cn(navigationMenuTriggerStyle(), "group", className)}
+
{...props}
+
>
+
{children}{" "}
+
<ChevronDown
+
className="relative top-[1px] ml-1 h-3 w-3 transition duration-200 group-data-[state=open]:rotate-180"
+
aria-hidden="true"
+
/>
+
</NavigationMenuPrimitive.Trigger>
+
));
+
NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName;
+
+
const NavigationMenuContent = React.forwardRef<
+
React.ElementRef<typeof NavigationMenuPrimitive.Content>,
+
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Content>
+
>(({ className, ...props }, ref) => (
+
<NavigationMenuPrimitive.Content
+
ref={ref}
+
className={cn(
+
"left-0 top-0 w-full data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 md:absolute md:w-auto",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName;
+
+
const NavigationMenuLink = NavigationMenuPrimitive.Link;
+
+
const NavigationMenuViewport = React.forwardRef<
+
React.ElementRef<typeof NavigationMenuPrimitive.Viewport>,
+
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Viewport>
+
>(({ className, ...props }, ref) => (
+
<div className={cn("absolute left-0 top-full flex justify-center")}>
+
<NavigationMenuPrimitive.Viewport
+
className={cn(
+
"origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)]",
+
className,
+
)}
+
ref={ref}
+
{...props}
+
/>
+
</div>
+
));
+
NavigationMenuViewport.displayName = NavigationMenuPrimitive.Viewport.displayName;
+
+
const NavigationMenuIndicator = React.forwardRef<
+
React.ElementRef<typeof NavigationMenuPrimitive.Indicator>,
+
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Indicator>
+
>(({ className, ...props }, ref) => (
+
<NavigationMenuPrimitive.Indicator
+
ref={ref}
+
className={cn(
+
"top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in",
+
className,
+
)}
+
{...props}
+
>
+
<div className="relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md" />
+
</NavigationMenuPrimitive.Indicator>
+
));
+
NavigationMenuIndicator.displayName = NavigationMenuPrimitive.Indicator.displayName;
+
+
export {
+
navigationMenuTriggerStyle,
+
NavigationMenu,
+
NavigationMenuList,
+
NavigationMenuItem,
+
NavigationMenuContent,
+
NavigationMenuTrigger,
+
NavigationMenuLink,
+
NavigationMenuIndicator,
+
NavigationMenuViewport,
+
};
+81
src/components/ui/pagination.tsx
···
+
import * as React from "react";
+
import { ChevronLeft, ChevronRight, MoreHorizontal } from "lucide-react";
+
+
import { cn } from "@/lib/utils";
+
import { ButtonProps, buttonVariants } from "@/components/ui/button";
+
+
const Pagination = ({ className, ...props }: React.ComponentProps<"nav">) => (
+
<nav
+
role="navigation"
+
aria-label="pagination"
+
className={cn("mx-auto flex w-full justify-center", className)}
+
{...props}
+
/>
+
);
+
Pagination.displayName = "Pagination";
+
+
const PaginationContent = React.forwardRef<HTMLUListElement, React.ComponentProps<"ul">>(
+
({ className, ...props }, ref) => (
+
<ul ref={ref} className={cn("flex flex-row items-center gap-1", className)} {...props} />
+
),
+
);
+
PaginationContent.displayName = "PaginationContent";
+
+
const PaginationItem = React.forwardRef<HTMLLIElement, React.ComponentProps<"li">>(({ className, ...props }, ref) => (
+
<li ref={ref} className={cn("", className)} {...props} />
+
));
+
PaginationItem.displayName = "PaginationItem";
+
+
type PaginationLinkProps = {
+
isActive?: boolean;
+
} & Pick<ButtonProps, "size"> &
+
React.ComponentProps<"a">;
+
+
const PaginationLink = ({ className, isActive, size = "icon", ...props }: PaginationLinkProps) => (
+
<a
+
aria-current={isActive ? "page" : undefined}
+
className={cn(
+
buttonVariants({
+
variant: isActive ? "outline" : "ghost",
+
size,
+
}),
+
className,
+
)}
+
{...props}
+
/>
+
);
+
PaginationLink.displayName = "PaginationLink";
+
+
const PaginationPrevious = ({ className, ...props }: React.ComponentProps<typeof PaginationLink>) => (
+
<PaginationLink aria-label="Go to previous page" size="default" className={cn("gap-1 pl-2.5", className)} {...props}>
+
<ChevronLeft className="h-4 w-4" />
+
<span>Previous</span>
+
</PaginationLink>
+
);
+
PaginationPrevious.displayName = "PaginationPrevious";
+
+
const PaginationNext = ({ className, ...props }: React.ComponentProps<typeof PaginationLink>) => (
+
<PaginationLink aria-label="Go to next page" size="default" className={cn("gap-1 pr-2.5", className)} {...props}>
+
<span>Next</span>
+
<ChevronRight className="h-4 w-4" />
+
</PaginationLink>
+
);
+
PaginationNext.displayName = "PaginationNext";
+
+
const PaginationEllipsis = ({ className, ...props }: React.ComponentProps<"span">) => (
+
<span aria-hidden className={cn("flex h-9 w-9 items-center justify-center", className)} {...props}>
+
<MoreHorizontal className="h-4 w-4" />
+
<span className="sr-only">More pages</span>
+
</span>
+
);
+
PaginationEllipsis.displayName = "PaginationEllipsis";
+
+
export {
+
Pagination,
+
PaginationContent,
+
PaginationEllipsis,
+
PaginationItem,
+
PaginationLink,
+
PaginationNext,
+
PaginationPrevious,
+
};
+29
src/components/ui/popover.tsx
···
+
import * as React from "react";
+
import * as PopoverPrimitive from "@radix-ui/react-popover";
+
+
import { cn } from "@/lib/utils";
+
+
const Popover = PopoverPrimitive.Root;
+
+
const PopoverTrigger = PopoverPrimitive.Trigger;
+
+
const PopoverContent = React.forwardRef<
+
React.ElementRef<typeof PopoverPrimitive.Content>,
+
React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>
+
>(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
+
<PopoverPrimitive.Portal>
+
<PopoverPrimitive.Content
+
ref={ref}
+
align={align}
+
sideOffset={sideOffset}
+
className={cn(
+
"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
+
className,
+
)}
+
{...props}
+
/>
+
</PopoverPrimitive.Portal>
+
));
+
PopoverContent.displayName = PopoverPrimitive.Content.displayName;
+
+
export { Popover, PopoverTrigger, PopoverContent };
+23
src/components/ui/progress.tsx
···
+
import * as React from "react";
+
import * as ProgressPrimitive from "@radix-ui/react-progress";
+
+
import { cn } from "@/lib/utils";
+
+
const Progress = React.forwardRef<
+
React.ElementRef<typeof ProgressPrimitive.Root>,
+
React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>
+
>(({ className, value, ...props }, ref) => (
+
<ProgressPrimitive.Root
+
ref={ref}
+
className={cn("relative h-4 w-full overflow-hidden rounded-full bg-secondary", className)}
+
{...props}
+
>
+
<ProgressPrimitive.Indicator
+
className="h-full w-full flex-1 bg-primary transition-all"
+
style={{ transform: `translateX(-${100 - (value || 0)}%)` }}
+
/>
+
</ProgressPrimitive.Root>
+
));
+
Progress.displayName = ProgressPrimitive.Root.displayName;
+
+
export { Progress };
+36
src/components/ui/radio-group.tsx
···
+
import * as React from "react";
+
import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
+
import { Circle } from "lucide-react";
+
+
import { cn } from "@/lib/utils";
+
+
const RadioGroup = React.forwardRef<
+
React.ElementRef<typeof RadioGroupPrimitive.Root>,
+
React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>
+
>(({ className, ...props }, ref) => {
+
return <RadioGroupPrimitive.Root className={cn("grid gap-2", className)} {...props} ref={ref} />;
+
});
+
RadioGroup.displayName = RadioGroupPrimitive.Root.displayName;
+
+
const RadioGroupItem = React.forwardRef<
+
React.ElementRef<typeof RadioGroupPrimitive.Item>,
+
React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>
+
>(({ className, ...props }, ref) => {
+
return (
+
<RadioGroupPrimitive.Item
+
ref={ref}
+
className={cn(
+
"aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
+
className,
+
)}
+
{...props}
+
>
+
<RadioGroupPrimitive.Indicator className="flex items-center justify-center">
+
<Circle className="h-2.5 w-2.5 fill-current text-current" />
+
</RadioGroupPrimitive.Indicator>
+
</RadioGroupPrimitive.Item>
+
);
+
});
+
RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;
+
+
export { RadioGroup, RadioGroupItem };
+37
src/components/ui/resizable.tsx
···
+
import { GripVertical } from "lucide-react";
+
import * as ResizablePrimitive from "react-resizable-panels";
+
+
import { cn } from "@/lib/utils";
+
+
const ResizablePanelGroup = ({ className, ...props }: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>) => (
+
<ResizablePrimitive.PanelGroup
+
className={cn("flex h-full w-full data-[panel-group-direction=vertical]:flex-col", className)}
+
{...props}
+
/>
+
);
+
+
const ResizablePanel = ResizablePrimitive.Panel;
+
+
const ResizableHandle = ({
+
withHandle,
+
className,
+
...props
+
}: React.ComponentProps<typeof ResizablePrimitive.PanelResizeHandle> & {
+
withHandle?: boolean;
+
}) => (
+
<ResizablePrimitive.PanelResizeHandle
+
className={cn(
+
"relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 [&[data-panel-group-direction=vertical]>div]:rotate-90",
+
className,
+
)}
+
{...props}
+
>
+
{withHandle && (
+
<div className="z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border">
+
<GripVertical className="h-2.5 w-2.5" />
+
</div>
+
)}
+
</ResizablePrimitive.PanelResizeHandle>
+
);
+
+
export { ResizablePanelGroup, ResizablePanel, ResizableHandle };
+38
src/components/ui/scroll-area.tsx
···
+
import * as React from "react";
+
import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
+
+
import { cn } from "@/lib/utils";
+
+
const ScrollArea = React.forwardRef<
+
React.ElementRef<typeof ScrollAreaPrimitive.Root>,
+
React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>
+
>(({ className, children, ...props }, ref) => (
+
<ScrollAreaPrimitive.Root ref={ref} className={cn("relative overflow-hidden", className)} {...props}>
+
<ScrollAreaPrimitive.Viewport className="h-full w-full rounded-[inherit]">{children}</ScrollAreaPrimitive.Viewport>
+
<ScrollBar />
+
<ScrollAreaPrimitive.Corner />
+
</ScrollAreaPrimitive.Root>
+
));
+
ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;
+
+
const ScrollBar = React.forwardRef<
+
React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,
+
React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>
+
>(({ className, orientation = "vertical", ...props }, ref) => (
+
<ScrollAreaPrimitive.ScrollAreaScrollbar
+
ref={ref}
+
orientation={orientation}
+
className={cn(
+
"flex touch-none select-none transition-colors",
+
orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent p-[1px]",
+
orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent p-[1px]",
+
className,
+
)}
+
{...props}
+
>
+
<ScrollAreaPrimitive.ScrollAreaThumb className="relative flex-1 rounded-full bg-border" />
+
</ScrollAreaPrimitive.ScrollAreaScrollbar>
+
));
+
ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;
+
+
export { ScrollArea, ScrollBar };
+143
src/components/ui/select.tsx
···
+
import * as React from "react";
+
import * as SelectPrimitive from "@radix-ui/react-select";
+
import { Check, ChevronDown, ChevronUp } from "lucide-react";
+
+
import { cn } from "@/lib/utils";
+
+
const Select = SelectPrimitive.Root;
+
+
const SelectGroup = SelectPrimitive.Group;
+
+
const SelectValue = SelectPrimitive.Value;
+
+
const SelectTrigger = React.forwardRef<
+
React.ElementRef<typeof SelectPrimitive.Trigger>,
+
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>
+
>(({ className, children, ...props }, ref) => (
+
<SelectPrimitive.Trigger
+
ref={ref}
+
className={cn(
+
"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",
+
className,
+
)}
+
{...props}
+
>
+
{children}
+
<SelectPrimitive.Icon asChild>
+
<ChevronDown className="h-4 w-4 opacity-50" />
+
</SelectPrimitive.Icon>
+
</SelectPrimitive.Trigger>
+
));
+
SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
+
+
const SelectScrollUpButton = React.forwardRef<
+
React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,
+
React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>
+
>(({ className, ...props }, ref) => (
+
<SelectPrimitive.ScrollUpButton
+
ref={ref}
+
className={cn("flex cursor-default items-center justify-center py-1", className)}
+
{...props}
+
>
+
<ChevronUp className="h-4 w-4" />
+
</SelectPrimitive.ScrollUpButton>
+
));
+
SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
+
+
const SelectScrollDownButton = React.forwardRef<
+
React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,
+
React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>
+
>(({ className, ...props }, ref) => (
+
<SelectPrimitive.ScrollDownButton
+
ref={ref}
+
className={cn("flex cursor-default items-center justify-center py-1", className)}
+
{...props}
+
>
+
<ChevronDown className="h-4 w-4" />
+
</SelectPrimitive.ScrollDownButton>
+
));
+
SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
+
+
const SelectContent = React.forwardRef<
+
React.ElementRef<typeof SelectPrimitive.Content>,
+
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>
+
>(({ className, children, position = "popper", ...props }, ref) => (
+
<SelectPrimitive.Portal>
+
<SelectPrimitive.Content
+
ref={ref}
+
className={cn(
+
"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
+
position === "popper" &&
+
"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
+
className,
+
)}
+
position={position}
+
{...props}
+
>
+
<SelectScrollUpButton />
+
<SelectPrimitive.Viewport
+
className={cn(
+
"p-1",
+
position === "popper" &&
+
"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]",
+
)}
+
>
+
{children}
+
</SelectPrimitive.Viewport>
+
<SelectScrollDownButton />
+
</SelectPrimitive.Content>
+
</SelectPrimitive.Portal>
+
));
+
SelectContent.displayName = SelectPrimitive.Content.displayName;
+
+
const SelectLabel = React.forwardRef<
+
React.ElementRef<typeof SelectPrimitive.Label>,
+
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>
+
>(({ className, ...props }, ref) => (
+
<SelectPrimitive.Label ref={ref} className={cn("py-1.5 pl-8 pr-2 text-sm font-semibold", className)} {...props} />
+
));
+
SelectLabel.displayName = SelectPrimitive.Label.displayName;
+
+
const SelectItem = React.forwardRef<
+
React.ElementRef<typeof SelectPrimitive.Item>,
+
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>
+
>(({ className, children, ...props }, ref) => (
+
<SelectPrimitive.Item
+
ref={ref}
+
className={cn(
+
"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 focus:bg-accent focus:text-accent-foreground",
+
className,
+
)}
+
{...props}
+
>
+
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
+
<SelectPrimitive.ItemIndicator>
+
<Check className="h-4 w-4" />
+
</SelectPrimitive.ItemIndicator>
+
</span>
+
+
<SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
+
</SelectPrimitive.Item>
+
));
+
SelectItem.displayName = SelectPrimitive.Item.displayName;
+
+
const SelectSeparator = React.forwardRef<
+
React.ElementRef<typeof SelectPrimitive.Separator>,
+
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>
+
>(({ className, ...props }, ref) => (
+
<SelectPrimitive.Separator ref={ref} className={cn("-mx-1 my-1 h-px bg-muted", className)} {...props} />
+
));
+
SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
+
+
export {
+
Select,
+
SelectGroup,
+
SelectValue,
+
SelectTrigger,
+
SelectContent,
+
SelectLabel,
+
SelectItem,
+
SelectSeparator,
+
SelectScrollUpButton,
+
SelectScrollDownButton,
+
};
+20
src/components/ui/separator.tsx
···
+
import * as React from "react";
+
import * as SeparatorPrimitive from "@radix-ui/react-separator";
+
+
import { cn } from "@/lib/utils";
+
+
const Separator = React.forwardRef<
+
React.ElementRef<typeof SeparatorPrimitive.Root>,
+
React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>
+
>(({ className, orientation = "horizontal", decorative = true, ...props }, ref) => (
+
<SeparatorPrimitive.Root
+
ref={ref}
+
decorative={decorative}
+
orientation={orientation}
+
className={cn("shrink-0 bg-border", orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]", className)}
+
{...props}
+
/>
+
));
+
Separator.displayName = SeparatorPrimitive.Root.displayName;
+
+
export { Separator };
+107
src/components/ui/sheet.tsx
···
+
import * as SheetPrimitive from "@radix-ui/react-dialog";
+
import { cva, type VariantProps } from "class-variance-authority";
+
import { X } from "lucide-react";
+
import * as React from "react";
+
+
import { cn } from "@/lib/utils";
+
+
const Sheet = SheetPrimitive.Root;
+
+
const SheetTrigger = SheetPrimitive.Trigger;
+
+
const SheetClose = SheetPrimitive.Close;
+
+
const SheetPortal = SheetPrimitive.Portal;
+
+
const SheetOverlay = React.forwardRef<
+
React.ElementRef<typeof SheetPrimitive.Overlay>,
+
React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>
+
>(({ className, ...props }, ref) => (
+
<SheetPrimitive.Overlay
+
className={cn(
+
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
+
className,
+
)}
+
{...props}
+
ref={ref}
+
/>
+
));
+
SheetOverlay.displayName = SheetPrimitive.Overlay.displayName;
+
+
const sheetVariants = cva(
+
"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
+
{
+
variants: {
+
side: {
+
top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
+
bottom:
+
"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
+
left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
+
right:
+
"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
+
},
+
},
+
defaultVariants: {
+
side: "right",
+
},
+
},
+
);
+
+
interface SheetContentProps
+
extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,
+
VariantProps<typeof sheetVariants> {}
+
+
const SheetContent = React.forwardRef<React.ElementRef<typeof SheetPrimitive.Content>, SheetContentProps>(
+
({ side = "right", className, children, ...props }, ref) => (
+
<SheetPortal>
+
<SheetOverlay />
+
<SheetPrimitive.Content ref={ref} className={cn(sheetVariants({ side }), className)} {...props}>
+
{children}
+
<SheetPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity data-[state=open]:bg-secondary hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none">
+
<X className="h-4 w-4" />
+
<span className="sr-only">Close</span>
+
</SheetPrimitive.Close>
+
</SheetPrimitive.Content>
+
</SheetPortal>
+
),
+
);
+
SheetContent.displayName = SheetPrimitive.Content.displayName;
+
+
const SheetHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
+
<div className={cn("flex flex-col space-y-2 text-center sm:text-left", className)} {...props} />
+
);
+
SheetHeader.displayName = "SheetHeader";
+
+
const SheetFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
+
<div className={cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className)} {...props} />
+
);
+
SheetFooter.displayName = "SheetFooter";
+
+
const SheetTitle = React.forwardRef<
+
React.ElementRef<typeof SheetPrimitive.Title>,
+
React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>
+
>(({ className, ...props }, ref) => (
+
<SheetPrimitive.Title ref={ref} className={cn("text-lg font-semibold text-foreground", className)} {...props} />
+
));
+
SheetTitle.displayName = SheetPrimitive.Title.displayName;
+
+
const SheetDescription = React.forwardRef<
+
React.ElementRef<typeof SheetPrimitive.Description>,
+
React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>
+
>(({ className, ...props }, ref) => (
+
<SheetPrimitive.Description ref={ref} className={cn("text-sm text-muted-foreground", className)} {...props} />
+
));
+
SheetDescription.displayName = SheetPrimitive.Description.displayName;
+
+
export {
+
Sheet,
+
SheetClose,
+
SheetContent,
+
SheetDescription,
+
SheetFooter,
+
SheetHeader,
+
SheetOverlay,
+
SheetPortal,
+
SheetTitle,
+
SheetTrigger,
+
};
+637
src/components/ui/sidebar.tsx
···
+
import * as React from "react";
+
import { Slot } from "@radix-ui/react-slot";
+
import { VariantProps, cva } from "class-variance-authority";
+
import { PanelLeft } from "lucide-react";
+
+
import { useIsMobile } from "@/hooks/use-mobile";
+
import { cn } from "@/lib/utils";
+
import { Button } from "@/components/ui/button";
+
import { Input } from "@/components/ui/input";
+
import { Separator } from "@/components/ui/separator";
+
import { Sheet, SheetContent } from "@/components/ui/sheet";
+
import { Skeleton } from "@/components/ui/skeleton";
+
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
+
+
const SIDEBAR_COOKIE_NAME = "sidebar:state";
+
const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
+
const SIDEBAR_WIDTH = "16rem";
+
const SIDEBAR_WIDTH_MOBILE = "18rem";
+
const SIDEBAR_WIDTH_ICON = "3rem";
+
const SIDEBAR_KEYBOARD_SHORTCUT = "b";
+
+
type SidebarContext = {
+
state: "expanded" | "collapsed";
+
open: boolean;
+
setOpen: (open: boolean) => void;
+
openMobile: boolean;
+
setOpenMobile: (open: boolean) => void;
+
isMobile: boolean;
+
toggleSidebar: () => void;
+
};
+
+
const SidebarContext = React.createContext<SidebarContext | null>(null);
+
+
function useSidebar() {
+
const context = React.useContext(SidebarContext);
+
if (!context) {
+
throw new Error("useSidebar must be used within a SidebarProvider.");
+
}
+
+
return context;
+
}
+
+
const SidebarProvider = React.forwardRef<
+
HTMLDivElement,
+
React.ComponentProps<"div"> & {
+
defaultOpen?: boolean;
+
open?: boolean;
+
onOpenChange?: (open: boolean) => void;
+
}
+
>(({ defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }, ref) => {
+
const isMobile = useIsMobile();
+
const [openMobile, setOpenMobile] = React.useState(false);
+
+
// This is the internal state of the sidebar.
+
// We use openProp and setOpenProp for control from outside the component.
+
const [_open, _setOpen] = React.useState(defaultOpen);
+
const open = openProp ?? _open;
+
const setOpen = React.useCallback(
+
(value: boolean | ((value: boolean) => boolean)) => {
+
const openState = typeof value === "function" ? value(open) : value;
+
if (setOpenProp) {
+
setOpenProp(openState);
+
} else {
+
_setOpen(openState);
+
}
+
+
// This sets the cookie to keep the sidebar state.
+
document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
+
},
+
[setOpenProp, open],
+
);
+
+
// Helper to toggle the sidebar.
+
const toggleSidebar = React.useCallback(() => {
+
return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);
+
}, [isMobile, setOpen, setOpenMobile]);
+
+
// Adds a keyboard shortcut to toggle the sidebar.
+
React.useEffect(() => {
+
const handleKeyDown = (event: KeyboardEvent) => {
+
if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
+
event.preventDefault();
+
toggleSidebar();
+
}
+
};
+
+
window.addEventListener("keydown", handleKeyDown);
+
return () => window.removeEventListener("keydown", handleKeyDown);
+
}, [toggleSidebar]);
+
+
// We add a state so that we can do data-state="expanded" or "collapsed".
+
// This makes it easier to style the sidebar with Tailwind classes.
+
const state = open ? "expanded" : "collapsed";
+
+
const contextValue = React.useMemo<SidebarContext>(
+
() => ({
+
state,
+
open,
+
setOpen,
+
isMobile,
+
openMobile,
+
setOpenMobile,
+
toggleSidebar,
+
}),
+
[state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar],
+
);
+
+
return (
+
<SidebarContext.Provider value={contextValue}>
+
<TooltipProvider delayDuration={0}>
+
<div
+
style={
+
{
+
"--sidebar-width": SIDEBAR_WIDTH,
+
"--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
+
...style,
+
} as React.CSSProperties
+
}
+
className={cn("group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar", className)}
+
ref={ref}
+
{...props}
+
>
+
{children}
+
</div>
+
</TooltipProvider>
+
</SidebarContext.Provider>
+
);
+
});
+
SidebarProvider.displayName = "SidebarProvider";
+
+
const Sidebar = React.forwardRef<
+
HTMLDivElement,
+
React.ComponentProps<"div"> & {
+
side?: "left" | "right";
+
variant?: "sidebar" | "floating" | "inset";
+
collapsible?: "offcanvas" | "icon" | "none";
+
}
+
>(({ side = "left", variant = "sidebar", collapsible = "offcanvas", className, children, ...props }, ref) => {
+
const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
+
+
if (collapsible === "none") {
+
return (
+
<div
+
className={cn("flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground", className)}
+
ref={ref}
+
{...props}
+
>
+
{children}
+
</div>
+
);
+
}
+
+
if (isMobile) {
+
return (
+
<Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>
+
<SheetContent
+
data-sidebar="sidebar"
+
data-mobile="true"
+
className="w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden"
+
style={
+
{
+
"--sidebar-width": SIDEBAR_WIDTH_MOBILE,
+
} as React.CSSProperties
+
}
+
side={side}
+
>
+
<div className="flex h-full w-full flex-col">{children}</div>
+
</SheetContent>
+
</Sheet>
+
);
+
}
+
+
return (
+
<div
+
ref={ref}
+
className="group peer hidden text-sidebar-foreground md:block"
+
data-state={state}
+
data-collapsible={state === "collapsed" ? collapsible : ""}
+
data-variant={variant}
+
data-side={side}
+
>
+
{/* This is what handles the sidebar gap on desktop */}
+
<div
+
className={cn(
+
"relative h-svh w-[--sidebar-width] bg-transparent transition-[width] duration-200 ease-linear",
+
"group-data-[collapsible=offcanvas]:w-0",
+
"group-data-[side=right]:rotate-180",
+
variant === "floating" || variant === "inset"
+
? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]"
+
: "group-data-[collapsible=icon]:w-[--sidebar-width-icon]",
+
)}
+
/>
+
<div
+
className={cn(
+
"fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] duration-200 ease-linear md:flex",
+
side === "left"
+
? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]"
+
: "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
+
// Adjust the padding for floating and inset variants.
+
variant === "floating" || variant === "inset"
+
? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]"
+
: "group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l",
+
className,
+
)}
+
{...props}
+
>
+
<div
+
data-sidebar="sidebar"
+
className="flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow"
+
>
+
{children}
+
</div>
+
</div>
+
</div>
+
);
+
});
+
Sidebar.displayName = "Sidebar";
+
+
const SidebarTrigger = React.forwardRef<React.ElementRef<typeof Button>, React.ComponentProps<typeof Button>>(
+
({ className, onClick, ...props }, ref) => {
+
const { toggleSidebar } = useSidebar();
+
+
return (
+
<Button
+
ref={ref}
+
data-sidebar="trigger"
+
variant="ghost"
+
size="icon"
+
className={cn("h-7 w-7", className)}
+
onClick={(event) => {
+
onClick?.(event);
+
toggleSidebar();
+
}}
+
{...props}
+
>
+
<PanelLeft />
+
<span className="sr-only">Toggle Sidebar</span>
+
</Button>
+
);
+
},
+
);
+
SidebarTrigger.displayName = "SidebarTrigger";
+
+
const SidebarRail = React.forwardRef<HTMLButtonElement, React.ComponentProps<"button">>(
+
({ className, ...props }, ref) => {
+
const { toggleSidebar } = useSidebar();
+
+
return (
+
<button
+
ref={ref}
+
data-sidebar="rail"
+
aria-label="Toggle Sidebar"
+
tabIndex={-1}
+
onClick={toggleSidebar}
+
title="Toggle Sidebar"
+
className={cn(
+
"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] group-data-[side=left]:-right-4 group-data-[side=right]:left-0 hover:after:bg-sidebar-border sm:flex",
+
"[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize",
+
"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
+
"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar",
+
"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
+
"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
+
className,
+
)}
+
{...props}
+
/>
+
);
+
},
+
);
+
SidebarRail.displayName = "SidebarRail";
+
+
const SidebarInset = React.forwardRef<HTMLDivElement, React.ComponentProps<"main">>(({ className, ...props }, ref) => {
+
return (
+
<main
+
ref={ref}
+
className={cn(
+
"relative flex min-h-svh flex-1 flex-col bg-background",
+
"peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow",
+
className,
+
)}
+
{...props}
+
/>
+
);
+
});
+
SidebarInset.displayName = "SidebarInset";
+
+
const SidebarInput = React.forwardRef<React.ElementRef<typeof Input>, React.ComponentProps<typeof Input>>(
+
({ className, ...props }, ref) => {
+
return (
+
<Input
+
ref={ref}
+
data-sidebar="input"
+
className={cn(
+
"h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring",
+
className,
+
)}
+
{...props}
+
/>
+
);
+
},
+
);
+
SidebarInput.displayName = "SidebarInput";
+
+
const SidebarHeader = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({ className, ...props }, ref) => {
+
return <div ref={ref} data-sidebar="header" className={cn("flex flex-col gap-2 p-2", className)} {...props} />;
+
});
+
SidebarHeader.displayName = "SidebarHeader";
+
+
const SidebarFooter = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({ className, ...props }, ref) => {
+
return <div ref={ref} data-sidebar="footer" className={cn("flex flex-col gap-2 p-2", className)} {...props} />;
+
});
+
SidebarFooter.displayName = "SidebarFooter";
+
+
const SidebarSeparator = React.forwardRef<React.ElementRef<typeof Separator>, React.ComponentProps<typeof Separator>>(
+
({ className, ...props }, ref) => {
+
return (
+
<Separator
+
ref={ref}
+
data-sidebar="separator"
+
className={cn("mx-2 w-auto bg-sidebar-border", className)}
+
{...props}
+
/>
+
);
+
},
+
);
+
SidebarSeparator.displayName = "SidebarSeparator";
+
+
const SidebarContent = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({ className, ...props }, ref) => {
+
return (
+
<div
+
ref={ref}
+
data-sidebar="content"
+
className={cn(
+
"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden",
+
className,
+
)}
+
{...props}
+
/>
+
);
+
});
+
SidebarContent.displayName = "SidebarContent";
+
+
const SidebarGroup = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({ className, ...props }, ref) => {
+
return (
+
<div
+
ref={ref}
+
data-sidebar="group"
+
className={cn("relative flex w-full min-w-0 flex-col p-2", className)}
+
{...props}
+
/>
+
);
+
});
+
SidebarGroup.displayName = "SidebarGroup";
+
+
const SidebarGroupLabel = React.forwardRef<HTMLDivElement, React.ComponentProps<"div"> & { asChild?: boolean }>(
+
({ className, asChild = false, ...props }, ref) => {
+
const Comp = asChild ? Slot : "div";
+
+
return (
+
<Comp
+
ref={ref}
+
data-sidebar="group-label"
+
className={cn(
+
"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opa] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
+
"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
+
className,
+
)}
+
{...props}
+
/>
+
);
+
},
+
);
+
SidebarGroupLabel.displayName = "SidebarGroupLabel";
+
+
const SidebarGroupAction = React.forwardRef<HTMLButtonElement, React.ComponentProps<"button"> & { asChild?: boolean }>(
+
({ className, asChild = false, ...props }, ref) => {
+
const Comp = asChild ? Slot : "button";
+
+
return (
+
<Comp
+
ref={ref}
+
data-sidebar="group-action"
+
className={cn(
+
"absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
+
// Increases the hit area of the button on mobile.
+
"after:absolute after:-inset-2 after:md:hidden",
+
"group-data-[collapsible=icon]:hidden",
+
className,
+
)}
+
{...props}
+
/>
+
);
+
},
+
);
+
SidebarGroupAction.displayName = "SidebarGroupAction";
+
+
const SidebarGroupContent = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(
+
({ className, ...props }, ref) => (
+
<div ref={ref} data-sidebar="group-content" className={cn("w-full text-sm", className)} {...props} />
+
),
+
);
+
SidebarGroupContent.displayName = "SidebarGroupContent";
+
+
const SidebarMenu = React.forwardRef<HTMLUListElement, React.ComponentProps<"ul">>(({ className, ...props }, ref) => (
+
<ul ref={ref} data-sidebar="menu" className={cn("flex w-full min-w-0 flex-col gap-1", className)} {...props} />
+
));
+
SidebarMenu.displayName = "SidebarMenu";
+
+
const SidebarMenuItem = React.forwardRef<HTMLLIElement, React.ComponentProps<"li">>(({ className, ...props }, ref) => (
+
<li ref={ref} data-sidebar="menu-item" className={cn("group/menu-item relative", className)} {...props} />
+
));
+
SidebarMenuItem.displayName = "SidebarMenuItem";
+
+
const sidebarMenuButtonVariants = cva(
+
"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
+
{
+
variants: {
+
variant: {
+
default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
+
outline:
+
"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]",
+
},
+
size: {
+
default: "h-8 text-sm",
+
sm: "h-7 text-xs",
+
lg: "h-12 text-sm group-data-[collapsible=icon]:!p-0",
+
},
+
},
+
defaultVariants: {
+
variant: "default",
+
size: "default",
+
},
+
},
+
);
+
+
const SidebarMenuButton = React.forwardRef<
+
HTMLButtonElement,
+
React.ComponentProps<"button"> & {
+
asChild?: boolean;
+
isActive?: boolean;
+
tooltip?: string | React.ComponentProps<typeof TooltipContent>;
+
} & VariantProps<typeof sidebarMenuButtonVariants>
+
>(({ asChild = false, isActive = false, variant = "default", size = "default", tooltip, className, ...props }, ref) => {
+
const Comp = asChild ? Slot : "button";
+
const { isMobile, state } = useSidebar();
+
+
const button = (
+
<Comp
+
ref={ref}
+
data-sidebar="menu-button"
+
data-size={size}
+
data-active={isActive}
+
className={cn(sidebarMenuButtonVariants({ variant, size }), className)}
+
{...props}
+
/>
+
);
+
+
if (!tooltip) {
+
return button;
+
}
+
+
if (typeof tooltip === "string") {
+
tooltip = {
+
children: tooltip,
+
};
+
}
+
+
return (
+
<Tooltip>
+
<TooltipTrigger asChild>{button}</TooltipTrigger>
+
<TooltipContent side="right" align="center" hidden={state !== "collapsed" || isMobile} {...tooltip} />
+
</Tooltip>
+
);
+
});
+
SidebarMenuButton.displayName = "SidebarMenuButton";
+
+
const SidebarMenuAction = React.forwardRef<
+
HTMLButtonElement,
+
React.ComponentProps<"button"> & {
+
asChild?: boolean;
+
showOnHover?: boolean;
+
}
+
>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {
+
const Comp = asChild ? Slot : "button";
+
+
return (
+
<Comp
+
ref={ref}
+
data-sidebar="menu-action"
+
className={cn(
+
"absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform peer-hover/menu-button:text-sidebar-accent-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
+
// Increases the hit area of the button on mobile.
+
"after:absolute after:-inset-2 after:md:hidden",
+
"peer-data-[size=sm]/menu-button:top-1",
+
"peer-data-[size=default]/menu-button:top-1.5",
+
"peer-data-[size=lg]/menu-button:top-2.5",
+
"group-data-[collapsible=icon]:hidden",
+
showOnHover &&
+
"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0",
+
className,
+
)}
+
{...props}
+
/>
+
);
+
});
+
SidebarMenuAction.displayName = "SidebarMenuAction";
+
+
const SidebarMenuBadge = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(
+
({ className, ...props }, ref) => (
+
<div
+
ref={ref}
+
data-sidebar="menu-badge"
+
className={cn(
+
"pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground",
+
"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground",
+
"peer-data-[size=sm]/menu-button:top-1",
+
"peer-data-[size=default]/menu-button:top-1.5",
+
"peer-data-[size=lg]/menu-button:top-2.5",
+
"group-data-[collapsible=icon]:hidden",
+
className,
+
)}
+
{...props}
+
/>
+
),
+
);
+
SidebarMenuBadge.displayName = "SidebarMenuBadge";
+
+
const SidebarMenuSkeleton = React.forwardRef<
+
HTMLDivElement,
+
React.ComponentProps<"div"> & {
+
showIcon?: boolean;
+
}
+
>(({ className, showIcon = false, ...props }, ref) => {
+
// Random width between 50 to 90%.
+
const width = React.useMemo(() => {
+
return `${Math.floor(Math.random() * 40) + 50}%`;
+
}, []);
+
+
return (
+
<div
+
ref={ref}
+
data-sidebar="menu-skeleton"
+
className={cn("flex h-8 items-center gap-2 rounded-md px-2", className)}
+
{...props}
+
>
+
{showIcon && <Skeleton className="size-4 rounded-md" data-sidebar="menu-skeleton-icon" />}
+
<Skeleton
+
className="h-4 max-w-[--skeleton-width] flex-1"
+
data-sidebar="menu-skeleton-text"
+
style={
+
{
+
"--skeleton-width": width,
+
} as React.CSSProperties
+
}
+
/>
+
</div>
+
);
+
});
+
SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton";
+
+
const SidebarMenuSub = React.forwardRef<HTMLUListElement, React.ComponentProps<"ul">>(
+
({ className, ...props }, ref) => (
+
<ul
+
ref={ref}
+
data-sidebar="menu-sub"
+
className={cn(
+
"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5",
+
"group-data-[collapsible=icon]:hidden",
+
className,
+
)}
+
{...props}
+
/>
+
),
+
);
+
SidebarMenuSub.displayName = "SidebarMenuSub";
+
+
const SidebarMenuSubItem = React.forwardRef<HTMLLIElement, React.ComponentProps<"li">>(({ ...props }, ref) => (
+
<li ref={ref} {...props} />
+
));
+
SidebarMenuSubItem.displayName = "SidebarMenuSubItem";
+
+
const SidebarMenuSubButton = React.forwardRef<
+
HTMLAnchorElement,
+
React.ComponentProps<"a"> & {
+
asChild?: boolean;
+
size?: "sm" | "md";
+
isActive?: boolean;
+
}
+
>(({ asChild = false, size = "md", isActive, className, ...props }, ref) => {
+
const Comp = asChild ? Slot : "a";
+
+
return (
+
<Comp
+
ref={ref}
+
data-sidebar="menu-sub-button"
+
data-size={size}
+
data-active={isActive}
+
className={cn(
+
"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring aria-disabled:pointer-events-none aria-disabled:opacity-50 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground",
+
"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",
+
size === "sm" && "text-xs",
+
size === "md" && "text-sm",
+
"group-data-[collapsible=icon]:hidden",
+
className,
+
)}
+
{...props}
+
/>
+
);
+
});
+
SidebarMenuSubButton.displayName = "SidebarMenuSubButton";
+
+
export {
+
Sidebar,
+
SidebarContent,
+
SidebarFooter,
+
SidebarGroup,
+
SidebarGroupAction,
+
SidebarGroupContent,
+
SidebarGroupLabel,
+
SidebarHeader,
+
SidebarInput,
+
SidebarInset,
+
SidebarMenu,
+
SidebarMenuAction,
+
SidebarMenuBadge,
+
SidebarMenuButton,
+
SidebarMenuItem,
+
SidebarMenuSkeleton,
+
SidebarMenuSub,
+
SidebarMenuSubButton,
+
SidebarMenuSubItem,
+
SidebarProvider,
+
SidebarRail,
+
SidebarSeparator,
+
SidebarTrigger,
+
useSidebar,
+
};
+7
src/components/ui/skeleton.tsx
···
+
import { cn } from "@/lib/utils";
+
+
function Skeleton({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {
+
return <div className={cn("animate-pulse rounded-md bg-muted", className)} {...props} />;
+
}
+
+
export { Skeleton };
+23
src/components/ui/slider.tsx
···
+
import * as React from "react";
+
import * as SliderPrimitive from "@radix-ui/react-slider";
+
+
import { cn } from "@/lib/utils";
+
+
const Slider = React.forwardRef<
+
React.ElementRef<typeof SliderPrimitive.Root>,
+
React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>
+
>(({ className, ...props }, ref) => (
+
<SliderPrimitive.Root
+
ref={ref}
+
className={cn("relative flex w-full touch-none select-none items-center", className)}
+
{...props}
+
>
+
<SliderPrimitive.Track className="relative h-2 w-full grow overflow-hidden rounded-full bg-secondary">
+
<SliderPrimitive.Range className="absolute h-full bg-primary" />
+
</SliderPrimitive.Track>
+
<SliderPrimitive.Thumb className="block h-5 w-5 rounded-full border-2 border-primary bg-background ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50" />
+
</SliderPrimitive.Root>
+
));
+
Slider.displayName = SliderPrimitive.Root.displayName;
+
+
export { Slider };
+27
src/components/ui/sonner.tsx
···
+
import { useTheme } from "next-themes";
+
import { Toaster as Sonner, toast } from "sonner";
+
+
type ToasterProps = React.ComponentProps<typeof Sonner>;
+
+
const Toaster = ({ ...props }: ToasterProps) => {
+
const { theme = "system" } = useTheme();
+
+
return (
+
<Sonner
+
theme={theme as ToasterProps["theme"]}
+
className="toaster group"
+
toastOptions={{
+
classNames: {
+
toast:
+
"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",
+
description: "group-[.toast]:text-muted-foreground",
+
actionButton: "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
+
cancelButton: "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground",
+
},
+
}}
+
{...props}
+
/>
+
);
+
};
+
+
export { Toaster, toast };
+27
src/components/ui/switch.tsx
···
+
import * as React from "react";
+
import * as SwitchPrimitives from "@radix-ui/react-switch";
+
+
import { cn } from "@/lib/utils";
+
+
const Switch = React.forwardRef<
+
React.ElementRef<typeof SwitchPrimitives.Root>,
+
React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>
+
>(({ className, ...props }, ref) => (
+
<SwitchPrimitives.Root
+
className={cn(
+
"peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50",
+
className,
+
)}
+
{...props}
+
ref={ref}
+
>
+
<SwitchPrimitives.Thumb
+
className={cn(
+
"pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0",
+
)}
+
/>
+
</SwitchPrimitives.Root>
+
));
+
Switch.displayName = SwitchPrimitives.Root.displayName;
+
+
export { Switch };
+72
src/components/ui/table.tsx
···
+
import * as React from "react";
+
+
import { cn } from "@/lib/utils";
+
+
const Table = React.forwardRef<HTMLTableElement, React.HTMLAttributes<HTMLTableElement>>(
+
({ className, ...props }, ref) => (
+
<div className="relative w-full overflow-auto">
+
<table ref={ref} className={cn("w-full caption-bottom text-sm", className)} {...props} />
+
</div>
+
),
+
);
+
Table.displayName = "Table";
+
+
const TableHeader = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(
+
({ className, ...props }, ref) => <thead ref={ref} className={cn("[&_tr]:border-b", className)} {...props} />,
+
);
+
TableHeader.displayName = "TableHeader";
+
+
const TableBody = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(
+
({ className, ...props }, ref) => (
+
<tbody ref={ref} className={cn("[&_tr:last-child]:border-0", className)} {...props} />
+
),
+
);
+
TableBody.displayName = "TableBody";
+
+
const TableFooter = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(
+
({ className, ...props }, ref) => (
+
<tfoot ref={ref} className={cn("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0", className)} {...props} />
+
),
+
);
+
TableFooter.displayName = "TableFooter";
+
+
const TableRow = React.forwardRef<HTMLTableRowElement, React.HTMLAttributes<HTMLTableRowElement>>(
+
({ className, ...props }, ref) => (
+
<tr
+
ref={ref}
+
className={cn("border-b transition-colors data-[state=selected]:bg-muted hover:bg-muted/50", className)}
+
{...props}
+
/>
+
),
+
);
+
TableRow.displayName = "TableRow";
+
+
const TableHead = React.forwardRef<HTMLTableCellElement, React.ThHTMLAttributes<HTMLTableCellElement>>(
+
({ className, ...props }, ref) => (
+
<th
+
ref={ref}
+
className={cn(
+
"h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0",
+
className,
+
)}
+
{...props}
+
/>
+
),
+
);
+
TableHead.displayName = "TableHead";
+
+
const TableCell = React.forwardRef<HTMLTableCellElement, React.TdHTMLAttributes<HTMLTableCellElement>>(
+
({ className, ...props }, ref) => (
+
<td ref={ref} className={cn("p-4 align-middle [&:has([role=checkbox])]:pr-0", className)} {...props} />
+
),
+
);
+
TableCell.displayName = "TableCell";
+
+
const TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(
+
({ className, ...props }, ref) => (
+
<caption ref={ref} className={cn("mt-4 text-sm text-muted-foreground", className)} {...props} />
+
),
+
);
+
TableCaption.displayName = "TableCaption";
+
+
export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };
+53
src/components/ui/tabs.tsx
···
+
import * as React from "react";
+
import * as TabsPrimitive from "@radix-ui/react-tabs";
+
+
import { cn } from "@/lib/utils";
+
+
const Tabs = TabsPrimitive.Root;
+
+
const TabsList = React.forwardRef<
+
React.ElementRef<typeof TabsPrimitive.List>,
+
React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>
+
>(({ className, ...props }, ref) => (
+
<TabsPrimitive.List
+
ref={ref}
+
className={cn(
+
"inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
TabsList.displayName = TabsPrimitive.List.displayName;
+
+
const TabsTrigger = React.forwardRef<
+
React.ElementRef<typeof TabsPrimitive.Trigger>,
+
React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>
+
>(({ className, ...props }, ref) => (
+
<TabsPrimitive.Trigger
+
ref={ref}
+
className={cn(
+
"inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
+
+
const TabsContent = React.forwardRef<
+
React.ElementRef<typeof TabsPrimitive.Content>,
+
React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>
+
>(({ className, ...props }, ref) => (
+
<TabsPrimitive.Content
+
ref={ref}
+
className={cn(
+
"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
TabsContent.displayName = TabsPrimitive.Content.displayName;
+
+
export { Tabs, TabsList, TabsTrigger, TabsContent };
+21
src/components/ui/textarea.tsx
···
+
import * as React from "react";
+
+
import { cn } from "@/lib/utils";
+
+
export interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}
+
+
const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(({ className, ...props }, ref) => {
+
return (
+
<textarea
+
className={cn(
+
"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
+
className,
+
)}
+
ref={ref}
+
{...props}
+
/>
+
);
+
});
+
Textarea.displayName = "Textarea";
+
+
export { Textarea };
+111
src/components/ui/toast.tsx
···
+
import * as React from "react";
+
import * as ToastPrimitives from "@radix-ui/react-toast";
+
import { cva, type VariantProps } from "class-variance-authority";
+
import { X } from "lucide-react";
+
+
import { cn } from "@/lib/utils";
+
+
const ToastProvider = ToastPrimitives.Provider;
+
+
const ToastViewport = React.forwardRef<
+
React.ElementRef<typeof ToastPrimitives.Viewport>,
+
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>
+
>(({ className, ...props }, ref) => (
+
<ToastPrimitives.Viewport
+
ref={ref}
+
className={cn(
+
"fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
ToastViewport.displayName = ToastPrimitives.Viewport.displayName;
+
+
const toastVariants = cva(
+
"group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",
+
{
+
variants: {
+
variant: {
+
default: "border bg-background text-foreground",
+
destructive: "destructive group border-destructive bg-destructive text-destructive-foreground",
+
},
+
},
+
defaultVariants: {
+
variant: "default",
+
},
+
},
+
);
+
+
const Toast = React.forwardRef<
+
React.ElementRef<typeof ToastPrimitives.Root>,
+
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> & VariantProps<typeof toastVariants>
+
>(({ className, variant, ...props }, ref) => {
+
return <ToastPrimitives.Root ref={ref} className={cn(toastVariants({ variant }), className)} {...props} />;
+
});
+
Toast.displayName = ToastPrimitives.Root.displayName;
+
+
const ToastAction = React.forwardRef<
+
React.ElementRef<typeof ToastPrimitives.Action>,
+
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>
+
>(({ className, ...props }, ref) => (
+
<ToastPrimitives.Action
+
ref={ref}
+
className={cn(
+
"inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors group-[.destructive]:border-muted/40 hover:bg-secondary group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 group-[.destructive]:focus:ring-destructive disabled:pointer-events-none disabled:opacity-50",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
ToastAction.displayName = ToastPrimitives.Action.displayName;
+
+
const ToastClose = React.forwardRef<
+
React.ElementRef<typeof ToastPrimitives.Close>,
+
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>
+
>(({ className, ...props }, ref) => (
+
<ToastPrimitives.Close
+
ref={ref}
+
className={cn(
+
"absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity group-hover:opacity-100 group-[.destructive]:text-red-300 hover:text-foreground group-[.destructive]:hover:text-red-50 focus:opacity-100 focus:outline-none focus:ring-2 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",
+
className,
+
)}
+
toast-close=""
+
{...props}
+
>
+
<X className="h-4 w-4" />
+
</ToastPrimitives.Close>
+
));
+
ToastClose.displayName = ToastPrimitives.Close.displayName;
+
+
const ToastTitle = React.forwardRef<
+
React.ElementRef<typeof ToastPrimitives.Title>,
+
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>
+
>(({ className, ...props }, ref) => (
+
<ToastPrimitives.Title ref={ref} className={cn("text-sm font-semibold", className)} {...props} />
+
));
+
ToastTitle.displayName = ToastPrimitives.Title.displayName;
+
+
const ToastDescription = React.forwardRef<
+
React.ElementRef<typeof ToastPrimitives.Description>,
+
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>
+
>(({ className, ...props }, ref) => (
+
<ToastPrimitives.Description ref={ref} className={cn("text-sm opacity-90", className)} {...props} />
+
));
+
ToastDescription.displayName = ToastPrimitives.Description.displayName;
+
+
type ToastProps = React.ComponentPropsWithoutRef<typeof Toast>;
+
+
type ToastActionElement = React.ReactElement<typeof ToastAction>;
+
+
export {
+
type ToastProps,
+
type ToastActionElement,
+
ToastProvider,
+
ToastViewport,
+
Toast,
+
ToastTitle,
+
ToastDescription,
+
ToastClose,
+
ToastAction,
+
};
+24
src/components/ui/toaster.tsx
···
+
import { useToast } from "@/hooks/use-toast";
+
import { Toast, ToastClose, ToastDescription, ToastProvider, ToastTitle, ToastViewport } from "@/components/ui/toast";
+
+
export function Toaster() {
+
const { toasts } = useToast();
+
+
return (
+
<ToastProvider>
+
{toasts.map(function ({ id, title, description, action, ...props }) {
+
return (
+
<Toast key={id} {...props}>
+
<div className="grid gap-1">
+
{title && <ToastTitle>{title}</ToastTitle>}
+
{description && <ToastDescription>{description}</ToastDescription>}
+
</div>
+
{action}
+
<ToastClose />
+
</Toast>
+
);
+
})}
+
<ToastViewport />
+
</ToastProvider>
+
);
+
}
+49
src/components/ui/toggle-group.tsx
···
+
import * as React from "react";
+
import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group";
+
import { type VariantProps } from "class-variance-authority";
+
+
import { cn } from "@/lib/utils";
+
import { toggleVariants } from "@/components/ui/toggle";
+
+
const ToggleGroupContext = React.createContext<VariantProps<typeof toggleVariants>>({
+
size: "default",
+
variant: "default",
+
});
+
+
const ToggleGroup = React.forwardRef<
+
React.ElementRef<typeof ToggleGroupPrimitive.Root>,
+
React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> & VariantProps<typeof toggleVariants>
+
>(({ className, variant, size, children, ...props }, ref) => (
+
<ToggleGroupPrimitive.Root ref={ref} className={cn("flex items-center justify-center gap-1", className)} {...props}>
+
<ToggleGroupContext.Provider value={{ variant, size }}>{children}</ToggleGroupContext.Provider>
+
</ToggleGroupPrimitive.Root>
+
));
+
+
ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;
+
+
const ToggleGroupItem = React.forwardRef<
+
React.ElementRef<typeof ToggleGroupPrimitive.Item>,
+
React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> & VariantProps<typeof toggleVariants>
+
>(({ className, children, variant, size, ...props }, ref) => {
+
const context = React.useContext(ToggleGroupContext);
+
+
return (
+
<ToggleGroupPrimitive.Item
+
ref={ref}
+
className={cn(
+
toggleVariants({
+
variant: context.variant || variant,
+
size: context.size || size,
+
}),
+
className,
+
)}
+
{...props}
+
>
+
{children}
+
</ToggleGroupPrimitive.Item>
+
);
+
});
+
+
ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;
+
+
export { ToggleGroup, ToggleGroupItem };
+37
src/components/ui/toggle.tsx
···
+
import * as React from "react";
+
import * as TogglePrimitive from "@radix-ui/react-toggle";
+
import { cva, type VariantProps } from "class-variance-authority";
+
+
import { cn } from "@/lib/utils";
+
+
const toggleVariants = cva(
+
"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground",
+
{
+
variants: {
+
variant: {
+
default: "bg-transparent",
+
outline: "border border-input bg-transparent hover:bg-accent hover:text-accent-foreground",
+
},
+
size: {
+
default: "h-10 px-3",
+
sm: "h-9 px-2.5",
+
lg: "h-11 px-5",
+
},
+
},
+
defaultVariants: {
+
variant: "default",
+
size: "default",
+
},
+
},
+
);
+
+
const Toggle = React.forwardRef<
+
React.ElementRef<typeof TogglePrimitive.Root>,
+
React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>
+
>(({ className, variant, size, ...props }, ref) => (
+
<TogglePrimitive.Root ref={ref} className={cn(toggleVariants({ variant, size, className }))} {...props} />
+
));
+
+
Toggle.displayName = TogglePrimitive.Root.displayName;
+
+
export { Toggle, toggleVariants };
+28
src/components/ui/tooltip.tsx
···
+
import * as React from "react";
+
import * as TooltipPrimitive from "@radix-ui/react-tooltip";
+
+
import { cn } from "@/lib/utils";
+
+
const TooltipProvider = TooltipPrimitive.Provider;
+
+
const Tooltip = TooltipPrimitive.Root;
+
+
const TooltipTrigger = TooltipPrimitive.Trigger;
+
+
const TooltipContent = React.forwardRef<
+
React.ElementRef<typeof TooltipPrimitive.Content>,
+
React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>
+
>(({ className, sideOffset = 4, ...props }, ref) => (
+
<TooltipPrimitive.Content
+
ref={ref}
+
sideOffset={sideOffset}
+
className={cn(
+
"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
+
className,
+
)}
+
{...props}
+
/>
+
));
+
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
+
+
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
+3
src/components/ui/use-toast.ts
···
+
import { useToast, toast } from "@/hooks/use-toast";
+
+
export { useToast, toast };
+19
src/hooks/use-mobile.tsx
···
+
import * as React from "react";
+
+
const MOBILE_BREAKPOINT = 768;
+
+
export function useIsMobile() {
+
const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined);
+
+
React.useEffect(() => {
+
const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
+
const onChange = () => {
+
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
+
};
+
mql.addEventListener("change", onChange);
+
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
+
return () => mql.removeEventListener("change", onChange);
+
}, []);
+
+
return !!isMobile;
+
}
+186
src/hooks/use-toast.ts
···
+
import * as React from "react";
+
+
import type { ToastActionElement, ToastProps } from "@/components/ui/toast";
+
+
const TOAST_LIMIT = 1;
+
const TOAST_REMOVE_DELAY = 1000000;
+
+
type ToasterToast = ToastProps & {
+
id: string;
+
title?: React.ReactNode;
+
description?: React.ReactNode;
+
action?: ToastActionElement;
+
};
+
+
const actionTypes = {
+
ADD_TOAST: "ADD_TOAST",
+
UPDATE_TOAST: "UPDATE_TOAST",
+
DISMISS_TOAST: "DISMISS_TOAST",
+
REMOVE_TOAST: "REMOVE_TOAST",
+
} as const;
+
+
let count = 0;
+
+
function genId() {
+
count = (count + 1) % Number.MAX_SAFE_INTEGER;
+
return count.toString();
+
}
+
+
type ActionType = typeof actionTypes;
+
+
type Action =
+
| {
+
type: ActionType["ADD_TOAST"];
+
toast: ToasterToast;
+
}
+
| {
+
type: ActionType["UPDATE_TOAST"];
+
toast: Partial<ToasterToast>;
+
}
+
| {
+
type: ActionType["DISMISS_TOAST"];
+
toastId?: ToasterToast["id"];
+
}
+
| {
+
type: ActionType["REMOVE_TOAST"];
+
toastId?: ToasterToast["id"];
+
};
+
+
interface State {
+
toasts: ToasterToast[];
+
}
+
+
const toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>();
+
+
const addToRemoveQueue = (toastId: string) => {
+
if (toastTimeouts.has(toastId)) {
+
return;
+
}
+
+
const timeout = setTimeout(() => {
+
toastTimeouts.delete(toastId);
+
dispatch({
+
type: "REMOVE_TOAST",
+
toastId: toastId,
+
});
+
}, TOAST_REMOVE_DELAY);
+
+
toastTimeouts.set(toastId, timeout);
+
};
+
+
export const reducer = (state: State, action: Action): State => {
+
switch (action.type) {
+
case "ADD_TOAST":
+
return {
+
...state,
+
toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
+
};
+
+
case "UPDATE_TOAST":
+
return {
+
...state,
+
toasts: state.toasts.map((t) => (t.id === action.toast.id ? { ...t, ...action.toast } : t)),
+
};
+
+
case "DISMISS_TOAST": {
+
const { toastId } = action;
+
+
// ! Side effects ! - This could be extracted into a dismissToast() action,
+
// but I'll keep it here for simplicity
+
if (toastId) {
+
addToRemoveQueue(toastId);
+
} else {
+
state.toasts.forEach((toast) => {
+
addToRemoveQueue(toast.id);
+
});
+
}
+
+
return {
+
...state,
+
toasts: state.toasts.map((t) =>
+
t.id === toastId || toastId === undefined
+
? {
+
...t,
+
open: false,
+
}
+
: t,
+
),
+
};
+
}
+
case "REMOVE_TOAST":
+
if (action.toastId === undefined) {
+
return {
+
...state,
+
toasts: [],
+
};
+
}
+
return {
+
...state,
+
toasts: state.toasts.filter((t) => t.id !== action.toastId),
+
};
+
}
+
};
+
+
const listeners: Array<(state: State) => void> = [];
+
+
let memoryState: State = { toasts: [] };
+
+
function dispatch(action: Action) {
+
memoryState = reducer(memoryState, action);
+
listeners.forEach((listener) => {
+
listener(memoryState);
+
});
+
}
+
+
type Toast = Omit<ToasterToast, "id">;
+
+
function toast({ ...props }: Toast) {
+
const id = genId();
+
+
const update = (props: ToasterToast) =>
+
dispatch({
+
type: "UPDATE_TOAST",
+
toast: { ...props, id },
+
});
+
const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id });
+
+
dispatch({
+
type: "ADD_TOAST",
+
toast: {
+
...props,
+
id,
+
open: true,
+
onOpenChange: (open) => {
+
if (!open) dismiss();
+
},
+
},
+
});
+
+
return {
+
id: id,
+
dismiss,
+
update,
+
};
+
}
+
+
function useToast() {
+
const [state, setState] = React.useState<State>(memoryState);
+
+
React.useEffect(() => {
+
listeners.push(setState);
+
return () => {
+
const index = listeners.indexOf(setState);
+
if (index > -1) {
+
listeners.splice(index, 1);
+
}
+
};
+
}, [state]);
+
+
return {
+
...state,
+
toast,
+
dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }),
+
};
+
}
+
+
export { useToast, toast };
+105
src/index.css
···
+
@tailwind base;
+
@tailwind components;
+
@tailwind utilities;
+
+
/* Definition of the design system. All colors, gradients, fonts, etc should be defined here.
+
All colors MUST be HSL.
+
*/
+
+
@layer base {
+
:root {
+
--background: 0 0% 100%;
+
--foreground: 222.2 84% 4.9%;
+
+
--card: 0 0% 100%;
+
--card-foreground: 222.2 84% 4.9%;
+
+
--popover: 0 0% 100%;
+
--popover-foreground: 222.2 84% 4.9%;
+
+
--primary: 222.2 47.4% 11.2%;
+
--primary-foreground: 210 40% 98%;
+
+
--secondary: 210 40% 96.1%;
+
--secondary-foreground: 222.2 47.4% 11.2%;
+
+
--muted: 210 40% 96.1%;
+
--muted-foreground: 215.4 16.3% 46.9%;
+
+
--accent: 210 40% 96.1%;
+
--accent-foreground: 222.2 47.4% 11.2%;
+
+
--destructive: 0 84.2% 60.2%;
+
--destructive-foreground: 210 40% 98%;
+
+
--border: 214.3 31.8% 91.4%;
+
--input: 214.3 31.8% 91.4%;
+
--ring: 222.2 84% 4.9%;
+
+
--radius: 0.5rem;
+
+
--sidebar-background: 0 0% 98%;
+
+
--sidebar-foreground: 240 5.3% 26.1%;
+
+
--sidebar-primary: 240 5.9% 10%;
+
+
--sidebar-primary-foreground: 0 0% 98%;
+
+
--sidebar-accent: 240 4.8% 95.9%;
+
+
--sidebar-accent-foreground: 240 5.9% 10%;
+
+
--sidebar-border: 220 13% 91%;
+
+
--sidebar-ring: 217.2 91.2% 59.8%;
+
}
+
+
.dark {
+
--background: 222.2 84% 4.9%;
+
--foreground: 210 40% 98%;
+
+
--card: 222.2 84% 4.9%;
+
--card-foreground: 210 40% 98%;
+
+
--popover: 222.2 84% 4.9%;
+
--popover-foreground: 210 40% 98%;
+
+
--primary: 210 40% 98%;
+
--primary-foreground: 222.2 47.4% 11.2%;
+
+
--secondary: 217.2 32.6% 17.5%;
+
--secondary-foreground: 210 40% 98%;
+
+
--muted: 217.2 32.6% 17.5%;
+
--muted-foreground: 215 20.2% 65.1%;
+
+
--accent: 217.2 32.6% 17.5%;
+
--accent-foreground: 210 40% 98%;
+
+
--destructive: 0 62.8% 30.6%;
+
--destructive-foreground: 210 40% 98%;
+
+
--border: 217.2 32.6% 17.5%;
+
--input: 217.2 32.6% 17.5%;
+
--ring: 212.7 26.8% 83.9%;
+
--sidebar-background: 240 5.9% 10%;
+
--sidebar-foreground: 240 4.8% 95.9%;
+
--sidebar-primary: 224.3 76.3% 48%;
+
--sidebar-primary-foreground: 0 0% 100%;
+
--sidebar-accent: 240 3.7% 15.9%;
+
--sidebar-accent-foreground: 240 4.8% 95.9%;
+
--sidebar-border: 240 3.7% 15.9%;
+
--sidebar-ring: 217.2 91.2% 59.8%;
+
}
+
}
+
+
@layer base {
+
* {
+
@apply border-border;
+
}
+
+
body {
+
@apply bg-background text-foreground;
+
}
+
}
+6
src/lib/utils.ts
···
+
import { clsx, type ClassValue } from "clsx";
+
import { twMerge } from "tailwind-merge";
+
+
export function cn(...inputs: ClassValue[]) {
+
return twMerge(clsx(inputs));
+
}
+5
src/main.tsx
···
+
import { createRoot } from "react-dom/client";
+
import App from "./App.tsx";
+
import "./index.css";
+
+
createRoot(document.getElementById("root")!).render(<App />);
+14
src/pages/Index.tsx
···
+
// Update this page (the content is just a fallback if you fail to update the page)
+
+
const Index = () => {
+
return (
+
<div className="flex min-h-screen items-center justify-center bg-background">
+
<div className="text-center">
+
<h1 className="mb-4 text-4xl font-bold">Welcome to Your Blank App</h1>
+
<p className="text-xl text-muted-foreground">Start building your amazing project here!</p>
+
</div>
+
</div>
+
);
+
};
+
+
export default Index;
+24
src/pages/NotFound.tsx
···
+
import { useLocation } from "react-router-dom";
+
import { useEffect } from "react";
+
+
const NotFound = () => {
+
const location = useLocation();
+
+
useEffect(() => {
+
console.error("404 Error: User attempted to access non-existent route:", location.pathname);
+
}, [location.pathname]);
+
+
return (
+
<div className="flex min-h-screen items-center justify-center bg-muted">
+
<div className="text-center">
+
<h1 className="mb-4 text-4xl font-bold">404</h1>
+
<p className="mb-4 text-xl text-muted-foreground">Oops! Page not found</p>
+
<a href="/" className="text-primary underline hover:text-primary/90">
+
Return to Home
+
</a>
+
</div>
+
</div>
+
);
+
};
+
+
export default NotFound;
+1
src/vite-env.d.ts
···
+
/// <reference types="vite/client" />
+91
tailwind.config.ts
···
+
import type { Config } from "tailwindcss";
+
+
export default {
+
darkMode: ["class"],
+
content: ["./pages/**/*.{ts,tsx}", "./components/**/*.{ts,tsx}", "./app/**/*.{ts,tsx}", "./src/**/*.{ts,tsx}"],
+
prefix: "",
+
theme: {
+
container: {
+
center: true,
+
padding: "2rem",
+
screens: {
+
"2xl": "1400px",
+
},
+
},
+
extend: {
+
colors: {
+
border: "hsl(var(--border))",
+
input: "hsl(var(--input))",
+
ring: "hsl(var(--ring))",
+
background: "hsl(var(--background))",
+
foreground: "hsl(var(--foreground))",
+
primary: {
+
DEFAULT: "hsl(var(--primary))",
+
foreground: "hsl(var(--primary-foreground))",
+
},
+
secondary: {
+
DEFAULT: "hsl(var(--secondary))",
+
foreground: "hsl(var(--secondary-foreground))",
+
},
+
destructive: {
+
DEFAULT: "hsl(var(--destructive))",
+
foreground: "hsl(var(--destructive-foreground))",
+
},
+
muted: {
+
DEFAULT: "hsl(var(--muted))",
+
foreground: "hsl(var(--muted-foreground))",
+
},
+
accent: {
+
DEFAULT: "hsl(var(--accent))",
+
foreground: "hsl(var(--accent-foreground))",
+
},
+
popover: {
+
DEFAULT: "hsl(var(--popover))",
+
foreground: "hsl(var(--popover-foreground))",
+
},
+
card: {
+
DEFAULT: "hsl(var(--card))",
+
foreground: "hsl(var(--card-foreground))",
+
},
+
sidebar: {
+
DEFAULT: "hsl(var(--sidebar-background))",
+
foreground: "hsl(var(--sidebar-foreground))",
+
primary: "hsl(var(--sidebar-primary))",
+
"primary-foreground": "hsl(var(--sidebar-primary-foreground))",
+
accent: "hsl(var(--sidebar-accent))",
+
"accent-foreground": "hsl(var(--sidebar-accent-foreground))",
+
border: "hsl(var(--sidebar-border))",
+
ring: "hsl(var(--sidebar-ring))",
+
},
+
},
+
borderRadius: {
+
lg: "var(--radius)",
+
md: "calc(var(--radius) - 2px)",
+
sm: "calc(var(--radius) - 4px)",
+
},
+
keyframes: {
+
"accordion-down": {
+
from: {
+
height: "0",
+
},
+
to: {
+
height: "var(--radix-accordion-content-height)",
+
},
+
},
+
"accordion-up": {
+
from: {
+
height: "var(--radix-accordion-content-height)",
+
},
+
to: {
+
height: "0",
+
},
+
},
+
},
+
animation: {
+
"accordion-down": "accordion-down 0.2s ease-out",
+
"accordion-up": "accordion-up 0.2s ease-out",
+
},
+
},
+
},
+
plugins: [require("tailwindcss-animate")],
+
} satisfies Config;
+30
tsconfig.app.json
···
+
{
+
"compilerOptions": {
+
"target": "ES2020",
+
"useDefineForClassFields": true,
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
+
"module": "ESNext",
+
"skipLibCheck": true,
+
+
/* Bundler mode */
+
"moduleResolution": "bundler",
+
"allowImportingTsExtensions": true,
+
"isolatedModules": true,
+
"moduleDetection": "force",
+
"noEmit": true,
+
"jsx": "react-jsx",
+
+
/* Linting */
+
"strict": false,
+
"noUnusedLocals": false,
+
"noUnusedParameters": false,
+
"noImplicitAny": false,
+
"noFallthroughCasesInSwitch": false,
+
+
"baseUrl": ".",
+
"paths": {
+
"@/*": ["./src/*"]
+
}
+
},
+
"include": ["src"]
+
}
+16
tsconfig.json
···
+
{
+
"files": [],
+
"references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }],
+
"compilerOptions": {
+
"baseUrl": ".",
+
"paths": {
+
"@/*": ["./src/*"]
+
},
+
"noImplicitAny": false,
+
"noUnusedParameters": false,
+
"skipLibCheck": true,
+
"allowJs": true,
+
"noUnusedLocals": false,
+
"strictNullChecks": false
+
}
+
}
+22
tsconfig.node.json
···
+
{
+
"compilerOptions": {
+
"target": "ES2022",
+
"lib": ["ES2023"],
+
"module": "ESNext",
+
"skipLibCheck": true,
+
+
/* Bundler mode */
+
"moduleResolution": "bundler",
+
"allowImportingTsExtensions": true,
+
"isolatedModules": true,
+
"moduleDetection": "force",
+
"noEmit": true,
+
+
/* Linting */
+
"strict": true,
+
"noUnusedLocals": false,
+
"noUnusedParameters": false,
+
"noFallthroughCasesInSwitch": true
+
},
+
"include": ["vite.config.ts"]
+
}
+18
vite.config.ts
···
+
import { defineConfig } from "vite";
+
import react from "@vitejs/plugin-react-swc";
+
import path from "path";
+
import { componentTagger } from "lovable-tagger";
+
+
// https://vitejs.dev/config/
+
export default defineConfig(({ mode }) => ({
+
server: {
+
host: "::",
+
port: 8080,
+
},
+
plugins: [react(), mode === "development" && componentTagger()].filter(Boolean),
+
resolve: {
+
alias: {
+
"@": path.resolve(__dirname, "./src"),
+
},
+
},
+
}));