diff --git a/examples/apps/social-media/.gitkeep b/examples/apps/social-media/.gitkeep
deleted file mode 100644
index e69de29b..00000000
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/.env.sample b/examples/apps/social-media/web/react-tailwind/kochu-media/.env.sample
new file mode 100644
index 00000000..d813a103
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/.env.sample
@@ -0,0 +1,23 @@
+# Appwrite Project ID
+VITE_APPWRITE_PROJECT_ID=''
+
+# Appwrite Endpoint URL
+VITE_APPWRITE_URL=''
+
+# Appwrite Storage ID for file uploads
+VITE_APPWRITE_STORAGE_ID=''
+
+# Appwrite Database ID for storing data
+VITE_APPWRITE_DATABASE_ID=''
+
+# Collection ID for saving user-related data
+VITE_APPWRITE_SAVE_COLLECTION_ID=''
+
+# Collection ID for managing user details
+VITE_APPWRITE_USER_COLLECTION_ID=''
+
+# Collection ID for blog posts or similar content
+VITE_APPWRITE_POST_COLLECTION_ID=''
+
+# Collection ID for storing comments
+VITE_APPWRITE_COMMENTS_COLLECTION_ID=''
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/.gitignore b/examples/apps/social-media/web/react-tailwind/kochu-media/.gitignore
new file mode 100644
index 00000000..801d4060
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/.gitignore
@@ -0,0 +1,64 @@
+# Node modules (both backend and frontend)
+node_modules/
+frontend/node_modules/
+backend/node_modules/
+
+# Logs
+logs/
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Env files
+.env
+frontend/.env
+backend/.env
+
+# Build directories
+build/
+frontend/build/
+backend/build/
+
+# Dist directories (for backend)
+dist/
+backend/dist/
+
+# Appwrite related
+/appwrite/docker-compose.yml
+/appwrite/.env
+/appwrite/appwrite.json
+/appwrite/storage/
+/appwrite/volumes/
+
+# Coverage directory
+coverage/
+frontend/coverage/
+backend/coverage/
+
+# Debug files
+*.lock
+*.pid
+*.seed
+*.log
+
+# OS generated files
+.DS_Store
+Thumbs.db
+
+# Misc
+*.sublime-workspace
+*.vscode
+.idea/
+
+# Editor directories
+.vscode/
+*.sublime-project
+*.sublime-workspace
+*.vscode/
+
+# Compiled binary addons (if applicable)
+build/Release/
+
+# Appwrite-related backups
+appwrite_backups/
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/README.md b/examples/apps/social-media/web/react-tailwind/kochu-media/README.md
new file mode 100644
index 00000000..14b473b9
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/README.md
@@ -0,0 +1,126 @@
+# Kochu-Media - Social Media Example
+link to the project: [Kochu-Media](https://kochugram.rajislab.com/)
+
+## Overview
+
+**Kochu-Media** is a dynamic, open-source social media web application built to demonstrate the integration of **FreeAPI.app** APIs into a modern social media platform. This project aims to showcase API handling and practical implementation for users looking to expand their API integration skills while contributing to the FreeAPI community.
+
+## ๐ Project Purpose
+
+The primary objective of Kochu-Media is to provide developers with a robust and interactive example of how to build a social media platform using open-source APIs. With its responsive design and comprehensive backend infrastructure, this project is an ideal reference for developers exploring API integration, user authentication, and real-time data handling. Kochu-Media aligns with FreeAPI.appโs mission of providing free, diverse, and accessible APIs for developers to experiment, learn, and grow.
+
+---
+
+## ๐ ๏ธ Tech Stack
+
+### **Frontend**
+- **React**: Core library for building a dynamic user interface.
+- **Framer Motion**: Powers smooth, engaging animations.
+- **Radix UI**: Accessible components (dialogs, dropdowns, etc.).
+- **Tailwind CSS**: Utility-first framework for responsive and efficient styling.
+- **Lucide & Tabler Icons**: Scalable, high-quality icon sets.
+- **React Router**: Client-side routing for seamless navigation.
+- **React Hook Form**: Efficient form handling with built-in validation.
+- **Zod**: Schema-based form validation for improved data integrity.
+
+### **Backend & Database**
+- **Appwrite**: Comprehensive backend-as-a-service for user authentication, database management, and real-time data syncing.
+- **Tanstack React Query**: Data-fetching and caching solution for smooth updates and interactions.
+
+### **Additional Tools**
+- **React Dropzone**: Simplified file upload mechanism for photos and media.
+- **Class Variance Authority (CVA)**: Centralized management of conditional component styling.
+- **Tailwind Merge**: Optimizes the merging of Tailwind classes.
+- **Clsx**: Efficient class name management in React components.
+
+---
+
+## ๐ Key Features
+
+1. **API Integration**: Leverages the **FreeAPI.app** APIs for handling data, including posts, user profiles, and media.
+2. **Social Media Essentials**: Supports user activities like media uploads, captions, and post saving, mirroring core social media functionality.
+3. **Responsive UI**: Ensures a mobile-friendly and responsive interface for optimal user experience across devices.
+4. **Real-Time Updates**: Powered by **Appwrite**, the platform provides real-time synchronization of posts and user activities.
+5. **Secure Authentication**: Implements Appwriteโs authentication system to securely manage user logins and sessions.
+6. **Efficient Media Uploads**: Integrated with **React Dropzone** to handle smooth photo and media uploads.
+7. **Fast & Interactive**: Utilizes **React Query** for efficient data caching and seamless API communication.
+
+---
+
+## ๐ฅ Why Contribute?
+
+Contributing to **Kochu-Media** allows you to:
+- Enhance your **API integration** skills by working with real-world scenarios.
+- Understand the **Appwrite** backend and database integration for scalable applications.
+- Learn how to create a **responsive social media UI** with modern frontend technologies.
+- Collaborate with a growing community of developers in the **FreeAPI.app** ecosystem.
+
+---
+
+## ๐ ๏ธ How to Use
+
+### Step 1: Clone the Repository
+
+```bash
+git clone https://github.com/[username]/kochu-media.git
+cd kochu-media
+```
+
+### Step 2: Install Dependencies
+
+```bash
+yarn install
+```
+
+### Step 3: Set Up Appwrite
+
+Configure your **Appwrite** project by adding the following environment variables to your `.env` file:
+
+```bash
+VITE_APPWRITE_PROJECT_ID=''
+VITE_APPWRITE_URL=''
+VITE_APPWRITE_STORAGE_ID=''
+VITE_APPWRITE_DATABASE_ID=''
+VITE_APPWRITE_USER_COLLECTION_ID=''
+VITE_APPWRITE_POST_COLLECTION_ID=''
+VITE_APPWRITE_COMMENTS_COLLECTION_ID=''
+```
+
+### Step 4: Start the Development Server
+
+```bash
+yarn dev
+```
+
+This will launch the application locally on your machine.
+
+### Step 5: Test API Integration
+
+Use the **FreeAPI.app** endpoints to explore API handling and practice data integration within the social media platform.
+
+---
+
+## ๐ Contribution Guidelines
+
+We welcome contributions to **Kochu-Media**! Here's how you can contribute:
+
+1. **Fork the repository** and create your own branch.
+2. **Add new features**, fix bugs, or improve the documentation.
+3. Submit a **pull request** for review.
+
+Ensure to follow the guidelines outlined in [CONTRIBUTING.md](../CONTRIBUTING.md) for a smooth collaboration process.
+
+---
+
+## ๐ก Learn More
+
+For more information on how to work with **FreeAPI.app** APIs or how to contribute to the **FreeAPI** project, visit the official [FreeAPI.app documentation](https://freeapi.app/docs).
+
+---
+
+## ๐ค Acknowledgments
+
+- **FreeAPI.app**: For providing a comprehensive and diverse set of APIs that fuel this project.
+- **Appwrite**: For offering a robust backend solution for managing user data and real-time updates.
+
+---
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/bun.lockb b/examples/apps/social-media/web/react-tailwind/kochu-media/bun.lockb
new file mode 100755
index 00000000..16aa2638
Binary files /dev/null and b/examples/apps/social-media/web/react-tailwind/kochu-media/bun.lockb differ
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/components.json b/examples/apps/social-media/web/react-tailwind/kochu-media/components.json
new file mode 100644
index 00000000..2097e013
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/components.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "new-york",
+ "rsc": false,
+ "tsx": true,
+ "tailwind": {
+ "config": "tailwind.config.js",
+ "css": "src/globals.css",
+ "baseColor": "slate",
+ "cssVariables": true,
+ "prefix": ""
+ },
+ "aliases": {
+ "components": "@/components",
+ "utils": "@/lib/utils",
+ "ui": "@/components/ui"
+ }
+}
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/eslint.config.js b/examples/apps/social-media/web/react-tailwind/kochu-media/eslint.config.js
new file mode 100644
index 00000000..0bbf074e
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/eslint.config.js
@@ -0,0 +1,28 @@
+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 },
+ ],
+ },
+ }
+);
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/index.html b/examples/apps/social-media/web/react-tailwind/kochu-media/index.html
new file mode 100644
index 00000000..a234016d
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ kochugram
+
+
+
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/package-lock.json b/examples/apps/social-media/web/react-tailwind/kochu-media/package-lock.json
new file mode 100644
index 00000000..217c2568
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/package-lock.json
@@ -0,0 +1,5968 @@
+{
+ "name": "social-media-webapp",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "social-media-webapp",
+ "version": "0.0.0",
+ "dependencies": {
+ "@hookform/resolvers": "^3.9.0",
+ "@radix-ui/react-alert-dialog": "^1.1.2",
+ "@radix-ui/react-dropdown-menu": "^2.1.2",
+ "@radix-ui/react-icons": "^1.3.0",
+ "@radix-ui/react-label": "^2.1.0",
+ "@radix-ui/react-slot": "^1.1.0",
+ "@radix-ui/react-toast": "^1.2.2",
+ "@react-three/fiber": "^8.17.9",
+ "@splinetool/react-spline": "^4.0.0",
+ "@splinetool/runtime": "^1.9.28",
+ "@tabler/icons-react": "^3.19.0",
+ "@tanstack/react-query": "^5.56.2",
+ "appwrite": "^14.0.1",
+ "class-variance-authority": "^0.7.0",
+ "clsx": "^2.1.1",
+ "framer-motion": "^11.9.0",
+ "gsap": "^3.12.5",
+ "lucide-react": "^0.446.0",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "react-dropzone": "^14.2.3",
+ "react-hook-form": "^7.53.0",
+ "react-intersection-observer": "^9.13.1",
+ "react-router-dom": "^6.26.2",
+ "tailwind-merge": "^2.5.2",
+ "tailwindcss-animate": "^1.0.7",
+ "three": "^0.169.0",
+ "zod": "^3.23.8"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.9.0",
+ "@types/node": "^22.7.4",
+ "@types/react": "^18.3.10",
+ "@types/react-dom": "^18.3.0",
+ "@types/three": "^0.169.0",
+ "@vitejs/plugin-react": "^4.3.1",
+ "autoprefixer": "^10.4.20",
+ "eslint": "^9.9.0",
+ "eslint-plugin-react-hooks": "^5.1.0-rc.0",
+ "eslint-plugin-react-refresh": "^0.4.9",
+ "globals": "^15.9.0",
+ "postcss": "^8.4.47",
+ "tailwindcss": "^3.4.13",
+ "typescript": "^5.6.2",
+ "typescript-eslint": "^8.0.1",
+ "vite": "^5.4.1"
+ }
+ },
+ "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/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz",
+ "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/highlight": "^7.25.7",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz",
+ "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz",
+ "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.25.7",
+ "@babel/generator": "^7.25.7",
+ "@babel/helper-compilation-targets": "^7.25.7",
+ "@babel/helper-module-transforms": "^7.25.7",
+ "@babel/helpers": "^7.25.7",
+ "@babel/parser": "^7.25.7",
+ "@babel/template": "^7.25.7",
+ "@babel/traverse": "^7.25.7",
+ "@babel/types": "^7.25.7",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz",
+ "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.7",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz",
+ "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.25.7",
+ "@babel/helper-validator-option": "^7.25.7",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz",
+ "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.7",
+ "@babel/types": "^7.25.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz",
+ "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.7",
+ "@babel/helper-simple-access": "^7.25.7",
+ "@babel/helper-validator-identifier": "^7.25.7",
+ "@babel/traverse": "^7.25.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz",
+ "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz",
+ "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.25.7",
+ "@babel/types": "^7.25.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz",
+ "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz",
+ "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz",
+ "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz",
+ "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.25.7",
+ "@babel/types": "^7.25.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz",
+ "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.25.7",
+ "chalk": "^2.4.2",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz",
+ "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.7"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.7.tgz",
+ "integrity": "sha512-JD9MUnLbPL0WdVK8AWC7F7tTG2OS6u/AKKnsK+NdRhUiVdnzyR1S3kKQCaRLOiaULvUiqK6Z4JQE635VgtCFeg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.7.tgz",
+ "integrity": "sha512-S/JXG/KrbIY06iyJPKfxr0qRxnhNOdkNXYBl/rmwgDd72cQLH9tEGkDm/yJPGvcSIUoikzfjMios9i+xT/uv9w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz",
+ "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.25.7",
+ "@babel/parser": "^7.25.7",
+ "@babel/types": "^7.25.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz",
+ "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.25.7",
+ "@babel/generator": "^7.25.7",
+ "@babel/parser": "^7.25.7",
+ "@babel/template": "^7.25.7",
+ "@babel/types": "^7.25.7",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz",
+ "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.25.7",
+ "@babel/helper-validator-identifier": "^7.25.7",
+ "to-fast-properties": "^2.0.0"
+ },
+ "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-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-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.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "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.11.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz",
+ "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz",
+ "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.4",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz",
+ "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
+ "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
+ "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.12.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz",
+ "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz",
+ "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz",
+ "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.6.8",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz",
+ "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.8"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.6.11",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.11.tgz",
+ "integrity": "sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/core": "^1.6.0",
+ "@floating-ui/utils": "^0.2.8"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz",
+ "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/dom": "^1.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz",
+ "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==",
+ "license": "MIT"
+ },
+ "node_modules/@hookform/resolvers": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.9.0.tgz",
+ "integrity": "sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react-hook-form": "^7.0.0"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz",
+ "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.5",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz",
+ "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.0",
+ "@humanwhocodes/retry": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.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/@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/primitive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz",
+ "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==",
+ "license": "MIT"
+ },
+ "node_modules/@radix-ui/react-alert-dialog": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.2.tgz",
+ "integrity": "sha512-eGSlLzPhKO+TErxkiGcCZGuvbVMnLA1MTnyBksGOeGRGkxHiiJUujsjmNTdWTm4iHVSRaUao9/4Ur671auMghQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-dialog": "1.1.2",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-slot": "1.1.0"
+ },
+ "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.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz",
+ "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.0.0"
+ },
+ "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.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz",
+ "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-slot": "1.1.0"
+ },
+ "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/node_modules/@radix-ui/react-context": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz",
+ "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==",
+ "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-compose-refs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz",
+ "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==",
+ "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.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz",
+ "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==",
+ "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-dialog": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz",
+ "integrity": "sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-dismissable-layer": "1.1.1",
+ "@radix-ui/react-focus-guards": "1.1.1",
+ "@radix-ui/react-focus-scope": "1.1.0",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-portal": "1.1.2",
+ "@radix-ui/react-presence": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-slot": "1.1.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "2.6.0"
+ },
+ "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.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz",
+ "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==",
+ "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.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz",
+ "integrity": "sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-escape-keydown": "1.1.0"
+ },
+ "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.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.2.tgz",
+ "integrity": "sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-menu": "2.1.2",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0"
+ },
+ "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.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz",
+ "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==",
+ "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.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz",
+ "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-callback-ref": "1.1.0"
+ },
+ "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-icons": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.0.tgz",
+ "integrity": "sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.x || ^17.x || ^18.x"
+ }
+ },
+ "node_modules/@radix-ui/react-id": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz",
+ "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.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-label": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.0.tgz",
+ "integrity": "sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.0.0"
+ },
+ "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.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.2.tgz",
+ "integrity": "sha512-lZ0R4qR2Al6fZ4yCCZzu/ReTFrylHFxIqy7OezIpWF4bL0o9biKo0pFIvkaew3TyZ9Fy5gYVrR5zCGZBVbO1zg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-collection": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-direction": "1.1.0",
+ "@radix-ui/react-dismissable-layer": "1.1.1",
+ "@radix-ui/react-focus-guards": "1.1.1",
+ "@radix-ui/react-focus-scope": "1.1.0",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-popper": "1.2.0",
+ "@radix-ui/react-portal": "1.1.2",
+ "@radix-ui/react-presence": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-roving-focus": "1.1.0",
+ "@radix-ui/react-slot": "1.1.0",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "2.6.0"
+ },
+ "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.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz",
+ "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/react-dom": "^2.0.0",
+ "@radix-ui/react-arrow": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0",
+ "@radix-ui/react-use-rect": "1.1.0",
+ "@radix-ui/react-use-size": "1.1.0",
+ "@radix-ui/rect": "1.1.0"
+ },
+ "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/node_modules/@radix-ui/react-context": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz",
+ "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==",
+ "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-portal": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.2.tgz",
+ "integrity": "sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0"
+ },
+ "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.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.1.tgz",
+ "integrity": "sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0"
+ },
+ "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.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz",
+ "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.1.0"
+ },
+ "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.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz",
+ "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-collection": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.0",
+ "@radix-ui/react-direction": "1.1.0",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0"
+ },
+ "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/node_modules/@radix-ui/react-context": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz",
+ "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==",
+ "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-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz",
+ "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.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-toast": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.2.tgz",
+ "integrity": "sha512-Z6pqSzmAP/bFJoqMAston4eSNa+ud44NSZTiZUmUen+IOZ5nBY8kzuU5WDBVyFXPtcW6yUalOHsxM/BP6Sv8ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-collection": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-dismissable-layer": "1.1.1",
+ "@radix-ui/react-portal": "1.1.2",
+ "@radix-ui/react-presence": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0",
+ "@radix-ui/react-visually-hidden": "1.1.0"
+ },
+ "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.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz",
+ "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==",
+ "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.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz",
+ "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.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-escape-keydown": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz",
+ "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.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.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz",
+ "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==",
+ "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.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz",
+ "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/rect": "1.1.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-size": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz",
+ "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.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-visually-hidden": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz",
+ "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.0.0"
+ },
+ "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.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz",
+ "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==",
+ "license": "MIT"
+ },
+ "node_modules/@react-three/fiber": {
+ "version": "8.17.9",
+ "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.17.9.tgz",
+ "integrity": "sha512-uZclikSqDdI15D0t8l8F8fyRyzl6BYwUOlEke2BIjAsjVzQy5MQPROVEc/9/Ef/PAezfl6lrLulMlYwgS1JGIg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.17.8",
+ "@types/debounce": "^1.2.1",
+ "@types/react-reconciler": "^0.26.7",
+ "@types/webxr": "*",
+ "base64-js": "^1.5.1",
+ "buffer": "^6.0.3",
+ "debounce": "^1.2.1",
+ "its-fine": "^1.0.6",
+ "react-reconciler": "^0.27.0",
+ "scheduler": "^0.21.0",
+ "suspend-react": "^0.1.3",
+ "zustand": "^3.7.1"
+ },
+ "peerDependencies": {
+ "expo": ">=43.0",
+ "expo-asset": ">=8.4",
+ "expo-file-system": ">=11.0",
+ "expo-gl": ">=11.0",
+ "react": ">=18.0",
+ "react-dom": ">=18.0",
+ "react-native": ">=0.64",
+ "three": ">=0.133"
+ },
+ "peerDependenciesMeta": {
+ "expo": {
+ "optional": true
+ },
+ "expo-asset": {
+ "optional": true
+ },
+ "expo-file-system": {
+ "optional": true
+ },
+ "expo-gl": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@remix-run/router": {
+ "version": "1.19.2",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz",
+ "integrity": "sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "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/@splinetool/react-spline": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@splinetool/react-spline/-/react-spline-4.0.0.tgz",
+ "integrity": "sha512-FqrV7/K2q998Y0t83QUauQxsifKWAg9CFZoSb64qRuH7IfHkDs5/OgU1ACkg0aTgsEPtFlH+kATQ+8X6MrizHQ==",
+ "dependencies": {
+ "blurhash": "2.0.5",
+ "lodash.debounce": "4.0.8",
+ "react-merge-refs": "2.1.1",
+ "thumbhash": "0.1.1"
+ },
+ "peerDependencies": {
+ "@splinetool/runtime": "*",
+ "next": ">=14.2.0",
+ "react": "*",
+ "react-dom": "*"
+ },
+ "peerDependenciesMeta": {
+ "next": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@splinetool/runtime": {
+ "version": "1.9.28",
+ "resolved": "https://registry.npmjs.org/@splinetool/runtime/-/runtime-1.9.28.tgz",
+ "integrity": "sha512-YWijR1tqiPuu1w4/lwu6s29Nw2xwgAOV8YdWrJk11vwZaf3BfavhrQWIfcSfxJ2d0gmHgTZDGQ5jubXrj/fuCQ==",
+ "dependencies": {
+ "on-change": "^4.0.0",
+ "semver-compare": "^1.0.0"
+ }
+ },
+ "node_modules/@tabler/icons": {
+ "version": "3.19.0",
+ "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.19.0.tgz",
+ "integrity": "sha512-A4WEWqpdbTfnpFEtwXqwAe9qf9sp1yRPvzppqAuwcoF0q5YInqB+JkJtSFToCyBpPVeLxJUxxkapLvt2qQgnag==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/codecalm"
+ }
+ },
+ "node_modules/@tabler/icons-react": {
+ "version": "3.19.0",
+ "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.19.0.tgz",
+ "integrity": "sha512-AqEWGI0tQWgqo6ZjMO5yJ9sYT8oXLuAM/up0hN9iENS6IdtNZryKrkNSiMgpwweNTpl8wFFG/dAZ959S91A/uQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@tabler/icons": "3.19.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/codecalm"
+ },
+ "peerDependencies": {
+ "react": ">= 16"
+ }
+ },
+ "node_modules/@tanstack/query-core": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.59.0.tgz",
+ "integrity": "sha512-WGD8uIhX6/deH/tkZqPNcRyAhDUqs729bWKoByYHSogcshXfFbppOdTER5+qY7mFvu8KEFJwT0nxr8RfPTVh0Q==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
+ "node_modules/@tanstack/react-query": {
+ "version": "5.59.0",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.59.0.tgz",
+ "integrity": "sha512-YDXp3OORbYR+8HNQx+lf4F73NoiCmCcSvZvgxE29OifmQFk0sBlO26NWLHpcNERo92tVk3w+JQ53/vkcRUY1hA==",
+ "license": "MIT",
+ "dependencies": {
+ "@tanstack/query-core": "5.59.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": "^18 || ^19"
+ }
+ },
+ "node_modules/@tweenjs/tween.js": {
+ "version": "23.1.3",
+ "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz",
+ "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.6.8",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+ "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.6",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
+ "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "node_modules/@types/debounce": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.4.tgz",
+ "integrity": "sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==",
+ "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.7.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz",
+ "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.19.2"
+ }
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "18.3.11",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz",
+ "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.3.0",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz",
+ "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-reconciler": {
+ "version": "0.26.7",
+ "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz",
+ "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/stats.js": {
+ "version": "0.17.3",
+ "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz",
+ "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/three": {
+ "version": "0.169.0",
+ "resolved": "https://registry.npmjs.org/@types/three/-/three-0.169.0.tgz",
+ "integrity": "sha512-oan7qCgJBt03wIaK+4xPWclYRPG9wzcg7Z2f5T8xYTNEF95kh0t0lklxLLYBDo7gQiGLYzE6iF4ta7nXF2bcsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tweenjs/tween.js": "~23.1.3",
+ "@types/stats.js": "*",
+ "@types/webxr": "*",
+ "@webgpu/types": "*",
+ "fflate": "~0.8.2",
+ "meshoptimizer": "~0.18.1"
+ }
+ },
+ "node_modules/@types/webxr": {
+ "version": "0.5.20",
+ "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.20.tgz",
+ "integrity": "sha512-JGpU6qiIJQKUuVSKx1GtQnHJGxRjtfGIhzO2ilq43VZZS//f1h1Sgexbdk+Lq+7569a6EYhOWrUpIruR/1Enmg==",
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.0.tgz",
+ "integrity": "sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.10.0",
+ "@typescript-eslint/scope-manager": "8.8.0",
+ "@typescript-eslint/type-utils": "8.8.0",
+ "@typescript-eslint/utils": "8.8.0",
+ "@typescript-eslint/visitor-keys": "8.8.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.3.1",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^1.3.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.0.0 || ^8.0.0-alpha.0",
+ "eslint": "^8.57.0 || ^9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.8.0.tgz",
+ "integrity": "sha512-uEFUsgR+tl8GmzmLjRqz+VrDv4eoaMqMXW7ruXfgThaAShO9JTciKpEsB+TvnfFfbg5IpujgMXVV36gOJRLtZg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.8.0",
+ "@typescript-eslint/types": "8.8.0",
+ "@typescript-eslint/typescript-estree": "8.8.0",
+ "@typescript-eslint/visitor-keys": "8.8.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"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.0.tgz",
+ "integrity": "sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.8.0",
+ "@typescript-eslint/visitor-keys": "8.8.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/type-utils": {
+ "version": "8.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.0.tgz",
+ "integrity": "sha512-IKwJSS7bCqyCeG4NVGxnOP6lLT9Okc3Zj8hLO96bpMkJab+10HIfJbMouLrlpyOr3yrQ1cA413YPFiGd1mW9/Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "8.8.0",
+ "@typescript-eslint/utils": "8.8.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.0.tgz",
+ "integrity": "sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==",
+ "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.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.0.tgz",
+ "integrity": "sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/types": "8.8.0",
+ "@typescript-eslint/visitor-keys": "8.8.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": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "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/typescript-estree/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.0.tgz",
+ "integrity": "sha512-QE2MgfOTem00qrlPgyByaCHay9yb1+9BjnMFnSFkUKQfu7adBXDTnCAivURnuPPAG/qiB+kzKkZKmKfaMT0zVg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@typescript-eslint/scope-manager": "8.8.0",
+ "@typescript-eslint/types": "8.8.0",
+ "@typescript-eslint/typescript-estree": "8.8.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"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.0.tgz",
+ "integrity": "sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.8.0",
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys/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/@vitejs/plugin-react": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.2.tgz",
+ "integrity": "sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.25.2",
+ "@babel/plugin-transform-react-jsx-self": "^7.24.7",
+ "@babel/plugin-transform-react-jsx-source": "^7.24.7",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.14.2"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0"
+ }
+ },
+ "node_modules/@webgpu/types": {
+ "version": "0.1.48",
+ "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.48.tgz",
+ "integrity": "sha512-e3zmDEPih4Rle+JrP5cT8nCCtDizoUpEaN72OuD1clbhXGERtn0wwuMdxOrBymu3kMLWKDd8hd+ERhSheLuLTg==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/acorn": {
+ "version": "8.12.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
+ "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
+ "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": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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/appwrite": {
+ "version": "14.0.1",
+ "resolved": "https://registry.npmjs.org/appwrite/-/appwrite-14.0.1.tgz",
+ "integrity": "sha512-ORlvfqVif/2K3qKGgGiGfMP33Zwm+xxB1fIC4Lm3sojOkDd8u8YvgKQO0Meq5UXb8Dc0Rl66Z7qlGBAfRQ04bA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "cross-fetch": "3.1.5",
+ "isomorphic-form-data": "2.0.0"
+ }
+ },
+ "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/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/attr-accept": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz",
+ "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.20",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
+ "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
+ "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.23.3",
+ "caniuse-lite": "^1.0.30001646",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.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/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "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/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/blurhash": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz",
+ "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==",
+ "license": "MIT"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "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.24.0",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz",
+ "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==",
+ "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.30001663",
+ "electron-to-chromium": "^1.5.28",
+ "node-releases": "^2.0.18",
+ "update-browserslist-db": "^1.1.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "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": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "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.30001667",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz",
+ "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==",
+ "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": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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.0",
+ "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz",
+ "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "clsx": "2.0.0"
+ },
+ "funding": {
+ "url": "https://joebell.co.uk"
+ }
+ },
+ "node_modules/class-variance-authority/node_modules/clsx": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz",
+ "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "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/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-fetch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz",
+ "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==",
+ "license": "MIT",
+ "dependencies": {
+ "node-fetch": "2.6.7"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "license": "MIT",
+ "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/debounce": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz",
+ "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==",
+ "license": "MIT"
+ },
+ "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/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/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "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/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.32",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.32.tgz",
+ "integrity": "sha512-M+7ph0VGBQqqpTT2YrabjNKSQ2fEl9PVx6AK3N558gDH9NO8O6XN9SXXFWRo9u9PbEg/bWq+tjXQr+eXmxubCw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "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": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.12.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz",
+ "integrity": "sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.11.0",
+ "@eslint/config-array": "^0.18.0",
+ "@eslint/core": "^0.6.0",
+ "@eslint/eslintrc": "^3.1.0",
+ "@eslint/js": "9.12.0",
+ "@eslint/plugin-kit": "^0.2.0",
+ "@humanfs/node": "^0.16.5",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.3.1",
+ "@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.1.0",
+ "eslint-visitor-keys": "^4.1.0",
+ "espree": "^10.2.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",
+ "text-table": "^0.2.0"
+ },
+ "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.1.0-rc-fb9a90fa48-20240614",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0-rc-fb9a90fa48-20240614.tgz",
+ "integrity": "sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w==",
+ "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.12",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.12.tgz",
+ "integrity": "sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": ">=7"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz",
+ "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==",
+ "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.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz",
+ "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==",
+ "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/eslint/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/eslint/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/eslint/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/eslint/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/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/eslint/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/espree": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz",
+ "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.12.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.1.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-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/fflate": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz",
+ "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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/file-selector": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz",
+ "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "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/form-data": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
+ "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
+ },
+ "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/framer-motion": {
+ "version": "11.11.1",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.11.1.tgz",
+ "integrity": "sha512-Ucr9eHSrk0d+l6vyl9fvq6omh/PAWHjS+PlczpsoUdhJo1TuF3ULWJNuAMnpWQ1dGyPOyoUVuYlUKjE/s8dyCA==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "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/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/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.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "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.10.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.10.0.tgz",
+ "integrity": "sha512-tqFIbz83w4Y5TCbtgjZjApohbuh7K9BxGYFm7ifwDR240tvdb7P9x+/9VvUKlmkPoiknoJtanI8UOrqxS3a7lQ==",
+ "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/gsap": {
+ "version": "3.12.5",
+ "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.12.5.tgz",
+ "integrity": "sha512-srBfnk4n+Oe/ZnMIOXt3gT605BX9x5+rh/prT2F1SsNJsU1XuMiP0E2aptW481OnonOGACZWBqseH5Z7csHxhQ==",
+ "license": "Standard 'no charge' license: https://gsap.com/standard-license. Club GSAP members get more: https://gsap.com/licensing/. Why GreenSock doesn't employ an MIT license: https://gsap.com/why-license/"
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "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": "BSD-3-Clause"
+ },
+ "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.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "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/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "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/isomorphic-form-data": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isomorphic-form-data/-/isomorphic-form-data-2.0.0.tgz",
+ "integrity": "sha512-TYgVnXWeESVmQSg4GLVbalmQ+B4NPi/H4eWxqALKj63KsUrcu301YDjBqaOw3h+cbak7Na4Xyps3BiptHtxTfg==",
+ "license": "MIT",
+ "dependencies": {
+ "form-data": "^2.3.2"
+ }
+ },
+ "node_modules/its-fine": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz",
+ "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/react-reconciler": "^0.28.0"
+ },
+ "peerDependencies": {
+ "react": ">=18.0"
+ }
+ },
+ "node_modules/its-fine/node_modules/@types/react-reconciler": {
+ "version": "0.28.8",
+ "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz",
+ "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "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/jsesc": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+ "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/lucide-react": {
+ "version": "0.446.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.446.0.tgz",
+ "integrity": "sha512-BU7gy8MfBMqvEdDPH79VhOXSEgyG8TSPOKWaExWGCQVqnGH7wGgDngPbofu+KdtVjPQBWbEmnfMTq90CTiiDRg==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc"
+ }
+ },
+ "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/meshoptimizer": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz",
+ "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.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.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-fetch": {
+ "version": "2.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+ "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
+ "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
+ "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/on-change": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/on-change/-/on-change-4.0.2.tgz",
+ "integrity": "sha512-cMtCyuJmTx/bg2HCpHo3ZLeF7FZnBOapLqZHr2AlLeJ5Ul0Zu2mUJJz051Fdwu/Et2YW04ZD+TtU+gVy0ACNCA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/on-change?sponsor=1"
+ }
+ },
+ "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/path-scurry/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/picocolors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
+ "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
+ "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.4.47",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
+ "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
+ "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.7",
+ "picocolors": "^1.1.0",
+ "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-load-config/node_modules/lilconfig": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
+ "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "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/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-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-dom/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/react-dropzone": {
+ "version": "14.2.9",
+ "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.9.tgz",
+ "integrity": "sha512-jRZsMC7h48WONsOLHcmhyn3cRWJoIPQjPApvt/sJVfnYaB3Qltn025AoRTTJaj4WdmmgmLl6tUQg1s0wOhpodQ==",
+ "license": "MIT",
+ "dependencies": {
+ "attr-accept": "^2.2.2",
+ "file-selector": "^0.6.0",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">= 10.13"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8 || 18.0.0"
+ }
+ },
+ "node_modules/react-hook-form": {
+ "version": "7.53.0",
+ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.0.tgz",
+ "integrity": "sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==",
+ "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-intersection-observer": {
+ "version": "9.13.1",
+ "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.13.1.tgz",
+ "integrity": "sha512-tSzDaTy0qwNPLJHg8XZhlyHTgGW6drFKTtvjdL+p6um12rcnp8Z5XstE+QNBJ7c64n5o0Lj4ilUleA41bmDoMw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "license": "MIT"
+ },
+ "node_modules/react-merge-refs": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/react-merge-refs/-/react-merge-refs-2.1.1.tgz",
+ "integrity": "sha512-jLQXJ/URln51zskhgppGJ2ub7b2WFKGq3cl3NYKtlHoTG+dN2q7EzWrn3hN3EgPsTMvpR9tpq5ijdp7YwFZkag==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/react-reconciler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz",
+ "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.21.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0"
+ }
+ },
+ "node_modules/react-refresh": {
+ "version": "0.14.2",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
+ "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-remove-scroll": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz",
+ "integrity": "sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==",
+ "license": "MIT",
+ "dependencies": {
+ "react-remove-scroll-bar": "^2.3.6",
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.0",
+ "use-sidecar": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-remove-scroll-bar": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz",
+ "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==",
+ "license": "MIT",
+ "dependencies": {
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-router": {
+ "version": "6.26.2",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.2.tgz",
+ "integrity": "sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==",
+ "license": "MIT",
+ "dependencies": {
+ "@remix-run/router": "1.19.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.26.2",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.2.tgz",
+ "integrity": "sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@remix-run/router": "1.19.2",
+ "react-router": "6.26.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
+ "node_modules/react-style-singleton": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
+ "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==",
+ "license": "MIT",
+ "dependencies": {
+ "get-nonce": "^1.0.0",
+ "invariant": "^2.2.4",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "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/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+ "license": "MIT"
+ },
+ "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.21.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz",
+ "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/semver-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+ "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
+ "license": "MIT"
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "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/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": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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/suspend-react": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz",
+ "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=17.0"
+ }
+ },
+ "node_modules/tailwind-merge": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.3.tgz",
+ "integrity": "sha512-d9ZolCAIzom1nf/5p4LdD5zvjmgSxY0BGgdSvmXIoMYAiPdAW/dSpP7joCDYFY7r/HkEa2qmPtkgsu0xjQeQtw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/dcastil"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.4.13",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.13.tgz",
+ "integrity": "sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==",
+ "license": "MIT",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.3.0",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.21.0",
+ "lilconfig": "^2.1.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.23",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.1",
+ "postcss-nested": "^6.0.1",
+ "postcss-selector-parser": "^6.0.11",
+ "resolve": "^1.22.2",
+ "sucrase": "^3.32.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/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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/three": {
+ "version": "0.169.0",
+ "resolved": "https://registry.npmjs.org/three/-/three-0.169.0.tgz",
+ "integrity": "sha512-Ed906MA3dR4TS5riErd4QBsRGPcx+HBDX2O5yYE5GqJeFQTPU+M56Va/f/Oph9X7uZo3W3o4l2ZhBZ6f6qUv0w==",
+ "license": "MIT"
+ },
+ "node_modules/thumbhash": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/thumbhash/-/thumbhash-0.1.1.tgz",
+ "integrity": "sha512-kH5pKeIIBPQXAOni2AiY/Cu/NKdkFREdpH+TLdM0g6WA7RriCv0kPLgP731ady67MhTAqrVG/4mnEeibVuCJcg==",
+ "license": "MIT"
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "license": "MIT"
+ },
+ "node_modules/ts-api-utils": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
+ "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
+ "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.7.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz",
+ "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==",
+ "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.6.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz",
+ "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-eslint": {
+ "version": "8.8.0",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.8.0.tgz",
+ "integrity": "sha512-BjIT/VwJ8+0rVO01ZQ2ZVnjE1svFBiRczcpr1t1Yxt7sT25VSbPfrJtDsQ8uQTy2pilX5nI9gwxhUyLULNentw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.8.0",
+ "@typescript-eslint/parser": "8.8.0",
+ "@typescript-eslint/utils": "8.8.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.19.8",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
+ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
+ "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
+ "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.0"
+ },
+ "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.2",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz",
+ "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-sidecar": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz",
+ "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==",
+ "license": "MIT",
+ "dependencies": {
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "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/vite": {
+ "version": "5.4.8",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz",
+ "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==",
+ "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/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "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/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/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/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yaml": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz",
+ "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==",
+ "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.23.8",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz",
+ "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zustand": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz",
+ "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.7.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ }
+ }
+ }
+ }
+}
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/package.json b/examples/apps/social-media/web/react-tailwind/kochu-media/package.json
new file mode 100644
index 00000000..2b94d599
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/package.json
@@ -0,0 +1,60 @@
+{
+ "name": "social-media-webapp",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "lint": "eslint .",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@hookform/resolvers": "^3.9.0",
+ "@radix-ui/react-alert-dialog": "^1.1.2",
+ "@radix-ui/react-dropdown-menu": "^2.1.2",
+ "@radix-ui/react-icons": "^1.3.0",
+ "@radix-ui/react-label": "^2.1.0",
+ "@radix-ui/react-slot": "^1.1.0",
+ "@radix-ui/react-toast": "^1.2.2",
+ "@react-three/fiber": "^8.17.9",
+ "@splinetool/react-spline": "^4.0.0",
+ "@splinetool/runtime": "^1.9.28",
+ "@tabler/icons-react": "^3.19.0",
+ "@tanstack/react-query": "^5.56.2",
+ "appwrite": "^14.0.1",
+ "class-variance-authority": "^0.7.0",
+ "clsx": "^2.1.1",
+ "framer-motion": "^11.9.0",
+ "gsap": "^3.12.5",
+ "lucide-react": "^0.446.0",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "react-dropzone": "^14.2.3",
+ "react-hook-form": "^7.53.0",
+ "react-intersection-observer": "^9.13.1",
+ "react-router-dom": "^6.26.2",
+ "tailwind-merge": "^2.5.2",
+ "tailwindcss-animate": "^1.0.7",
+ "three": "^0.169.0",
+ "zod": "^3.23.8"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.9.0",
+ "@types/node": "^22.7.4",
+ "@types/react": "^18.3.10",
+ "@types/react-dom": "^18.3.0",
+ "@types/three": "^0.169.0",
+ "@vitejs/plugin-react": "^4.3.1",
+ "autoprefixer": "^10.4.20",
+ "eslint": "^9.9.0",
+ "eslint-plugin-react-hooks": "^5.1.0-rc.0",
+ "eslint-plugin-react-refresh": "^0.4.9",
+ "globals": "^15.9.0",
+ "postcss": "^8.4.47",
+ "tailwindcss": "^3.4.13",
+ "typescript": "^5.6.2",
+ "typescript-eslint": "^8.0.1",
+ "vite": "^5.4.1"
+ }
+}
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/postcss.config.js b/examples/apps/social-media/web/react-tailwind/kochu-media/postcss.config.js
new file mode 100644
index 00000000..2aa7205d
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/abstract-image.webp b/examples/apps/social-media/web/react-tailwind/kochu-media/public/abstract-image.webp
new file mode 100644
index 00000000..5b8d74b2
Binary files /dev/null and b/examples/apps/social-media/web/react-tailwind/kochu-media/public/abstract-image.webp differ
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/account.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/account.svg
new file mode 100644
index 00000000..48d34ee0
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/account.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/arrow.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/arrow.svg
new file mode 100644
index 00000000..7f9d08a1
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/arrow.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/bookmark.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/bookmark.svg
new file mode 100644
index 00000000..78fd4d10
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/bookmark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/comment.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/comment.svg
new file mode 100644
index 00000000..f80dbbd0
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/comment.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/copy.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/copy.svg
new file mode 100644
index 00000000..2a0460e3
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/copy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/edit.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/edit.svg
new file mode 100644
index 00000000..e42c2f41
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/edit.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/explore.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/explore.svg
new file mode 100644
index 00000000..b50bde9a
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/explore.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/file-upload.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/file-upload.svg
new file mode 100644
index 00000000..d418d55c
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/file-upload.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/filter.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/filter.svg
new file mode 100644
index 00000000..6343d10a
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/filter.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/gallery-add.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/gallery-add.svg
new file mode 100644
index 00000000..17cebe56
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/gallery-add.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/home.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/home.svg
new file mode 100644
index 00000000..99452dc2
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/home.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/like.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/like.svg
new file mode 100644
index 00000000..a1363064
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/like.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/liked.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/liked.svg
new file mode 100644
index 00000000..978113c1
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/liked.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/loader.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/loader.svg
new file mode 100644
index 00000000..247649da
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/loader.svg
@@ -0,0 +1 @@
+๏ปฟ
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/logout.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/logout.svg
new file mode 100644
index 00000000..b39f9373
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/logout.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/menu.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/menu.svg
new file mode 100644
index 00000000..702a828b
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/menu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/people.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/people.svg
new file mode 100644
index 00000000..eacdadd3
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/people.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/remove.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/remove.svg
new file mode 100644
index 00000000..27b18e50
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/remove.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/save.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/save.svg
new file mode 100644
index 00000000..5300a114
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/save.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/saved.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/saved.svg
new file mode 100644
index 00000000..856b3d70
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/saved.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/search.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/search.svg
new file mode 100644
index 00000000..ffe54df6
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/search.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/settings.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/settings.svg
new file mode 100644
index 00000000..d06a1063
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/settings.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/share.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/share.svg
new file mode 100644
index 00000000..e763c543
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/icons/share.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/images/github-mark-white.png b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/images/github-mark-white.png
new file mode 100644
index 00000000..50b81752
Binary files /dev/null and b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/images/github-mark-white.png differ
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/images/linkedin-mark.png b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/images/linkedin-mark.png
new file mode 100644
index 00000000..268c12c7
Binary files /dev/null and b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/images/linkedin-mark.png differ
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/images/logo.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/images/logo.svg
new file mode 100644
index 00000000..0ec33d66
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/images/logo.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/images/profile-placeholder.jpg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/images/profile-placeholder.jpg
new file mode 100644
index 00000000..9f377c18
Binary files /dev/null and b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/images/profile-placeholder.jpg differ
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/images/x-mark.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/images/x-mark.svg
new file mode 100644
index 00000000..437e2bfd
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/images/x-mark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/logo.png b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/logo.png
new file mode 100644
index 00000000..c8fc1579
Binary files /dev/null and b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/logo.png differ
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/logo.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/logo.svg
new file mode 100644
index 00000000..21d9f8fc
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/assets/logo.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/public/favicon.svg b/examples/apps/social-media/web/react-tailwind/kochu-media/public/favicon.svg
new file mode 100644
index 00000000..f8ec09d2
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/public/favicon.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/App.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/App.tsx
new file mode 100644
index 00000000..10a144d2
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/App.tsx
@@ -0,0 +1,46 @@
+import { Route, Routes } from 'react-router-dom'
+import './globals.css'
+// routes components
+import SigninForm from './_auth/forms/SignInForm'
+import SignupForm from './_auth/forms/SignupForm'
+import AuthLayout from './_auth/AuthLayout'
+import RootLayout from './_root/RootLayout'
+
+import { Toaster } from "@/components/ui/toaster"
+// all pages
+import { AllUsers, Bookmarks, CreatePost, Explore, Home, PostDetails, Profile, Saved, UpdatePost, UpdateProfile, UserLiked, UserPosts, UserSaved } from './_root/pages'
+
+function App() {
+ return (
+
+
+ {/* public routes */}
+ } >
+ } />
+ } />
+
+ {/* private routes */}
+ }>
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } >
+ {/* Nested routes for posts, likes, and saves */}
+ } />
+ } />
+ } />
+
+ } />
+
+
+
+
+ )
+}
+
+export default App
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_auth/AuthLayout.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_auth/AuthLayout.tsx
new file mode 100644
index 00000000..a7607659
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_auth/AuthLayout.tsx
@@ -0,0 +1,51 @@
+import Loader from '@/components/shared/Loader';
+import { Suspense, useState, useEffect } from 'react';
+import { Outlet, Navigate } from 'react-router-dom'
+
+const AuthLayout = () => {
+ const isAuthenticated = false;
+
+ const [isMobile, setIsMobile] = useState(false);
+
+ useEffect(() => {
+ const handleResize = () => {
+ setIsMobile(window.innerWidth <= 1279);
+ };
+ handleResize();
+ window.addEventListener('resize', handleResize);
+ return () => {
+ window.removeEventListener('resize', handleResize);
+ };
+ }, [isMobile]);
+
+
+ return (
+ <>
+ {
+ isAuthenticated ? (
+
+ ) : (
+ <>
+
+ {/* Conditionally render Spline only for non-mobile devices */}
+ {!isMobile && (
+
}>
+
+
+ )}
+
+
+ >
+ )
+ }
+ >
+ )
+}
+
+export default AuthLayout
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_auth/forms/GoogleAuth.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_auth/forms/GoogleAuth.tsx
new file mode 100644
index 00000000..19e39c83
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_auth/forms/GoogleAuth.tsx
@@ -0,0 +1,35 @@
+// import { AuthWithGoogle } from "@/lib/appwrite/api";
+// import { Button } from "../../components/ui/button";
+// import { toast } from "@/hooks/use-toast";
+// import { useNavigate } from "react-router-dom";
+
+// const GoogleAuth = () => {
+// const navigate = useNavigate();
+
+// async function handleLoginGoogle() {
+// try {
+// const user = await AuthWithGoogle();
+// if (user === null || user === undefined) {
+// console.error("Google login failed");
+// return;
+// }
+// } catch (error) {
+// toast({ title: "Google login failed" });
+// navigate("/sign-up");
+// console.error("Error during Google login:", error);
+// }
+// }
+
+// return (
+// <>
+//
+// Continue with Google
+//
+// >
+// );
+// };
+
+// export default GoogleAuth;
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_auth/forms/SignInForm.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_auth/forms/SignInForm.tsx
new file mode 100644
index 00000000..ebf611bf
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_auth/forms/SignInForm.tsx
@@ -0,0 +1,124 @@
+import { signinValidarion } from "@/lib/validation"
+import { zodResolver } from "@hookform/resolvers/zod"
+import { useForm } from "react-hook-form"
+import { z } from "zod"
+import { useToast } from "@/hooks/use-toast"
+
+import {
+ Form,
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form"
+import { Input } from "@/components/ui/input"
+import { Button } from "@/components/ui/button"
+import Loader from "@/components/shared/Loader"
+import { Link, useNavigate } from "react-router-dom"
+import { useSignInAccount } from "@/lib/react-query/queriesAndMutation"
+import { useUserContext } from "@/context/AuthContext"
+// import GoogleAuth from "./GoogleAuth"
+
+const SignInForm = () => {
+ const { toast } = useToast()
+ const { checkAuthUser } = useUserContext()
+ const navigate = useNavigate()
+
+ const { mutateAsync: signInAccount, isPending: isSigningIn } = useSignInAccount()
+
+ // 1. Define your form.
+ const form = useForm>({
+ resolver: zodResolver(signinValidarion),
+ defaultValues: {
+ email: "",
+ password: "",
+ },
+ })
+
+ // 2. Define a submit handler.
+ async function onSubmit(values: z.infer) {
+ const session = await signInAccount({
+ email: values.email,
+ password: values.password,
+ })
+
+ if (!session) {
+ return toast({ title: 'Sign in failed. Please try again.' })
+ }
+
+ const isLoggedIn = await checkAuthUser()
+ if (isLoggedIn) {
+ form.reset()
+ navigate('/')
+ toast({ title: 'Welcome to the community!' })
+ } else {
+ return toast({ title: 'Sign in failed. Please try again.' })
+ }
+ }
+
+ return (
+
+ )
+}
+
+export default SignInForm
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_auth/forms/SignupForm.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_auth/forms/SignupForm.tsx
new file mode 100644
index 00000000..f377e31f
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_auth/forms/SignupForm.tsx
@@ -0,0 +1,164 @@
+import { signupValidarion } from "@/lib/validation"
+import { zodResolver } from "@hookform/resolvers/zod"
+import { useForm } from "react-hook-form"
+import { z } from "zod"
+import { useToast } from "@/hooks/use-toast"
+
+import {
+ Form,
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form"
+import { Input } from "@/components/ui/input"
+import { Button } from "@/components/ui/button"
+import Loader from "@/components/shared/Loader"
+import { Link, useNavigate } from "react-router-dom"
+import { useCreateUserAccount, useSignInAccount } from "@/lib/react-query/queriesAndMutation"
+import { useUserContext } from "@/context/AuthContext"
+import BigLoader from "@/components/shared/BigLoader"
+
+const SignupForm = () => {
+ const { toast } = useToast()
+ const { checkAuthUser, isLoading } = useUserContext()
+ const navigate = useNavigate();
+
+ const { mutateAsync: createUserAccount, isPending: isCreatingUser } = useCreateUserAccount();
+
+ const { mutateAsync: signInAccount } = useSignInAccount();
+
+ // 1. Define your form.
+ const form = useForm>({
+ resolver: zodResolver(signupValidarion),
+ defaultValues: {
+ name: "",
+ username: "",
+ email: "",
+ password: "",
+ },
+ })
+
+
+
+ // 2. Define a submit handler.
+ async function onSubmit(values: z.infer) {
+ const newUser = await createUserAccount(values)
+ if (!newUser) {
+ return toast({
+ title: "sign up faild. please try again",
+ description: "Friday, February 10, 2023 at 5:57 PM",
+ })
+ }
+
+ const session = await signInAccount({
+ email: values.email,
+ password: values.password,
+ })
+
+ if (!session) {
+ return toast({ title: 'sign in faild. please try again.' })
+ }
+
+ const isLogedin = await checkAuthUser();
+ if (isLogedin) {
+ form.reset();
+ navigate('/');
+ toast({ title: 'Welcome to the community' })
+ } else {
+ return toast({ title: 'sign in faild. please try again.' })
+ }
+ }
+
+
+ return (
+
+ {
+ isLoading ? (
+
+ ) :
+ (
+
+ )
+ }
+
+ )
+}
+
+export default SignupForm
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/RootLayout.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/RootLayout.tsx
new file mode 100644
index 00000000..67a685f6
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/RootLayout.tsx
@@ -0,0 +1,72 @@
+import { useEffect, useState } from "react";
+import gsap from "gsap";
+import ScrollTrigger from "gsap/ScrollTrigger";
+import Leftsidebar from "@/components/shared/Leftsidebar";
+import Topbar from "@/components/shared/Topbar";
+import { Outlet } from "react-router-dom";
+import BigLoader from "@/components/shared/BigLoader";
+
+gsap.registerPlugin(ScrollTrigger);
+
+const RootLayout = () => {
+ const [isLoading, setIsLoading] = useState(true);
+ const [isOnline, setIsOnline] = useState(navigator.onLine); // Check initial network statez
+
+ useEffect(() => {
+ // Check the initial document.readyState
+ if (document.readyState === "complete") {
+ setIsLoading(false);
+ } else {
+ // Listen for changes in the readyState
+ const handleLoad = () => setIsLoading(false);
+
+ // Event listeners to detect when the browser finishes loading
+ window.addEventListener("load", handleLoad);
+
+ // Cleanup the event listener on unmount
+ return () => window.removeEventListener("load", handleLoad);
+ }
+ }, []);
+
+ useEffect(() => {
+ // Update the online status when the user goes offline or online
+ const handleOnline = () => setIsOnline(true);
+ const handleOffline = () => setIsOnline(false);
+
+ // Add event listeners for online and offline detection
+ window.addEventListener("online", handleOnline);
+ window.addEventListener("offline", handleOffline);
+
+ // Cleanup the event listeners on unmount
+ return () => {
+ window.removeEventListener("online", handleOnline);
+ window.removeEventListener("offline", handleOffline);
+ };
+ }, []);
+
+ return (
+ <>
+ {/* Show the loader while the page is loading */}
+ {isLoading ? (
+
+
+
+ ) : (
+
+ {!isOnline && (
+
+ You are offline.
+
+ )}
+
+
+
+
+ )}
+ >
+ );
+}
+
+export default RootLayout;
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/AllUsers.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/AllUsers.tsx
new file mode 100644
index 00000000..f03d9b12
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/AllUsers.tsx
@@ -0,0 +1,119 @@
+import BigLoader from "@/components/shared/BigLoader";
+import Loader from "@/components/shared/Loader";
+import { Input } from "@/components/ui/input";
+import useDebounce from "@/hooks/useDbounce";
+import { useGetUsers, useSearchUsers } from "@/lib/react-query/queriesAndMutation";
+import { useEffect, useState } from "react";
+import { useNavigate } from "react-router-dom";
+import { useInView } from "react-intersection-observer";
+import UserSearchResult from "@/components/shared/UserSearchResult";
+import GridUsersList from "@/components/shared/GridUsersList";
+
+const AllUsers = () => {
+ const navigate = useNavigate();
+ const [searchValue, setSearchValue] = useState("");
+ const deBouncedValue = useDebounce(searchValue, 500);
+ // query params
+ const { data: searchedPost, isFetching: isSearchFetching } = useSearchUsers(deBouncedValue);
+ const { data: users, fetchNextPage, hasNextPage } = useGetUsers();
+ const documents = searchedPost?.documents || [];
+ // inView
+ const { ref, inView } = useInView();
+ useEffect(() => {
+ if (inView && !searchValue) {
+ fetchNextPage();
+ }
+ }, [inView, searchValue])
+ const shouldShowSearchResults = searchValue !== '';
+ const noPostsAvailable = !shouldShowSearchResults && users?.pages.every(page => (page?.documents ?? []).length === 0);
+
+ return (
+
+
+
+
navigate(-1)}>
+
+
+ {
+ (!users && !shouldShowSearchResults) ? (
+ null
+ ) : (
+
+ People
+
+
+ )
+ }
+
+ {
+ (!users && !shouldShowSearchResults) ? (
+
+ ) : (
+ <>
+
+
+
{
+ const { value } = e.target;
+ setSearchValue(value);
+ }}
+ />
+
+
+
Popular Today
+
+
All
+
+
+
+ >
+ )
+ }
+
+
+ {
+ shouldShowSearchResults ? (
+
+ ) : noPostsAvailable ? (
+
No posts available
+ ) : (
+ users?.pages.map((page, index) => (
+ (page?.documents ?? []).length > 0 ? (
+
+ ) : null
+ ))
+ )
+ }
+
+ {
+ hasNextPage && !searchValue && (
+
+
+
+ )
+ }
+
+ )
+}
+
+export default AllUsers
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/Bookmarks.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/Bookmarks.tsx
new file mode 100644
index 00000000..9eeb8e04
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/Bookmarks.tsx
@@ -0,0 +1,70 @@
+import BigLoader from "@/components/shared/BigLoader";
+import { Button } from "@/components/ui/button";
+import { useUserContext } from "@/context/AuthContext";
+import { toast } from "@/hooks/use-toast";
+import { useSignOutAccount } from "@/lib/react-query/queriesAndMutation";
+import { useEffect } from "react";
+import { Link, useNavigate } from "react-router-dom";
+
+const Bookmarks = () => {
+ const { user, isLoading } = useUserContext();
+ const navigate = useNavigate();
+ const { mutate: signOut, isSuccess } = useSignOutAccount();
+
+ useEffect(() => {
+ if (isSuccess) {
+ navigate('/sign-in');
+ toast({ title: 'Logged out successfully' });
+ }
+ }, [isSuccess, navigate]);
+
+ return (
+
+
+
navigate(-1)}>
+
+
+ {isLoading ? (null) : (
+
+ {user?.name}
+
+ )
+ }
+
+ {
+ isLoading ? (
) : (
+
+ {/* User Profile Section */}
+
+
+
+ {user.name}
+
+
+
+ {/* Logout Button */}
+
+ signOut()}
+ className="flex gap-3 w-full h-fit items-center justify-start p-4 bg-dark-2 rounded-lg shadow-md hover:bg-dark-3 transition-colors">
+
+ Logout
+
+
+
+ )
+ }
+
+ );
+};
+
+export default Bookmarks;
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/CreatePost.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/CreatePost.tsx
new file mode 100644
index 00000000..b67e42be
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/CreatePost.tsx
@@ -0,0 +1,27 @@
+import PostForm from "@/components/forms/PostForm"
+import { useNavigate } from "react-router-dom";
+
+const CreatePost = () => {
+ const navigate = useNavigate();
+ return (
+
+
+
navigate(-1)}>
+
+
+
+ Create new post
+
+
+
+
+ )
+}
+
+export default CreatePost
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/Explore.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/Explore.tsx
new file mode 100644
index 00000000..7e12d353
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/Explore.tsx
@@ -0,0 +1,121 @@
+import BigLoader from "@/components/shared/BigLoader";
+import GridPostList from "@/components/shared/GridPostList";
+import SearchResult from "@/components/shared/SearchResult";
+import { Input } from "@/components/ui/input";
+import useDebounce from "@/hooks/useDbounce";
+import { useGetPosts, useSearchPost } from "@/lib/react-query/queriesAndMutation";
+import { useEffect, useState } from "react";
+import { useNavigate } from "react-router-dom";
+import { useInView } from "react-intersection-observer";
+
+const Explore = () => {
+ const navigate = useNavigate();
+ const [searchValue, setSearchValue] = useState("");
+ const deBouncedValue = useDebounce(searchValue, 500); // searching delay
+ // query params
+ const { data: searchedPost, isFetching: isSearchFetching } = useSearchPost(deBouncedValue);
+ const { data: posts, fetchNextPage, hasNextPage } = useGetPosts()
+ const documents = searchedPost?.documents || [];
+ // inView
+ const { ref, inView } = useInView();
+ useEffect(() => {
+ if (inView && !searchValue) {
+ fetchNextPage();
+ }
+ }, [inView, searchValue])
+ const shouldShowSearchResults = searchValue !== '';
+ const noPostsAvailable = !shouldShowSearchResults && posts?.pages.every(page => (page?.documents ?? []).length === 0);
+
+ return (
+
+
+
+
navigate(-1)}>
+
+
+ {
+ (!posts && !shouldShowSearchResults) ? (
+ null
+ ) : (
+
+ Explore
+
+ )
+ }
+
+ {
+ (!posts && !shouldShowSearchResults) ? (
+
+
+
+ ) : (
+ <>
+
+
+
{
+ const { value } = e.target;
+ setSearchValue(value);
+ }}
+ />
+
+
+
Popular Today
+
+
All
+
+
+
+ >
+ )
+ }
+
+
+
+ {
+ shouldShowSearchResults ? (
+
+ ) : noPostsAvailable ? (
+
No posts available
+ ) : (
+ posts?.pages.map((page, index) => (
+ (page?.documents ?? []).length > 0 ? (
+
+ ) : null
+ ))
+ )
+ }
+
+
+ {
+ hasNextPage && !searchValue && (
+
+
+
+ )
+ }
+
+ )
+}
+
+export default Explore
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/Home.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/Home.tsx
new file mode 100644
index 00000000..a1c1897d
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/Home.tsx
@@ -0,0 +1,54 @@
+import BigLoader from "@/components/shared/BigLoader";
+import IamThere from "@/components/shared/IamThere";
+import PostCard from "@/components/shared/PostCard";
+import { useUserContext } from "@/context/AuthContext";
+import { useGetRecentPost } from "@/lib/react-query/queriesAndMutation";
+import { Models } from "appwrite";
+import { Link } from "react-router-dom";
+
+const Home = () => {
+ const { user } = useUserContext();
+ const { data: posts, isPending: isPostLoading, isError: isErrorPosts } = useGetRecentPost();
+
+ return (
+ <>
+ {isPostLoading || !posts || isErrorPosts ? (
+
+ ) : (
+ <>
+
+
+
+
+
+
+
What's on your mind?
+
+
+
+
+ {posts?.documents?.map((post: Models.Document) => (
+
+
+
+ ))}
+
+
+
+ >
+ )}
+ >
+ );
+};
+
+export default Home;
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/PostDetails.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/PostDetails.tsx
new file mode 100644
index 00000000..89999da7
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/PostDetails.tsx
@@ -0,0 +1,144 @@
+import BigLoader from "@/components/shared/BigLoader"
+import PostComments from "@/components/shared/PostComments"
+import PostStats from "@/components/shared/PostStats"
+import { useUserContext } from "@/context/AuthContext"
+import { toast } from "@/hooks/use-toast"
+import { useDeletePost, useGetPostById } from "@/lib/react-query/queriesAndMutation"
+import { formatDateMathYearDay } from "@/lib/utils"
+import { Link, useNavigate, useParams } from "react-router-dom"
+
+const PostDetails = () => {
+ const navigate = useNavigate();
+ // query params
+ const { mutate: deletePost } = useDeletePost();
+
+ const { id } = useParams()
+ const { data: post, isPending } = useGetPostById(id || '')
+ // useEffect(() => {
+ // console.log('post', post);
+ // }, [post, navigate])
+
+ const { user } = useUserContext()
+
+ const handleDeletePost = () => {
+ deletePost({ postId: post?.$id || '', imageId: post?.imageId || '' })
+ navigate(-1);
+ toast({ title: 'post deleted sucessfully' })
+ }
+ return (
+
+
+
navigate(-1)}>
+
+
+ {
+ isPending ? (null) : (
+
Post
+ )
+ }
+
+ {
+ isPending ? (
) : (
+
+
+
+
+
+
+
+
+
+ {parseCaption(post?.caption)}
+
+
+ {post?.tags.map((tags: string) => (
+
+ #{tags}
+
+ ))}
+
+
+ {formatDateMathYearDay(post?.$createdAt || '')}
+
+
+
+
+
+
{post?.creator.name}
+
+ @{post?.creator.username}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+ }
+
+ )
+}
+
+export default PostDetails
+
+// Independent function to parse caption and detect URLs
+function parseCaption(caption: string): JSX.Element[] {
+ const urlRegex = /(https?:\/\/[^\s]+)/g;
+
+ const parts = caption.split(urlRegex);
+
+ return parts.map((part, index) => {
+ if (urlRegex.test(part)) {
+ return (
+
+ {part}
+
+ );
+ }
+ return {part} ;
+ });
+}
+
+
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/Profile.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/Profile.tsx
new file mode 100644
index 00000000..8b28010d
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/Profile.tsx
@@ -0,0 +1,120 @@
+import BigLoader from "@/components/shared/BigLoader";
+// import FollowBtn from "@/components/shared/FollowBtn";
+import Loader from "@/components/shared/Loader";
+import { useUserContext } from "@/context/AuthContext";
+import { useGetUserById } from "@/lib/react-query/queriesAndMutation";
+import { Link, NavLink, Outlet, useNavigate, useParams } from "react-router-dom";
+
+const Profile = () => {
+ const navigate = useNavigate();
+ const { user: CurrentUser, isLoading: currentUserLoading } = useUserContext();
+ const { id } = useParams();
+ const { data: user, isFetching } = useGetUserById(id || '');
+
+ return (
+ <>
+
+
+
+
navigate(-1)}>
+
+
+ {isFetching ? (null) : (
+
+ {user?.name}
+
+ )
+ }
+
+
+
+ {isFetching ? (
+
+
+
+ ) : (
+ <>
+
+
+
+
+
+
{user?.name}
+
@{user?.username}
+
+
+ {currentUserLoading ? (
+
+ ) : (
+ <>
+ {/* {CurrentUser?.id !== user?.$id && (
+
+ )} */}
+ {/* Show Edit button only for your own profile */}
+ {CurrentUser?.id === user?.$id && (
+
+
+
+ )}
+ >
+ )}
+
+
+
bio : {user?.bio}
+
+
{user?.posts.length} posts
+ {/*
{user?.followers.length} followers
+
{user?.following.length} following
*/}
+
0 followers
+
0 following
+
+
+
+
+
+ `w-fit h-fit ${isActive ? "font-bold text-primary-500" : ""}`
+ }
+ to={`/profile/${user?.$id}`}
+ end
+ >
+ Posts
+
+
+ `w-fit h-fit ${isActive ? "font-bold text-primary-500" : ""}`
+ }
+ to={`/profile/${user?.$id}/likes`}
+ >
+ Liked
+
+
+ `w-fit h-fit ${isActive ? "font-bold text-primary-500" : ""}`
+ }
+ to={`/profile/${user?.$id}/saves`}
+ >
+ Saves
+
+
+
+ >
+ )
+ }
+
+ >
+ );
+};
+
+export default Profile;
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/Saved.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/Saved.tsx
new file mode 100644
index 00000000..ab233bc2
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/Saved.tsx
@@ -0,0 +1,86 @@
+import BigLoader from "@/components/shared/BigLoader";
+import { useGetCurrentUserPosts } from "@/lib/react-query/queriesAndMutation";
+import { useEffect, useState, Key } from "react";
+import { Link, useNavigate } from "react-router-dom";
+
+const Saved = () => {
+ const navigate = useNavigate();
+ const { data: user, isFetching: isLoading } = useGetCurrentUserPosts();
+ const [save, setSave] = useState<
+ {
+ $id: string; post: {
+ $id: Key | null | undefined;
+ caption: string | undefined; imageUrl: string
+ }; caption: string
+ }[]
+ >([]);
+
+ useEffect(() => {
+ if (user && user.save) {
+ setSave(user.save);
+ // console.log('user.save', user)
+ }
+ }, [user]);
+
+ return (
+
+
+
navigate(-1)}>
+
+
+ {
+ isLoading ? (null) : (
+
+ Saved post
+
+ )
+ }
+
+ {
+ isLoading ? (
+
+ ) : (
+ <>
+
+ {save.map((savedItem) => (
+ savedItem.post ? ( // Check if savedItem.post exists
+
+
+
+
+
+ ) : (
+ no saved are there
+ )
+ ))}
+
+ {
+ save.length > 0 ? (
+
Add more
+ ) : (
+
No saved post yet
+ )
+ }
+ >
+ )
+ }
+ {
+ !save || save.length === 0 || isLoading && (
+
+ )
+ }
+
+ );
+};
+
+export default Saved;
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/UpdatePost.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/UpdatePost.tsx
new file mode 100644
index 00000000..823e55f7
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/UpdatePost.tsx
@@ -0,0 +1,37 @@
+import PostForm from "@/components/forms/PostForm"
+import Loader from "@/components/shared/Loader";
+import { useGetPostById } from "@/lib/react-query/queriesAndMutation";
+import { Link, useParams } from "react-router-dom"
+
+const UpdatePost = () => {
+ const { id } = useParams();
+ const { data: post, isPending: isLoading } = useGetPostById(id || '');
+
+ if (isLoading) return (
+
+
+
+ )
+
+ return (
+
+
+
+
+
+
+
+ Edit Post
+
+
+
+ {isLoading ?
:
}
+
+
+ )
+}
+
+export default UpdatePost
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/UpdateProfile.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/UpdateProfile.tsx
new file mode 100644
index 00000000..fd1203bb
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/UpdateProfile.tsx
@@ -0,0 +1,27 @@
+import EditProfileForm from "@/components/forms/EditProfileForm";
+import { useNavigate } from "react-router-dom";
+
+const UpdateProfile = () => {
+ const navigate = useNavigate();
+ return (
+
+
+
+
navigate(-1)}>
+
+
+
+ Update Your profile
+
+
+
+
+
+ )
+}
+
+export default UpdateProfile
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/UserLiked.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/UserLiked.tsx
new file mode 100644
index 00000000..53755c66
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/UserLiked.tsx
@@ -0,0 +1,53 @@
+import { useEffect, useState } from "react";
+import { Link, useOutletContext } from "react-router-dom";
+
+interface UserContextType {
+ user: {
+ liked: Array<{
+ imageUrl: string | undefined;
+ $id: string;
+ caption: string;
+ post: {
+ imageUrl: string;
+ };
+ }>;
+ name: string;
+ };
+}
+
+const UserLiked = () => {
+ const [liked, setLiked] = useState([]);
+ const { user } = useOutletContext();
+
+ useEffect(() => {
+ if (user?.liked) {
+ setLiked(user.liked);
+ }
+ }, [liked]);
+
+ if (!liked || liked.length === 0) {
+ return (
+
+ );
+ }
+
+ return (
+
+ {liked.map((likeItem) => (
+
+
+
+
+
+ ))}
+
+ );
+};
+
+export default UserLiked;
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/UserPosts.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/UserPosts.tsx
new file mode 100644
index 00000000..0b55a704
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/UserPosts.tsx
@@ -0,0 +1,48 @@
+import { useEffect, useState } from "react";
+import { Link, useOutletContext } from "react-router-dom";
+
+interface UserContextType {
+ user: {
+ posts: string[];
+ name: string;
+ imageUrl: string;
+ };
+}
+
+const UserPosts = () => {
+ const [posts, setPosts] = useState([]);
+ // Access the context (user) here
+ const { user } = useOutletContext();
+
+ useEffect(() => {
+ setPosts(user.posts);
+ }, [user]);
+
+ if (!posts || posts.length === 0) {
+ return (
+
+ );
+ }
+
+ return (
+
+ {
+ posts?.map((post) => (
+
+
+
+
+
+ ))
+ }
+
+ );
+};
+
+export default UserPosts;
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/UserSaved.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/UserSaved.tsx
new file mode 100644
index 00000000..2259eb3f
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/UserSaved.tsx
@@ -0,0 +1,56 @@
+import { useEffect, useState } from "react";
+import { Link, useOutletContext } from "react-router-dom";
+
+interface UserContextType {
+ user: {
+ save: Array<{
+ $id: string;
+ caption: string;
+ post: {
+ imageUrl: string;
+ };
+ }>;
+ name: string;
+ };
+}
+
+const UserSaved = () => {
+ const [save, setSave] = useState([]);
+ const { user } = useOutletContext();
+
+ useEffect(() => {
+ if (user?.save) {
+ setSave(user.save);
+ }
+ }, [user]);
+
+ if (!save || save.length === 0) {
+ return (
+
+ );
+ }
+
+ return (
+
+ {
+ save.map((savedItem) => (
+
+
+ {savedItem.post && (
+
+ )}
+
+
+ ))
+ }
+
+ );
+};
+
+export default UserSaved;
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/index.ts b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/index.ts
new file mode 100644
index 00000000..060b3a67
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/_root/pages/index.ts
@@ -0,0 +1,13 @@
+export { default as Home } from './Home'
+export { default as Explore} from './Explore'
+export { default as AllUsers } from './AllUsers'
+export { default as CreatePost } from './CreatePost'
+export { default as PostDetails } from './PostDetails'
+export { default as Profile } from './Profile'
+export { default as Saved } from './Saved'
+export { default as UpdatePost } from './UpdatePost'
+export { default as UpdateProfile } from './UpdateProfile'
+export { default as UserPosts } from './UserPosts'
+export { default as UserLiked } from './UserLiked'
+export { default as UserSaved } from './UserSaved'
+export { default as Bookmarks } from './Bookmarks'
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/forms/EditProfileForm.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/forms/EditProfileForm.tsx
new file mode 100644
index 00000000..cfe4a5b3
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/forms/EditProfileForm.tsx
@@ -0,0 +1,135 @@
+import { zodResolver } from "@hookform/resolvers/zod"
+import { useForm } from "react-hook-form"
+import { z } from "zod"
+import { useNavigate } from "react-router-dom"
+import {
+ Form,
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form"
+import { toast } from "@/hooks/use-toast"
+import { Button } from "@/components/ui/button"
+import { Input } from "@/components/ui/input"
+import FileUploader from "../shared/FileUploader"
+import { useUserContext } from "@/context/AuthContext"
+import { useUpdateProfile } from "@/lib/react-query/queriesAndMutation" // This would be your profile update mutation
+import Loader from "../shared/Loader"
+import { updateUserValidation } from "@/lib/validation"
+import { IUserWithImageId } from "@/types"
+
+const EditProfileForm = () => {
+ const navigate = useNavigate();
+ const { user } = useUserContext();
+ const userWithImageId = user as IUserWithImageId;
+ // 1. Define your form.
+ const form = useForm>({
+ resolver: zodResolver(updateUserValidation),
+ defaultValues: {
+ name: userWithImageId?.name || "",
+ bio: userWithImageId?.bio || "",
+ },
+ });
+
+ // mutation hook for profile update
+ const { mutateAsync: updateProfile, isPending: IsLoadingUpdate } = useUpdateProfile();
+
+ const handleSubmit = async (value: z.infer) => {
+ const updatedProfile = await updateProfile({
+ ...value,
+ file: value.file,
+ userId: userWithImageId.id,
+ imageId: userWithImageId.imageId,
+ imageUrl: userWithImageId.imageUrl,
+ });
+
+ if (!updatedProfile) {
+ toast({ title: "Profile update failed. Please try again." });
+ return;
+ }
+
+ toast({ title: "Profile updated successfully!" });
+ navigate(`/profile/${user.id}`);
+ };
+
+ return (
+
+ {IsLoadingUpdate ? (
+
+ ) : (
+
+ {/* Profile Image Uploader */}
+ (
+
+ Profile Image
+
+ field.onChange(file)}
+ mediaUrl={user?.imageUrl}
+ />
+
+
+
+ )}
+ />
+
+ {/* Name Input */}
+ (
+
+ Name
+
+
+
+
+
+ )}
+ />
+
+ {/* Bio Input */}
+ (
+
+ Bio
+
+
+
+
+
+ )}
+ />
+
+ {/* Submit and Cancel Buttons */}
+
+ { navigate(`/profile/${user.id}`) }}
+ type="button"
+ className="shad-button_dark_4">
+ Cancel
+
+
+ {IsLoadingUpdate && }
+ Update Profile
+
+
+
+ )}
+
+ );
+};
+
+export default EditProfileForm;
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/forms/PostForm.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/forms/PostForm.tsx
new file mode 100644
index 00000000..f50f6b9b
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/forms/PostForm.tsx
@@ -0,0 +1,169 @@
+import { zodResolver } from "@hookform/resolvers/zod"
+import { useForm } from "react-hook-form"
+import { z } from "zod"
+import { useNavigate } from "react-router-dom"
+import { Models } from "appwrite"
+import {
+ Form,
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form"
+import { postValidation } from "@/lib/validation"
+import { toast } from "@/hooks/use-toast"
+import { Button } from "@/components/ui/button"
+import { Textarea } from "../ui/textarea"
+import { Input } from "@/components/ui/input"
+import FileUploader from "../shared/FileUploader"
+import { useUserContext } from "@/context/AuthContext"
+import { useCreatePost, useUpdatePost } from "@/lib/react-query/queriesAndMutation"
+import Loader from "../shared/Loader"
+
+type PostFormProps = {
+ post?: Models.Document;
+ action: "Create" | "Update";
+};
+
+const PostForm = ({ post, action }: PostFormProps) => {
+ const navigate = useNavigate();
+ const { user } = useUserContext();
+
+ // 1. Define your form.
+ const form = useForm>({
+ resolver: zodResolver(postValidation),
+ defaultValues: {
+ caption: post ? post?.caption : "",
+ file: post ? post?.file : "",
+ location: post ? post?.location : "",
+ tags: post ? post.tags.join(',') : ""
+ },
+ });
+
+ // query hooks
+ const { mutateAsync: createPost, isPending: IsLoadingCreate } = useCreatePost();
+ const { mutateAsync: updatePost, isPending: IsLoadingUpdate } = useUpdatePost();
+
+ const handleSubmit = async (value: z.infer) => {
+ if (post && action == "Update") {
+ const updatedPost = await updatePost({
+ ...value,
+ postId: post.$id,
+ imageId: post?.imageId,
+ imageUrl: post?.imageUrl,
+ });
+ // console.log("updated post :", updatedPost);
+ if (!updatedPost) {
+ toast({
+ title: `${action} failed. Please try again.`,
+ });
+ }
+ navigate(`/post/${post.$id}`);
+ return;
+ }
+
+ const newPost = await createPost({
+ ...value,
+ userId: user.id,
+ });
+
+ if (!newPost) {
+ toast({ title: "Please try again" });
+ }
+ navigate('/');
+ };
+
+ return (
+
+ {
+ IsLoadingCreate || IsLoadingUpdate ? (
+
+ ) : (
+
+ (
+
+ Caption
+
+
+
+
+
+ )}
+ />
+ (
+
+ Add Photos
+
+
+
+
+
+ )}
+ />
+ (
+
+ Enter Location
+
+
+
+
+
+ )}
+ />
+ (
+
+ Add tags (separated by comma , )
+
+
+
+
+
+ )}
+ />
+
+ { navigate('/') }}
+ type="button"
+ className="shad-button_dark_4">
+ Cancel
+
+
+ {IsLoadingCreate || IsLoadingUpdate && }
+ {action} post
+
+
+
+ )
+ }
+
+
+ );
+};
+
+export default PostForm;
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/BigLoader.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/BigLoader.tsx
new file mode 100644
index 00000000..fa0a4f15
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/BigLoader.tsx
@@ -0,0 +1,12 @@
+const BigLoader = () => {
+ return (
+
+
+
+ )
+}
+
+export default BigLoader
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/FileUploader.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/FileUploader.tsx
new file mode 100644
index 00000000..803f39b2
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/FileUploader.tsx
@@ -0,0 +1,67 @@
+import { useCallback, useState } from 'react'
+import { useDropzone } from 'react-dropzone'
+import { Button } from '../ui/button'
+
+interface FileUploaderProps {
+ fieldChnage: (file: File) => void
+ mediaUrl: string | null
+}
+
+const FileUploader = ({ fieldChnage, mediaUrl }: FileUploaderProps) => {
+ const [file, setFile] = useState([])
+ const [fileUrl, setFilesUrl] = useState(mediaUrl)
+
+ const onDrop = useCallback((acceptedFiles: File[]) => {
+ // Do something with the files
+ setFile(acceptedFiles);
+ fieldChnage(acceptedFiles[0])
+ setFilesUrl(URL.createObjectURL(acceptedFiles[0]))
+ }, [file])
+
+ const { getRootProps, getInputProps } = useDropzone({
+ onDrop,
+ accept: {
+ 'image/*': ['.png', '.jpg', '.jpeg', '.svg']
+ }
+ })
+
+
+ return (
+
+
+ {
+ fileUrl ? (
+ <>
+
+
+
+
Click or drag photo to replace
+ >
+ ) : (
+
+
+
Drag Photo Here
+
PNG,JPG,SVG
+
+ Select file from device
+
+
+ )
+ }
+
+ )
+}
+
+export default FileUploader
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/FollowBtn.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/FollowBtn.tsx
new file mode 100644
index 00000000..e9872a36
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/FollowBtn.tsx
@@ -0,0 +1,32 @@
+import { useSignOutAccount } from "@/lib/react-query/queriesAndMutation";
+import { Button } from "../ui/button"
+import { useEffect } from "react";
+import { useNavigate } from "react-router-dom";
+import { toast } from "@/hooks/use-toast";
+
+const FollowBtn = () => {
+ const navigate = useNavigate();
+ const { mutate: signOut, isSuccess, } = useSignOutAccount();
+ useEffect(() => {
+ if (isSuccess) {
+ navigate('/sign-in');
+ toast({ title: 'Logged out successfully' });
+ }
+ }, [isSuccess, navigate]);
+ return (
+ signOut()}
+ >
+
+
+ )
+}
+
+export default FollowBtn
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/GridPostList.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/GridPostList.tsx
new file mode 100644
index 00000000..798817f1
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/GridPostList.tsx
@@ -0,0 +1,53 @@
+// import { useUserContext } from "@/context/AuthContext";
+import { Models } from "appwrite"
+import { Link } from "react-router-dom";
+
+type postListProps = {
+ posts: Models.Document[];
+ showUser?: boolean;
+ showStats?: boolean;
+}
+
+const GridPostList = ({ posts, showUser = true }: postListProps) => {
+ // const { user } = useUserContext();
+
+ return (
+
+ {
+ posts?.map((post) => (
+
+
+
+
+
+ {
+ showUser && (
+
+ {post.creator && (
+ <>
+
+
+ {post.creator.name}
+
+ >
+ )}
+
+ )
+ }
+
+
+ ))
+ }
+
+ )
+}
+
+
+export default GridPostList
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/GridUsersList.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/GridUsersList.tsx
new file mode 100644
index 00000000..0d430ca5
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/GridUsersList.tsx
@@ -0,0 +1,34 @@
+import { Models } from "appwrite";
+import { Link } from "react-router-dom";
+
+type PostListProps = {
+ posts: Models.Document[];
+};
+
+const GridUsersList = ({ posts }: PostListProps) => {
+
+ return (
+
+ {posts?.map((post) => (
+
+
+
+ {post.name}
+
+
+ ))}
+
+ );
+};
+
+export default GridUsersList;
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/IamThere.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/IamThere.tsx
new file mode 100644
index 00000000..caee7db1
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/IamThere.tsx
@@ -0,0 +1,33 @@
+import { socialLinks } from '@/constants';
+
+const IamThere = () => {
+ return (
+
+ {socialLinks.map((link, index) => (
+
+
+ {link.title}
+
+
+
+
+
+
+ ))}
+
+ );
+};
+
+export default IamThere;
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/Leftsidebar.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/Leftsidebar.tsx
new file mode 100644
index 00000000..cdd3754d
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/Leftsidebar.tsx
@@ -0,0 +1,105 @@
+import { Link, NavLink, useLocation, useNavigate } from 'react-router-dom'
+import { useEffect } from "react";
+import { Button } from "../ui/button"
+import { useSignOutAccount } from "@/lib/react-query/queriesAndMutation"
+import { useUserContext } from "@/context/AuthContext";
+import { toast } from "@/hooks/use-toast";
+import { sidebarLinks } from '@/constants';
+import { INavLink } from '@/types';
+import Loader from './Loader';
+
+const Leftsidebar = () => {
+ const navigate = useNavigate();
+ const { pathname } = useLocation();
+ const { mutate: signOut, isSuccess } = useSignOutAccount();
+ const { user, isLoading } = useUserContext();
+ useEffect(() => {
+ if (isSuccess) {
+ navigate('/sign-in');
+ toast({ title: 'Logged out successfully' });
+ }
+ }, [isSuccess, navigate]);
+
+ return (
+
+
+
+
+
+ {
+ isLoading ? (
+
+ ) : (
+
+
+
+
+ {user.name}
+
+
+ @{user.username}
+
+
+
+ )
+ }
+
+
+
+ {sidebarLinks.map((link: INavLink) => {
+ const isActive = pathname === link.route;
+ return (
+
+
+
+ {link.label}
+
+
+ );
+ })}
+
+
+
+ signOut()}
+ >
+
+
+ Logout
+
+
+
+ )
+}
+
+export default Leftsidebar
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/Loader.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/Loader.tsx
new file mode 100644
index 00000000..0e9910a0
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/Loader.tsx
@@ -0,0 +1,13 @@
+const Loader = () => {
+ return (
+
+
+
+ )
+}
+
+export default Loader
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/PostCard.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/PostCard.tsx
new file mode 100644
index 00000000..13cc0423
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/PostCard.tsx
@@ -0,0 +1,101 @@
+import { useUserContext } from "@/context/AuthContext";
+import { formatDate } from "@/lib/utils";
+import { Models } from "appwrite"
+import { Link } from "react-router-dom";
+import PostStats from "./PostStats";
+
+type PostCardProps = {
+ post: Models.Document;
+}
+
+const PostCard = ({ post }: PostCardProps) => {
+
+ // Independent function to parse caption and detect URLs
+ function parseCaption(caption: string): JSX.Element[] {
+ const urlRegex = /(https?:\/\/[^\s]+)/g;
+
+ const parts = caption.split(urlRegex);
+
+ return parts.map((part, index) => {
+ if (urlRegex.test(part)) {
+ return (
+
+ {part}
+
+ );
+ }
+ return {part} ;
+ });
+ }
+
+ const { user } = useUserContext();
+ if (!post.creator) return;
+
+ return (
+
+
+
+
+
+
+
+
+
{post.creator.name}
+
+ @{post.creator.username} . {formatDate(post.$createdAt)}
+
+
+
+
+
+ {parseCaption(post.caption)}
+
+
+ {post.tags.map((tags: string) => (
+ <>
+ {
+ tags === "" ? null : (
+
+ #{tags}
+
+ )
+ }
+
+ >
+ ))}
+
+
+
+ {
+ post.imageUrl === "" ? null : (
+
+ )
+ }
+
+
+
+
+
+ )
+}
+
+export default PostCard
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/PostComments.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/PostComments.tsx
new file mode 100644
index 00000000..f25eee86
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/PostComments.tsx
@@ -0,0 +1,132 @@
+import React, { useEffect, useState } from 'react';
+import { Input } from '../ui/input';
+import { Button } from '../ui/button';
+import { useUserContext } from '@/context/AuthContext';
+import { Link } from 'react-router-dom';
+import Loader from './Loader';
+import { usePostComment } from '@/lib/react-query/queriesAndMutation';
+import { formatDate } from '@/lib/utils';
+import { toast } from '@/hooks/use-toast';
+
+interface PostCommentsProps {
+ allComments: any;
+ userId: any;
+ postId: any;
+}
+
+const PostComments: React.FC = ({ allComments, userId, postId }) => {
+ const { user, isLoading } = useUserContext();
+ const [comments, setComments] = useState('');
+ const [commentList, setCommentList] = useState();
+ // query
+ const { mutateAsync: createComment, isPending: creatingNewComment } = usePostComment();
+
+ useEffect(() => {
+ // console.log('all comments', allComments);
+ if (allComments) {
+ setCommentList(allComments);
+ }
+ }, [allComments]);
+
+ const handleCommentSubmit = async () => {
+ if (!comments) {
+ toast({ title: "Where Is your comment ?" });
+ return;
+ }
+
+ try {
+ const newComment = await createComment({
+ postId: postId,
+ userId: userId,
+ comment: comments
+ });
+
+ if (newComment) {
+ // Add the newly created comment to the comment list
+ setCommentList((prevComments: any) => [
+ ...prevComments,
+ newComment,
+ ]);
+ setComments(''); // Clear the comment input
+ } else {
+ toast({ title: "Try again, server issue" });
+ }
+ } catch (error) {
+ toast({ title: "Error posting comment, please try again." });
+ }
+ };
+
+ return (
+ <>
+
+
+
+
+
+
setComments(e.target.value)}
+ disabled={creatingNewComment || isLoading}
+ />
+ {
+ creatingNewComment ? (
) : (
+
+ Post
+
+ )
+ }
+
+
+
+ Top comments
+
+
+ {
+ commentList?.slice().reverse().map((comment: any) => (
+
+
+
+
+
+
+
+ {comment.commentater.username}
+
+
+ {formatDate(comment?.$createdAt)}
+
+
+
+ {comment.comment}
+
+
+
+ ))
+ }
+
+
+
+ >
+ );
+}
+
+export default PostComments;
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/PostStats.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/PostStats.tsx
new file mode 100644
index 00000000..92b1331a
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/PostStats.tsx
@@ -0,0 +1,123 @@
+import { useDeleteSavePost, useGetCurrentUser, useLikePost, useSavePost } from "@/lib/react-query/queriesAndMutation";
+import { checkIsLiked } from "@/lib/utils";
+import { Models } from "appwrite";
+import { useEffect, useState } from "react";
+import Loader from "./Loader";
+import { toast } from "@/hooks/use-toast";
+import { useNavigate } from "react-router-dom";
+
+
+
+type PostStatsProps = {
+ post?: Models.Document;
+ userId: string;
+}
+const PostStats = ({ post, userId }: PostStatsProps) => {
+ const likesList = post?.likes.map((user: Models.Document) => user.$id);
+ const [likes, setLikes] = useState(likesList);
+ const [isSaved, setIsSaved] = useState(false);
+ const navigate = useNavigate();
+
+ const { mutate: likePost, isPending: isLikeing } = useLikePost();
+ const { mutate: savePost, isPending: isSavingPost } = useSavePost();
+ const { mutate: deleetPost, isPending: isDeletingSavePost } = useDeleteSavePost();
+
+ const { data: currentUser } = useGetCurrentUser();
+ const savePostRecord = currentUser?.save.find((record: Models.Document) => record.post && record.post.$id === post?.$id);
+
+ useEffect(() => {
+ setIsSaved(!!savePostRecord); // here !! is used to convert the value to boolean
+ }, [currentUser]);
+
+ const handleLikePosts = (e: React.MouseEvent) => {
+ e.stopPropagation();
+ let newLikes = [...likes];
+ const hasLiked = checkIsLiked(likes, userId);
+ if (hasLiked) {
+ newLikes = newLikes.filter((id) => id !== userId);
+ } else {
+ newLikes.push(userId);
+ }
+
+ setLikes(newLikes);
+ if (post) {
+ likePost({ postId: post.$id, likesArray: newLikes });
+ }
+ }
+ const handleSavePosts = (e: React.MouseEvent) => {
+ e.stopPropagation();
+
+ if (savePostRecord) {
+ setIsSaved(false);
+ deleetPost(savePostRecord.$id);
+ } else {
+ if (post?.$id) {
+ savePost({ postId: post.$id, userId });
+ setIsSaved(true);
+ }
+ }
+ }
+
+ const shareablePostLink = () => {
+ const baseUrl = 'https://kochugram.rajislab.com/post/';
+ const postLink = `${baseUrl}${post?.$id}`;
+
+ // Copy the link to the clipboard
+ navigator.clipboard.writeText(postLink).then(() => {
+ // Show success toast after successfully copying the link
+ toast({ title: 'Link copied to clipboard' });
+ }).catch(error => {
+ // Handle any errors while copying
+ console.error('Error copying link: ', error);
+ toast({ title: 'somthing wrong' });
+ });
+ };
+
+
+ return (
+
+
+
+ {isLikeing ? :
+
+ }
+ {likes.length}
+
+
{
+ navigate(`/post/${post?.$id}`)
+ }}
+ className="flex flex-1 gap-2 items-center">
+
+ {post?.comments.length}
+
+
+
+
+
+
+ {
+ isDeletingSavePost || isSavingPost ? :
+
+ }
+
+
+ )
+}
+
+export default PostStats
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/SearchResult.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/SearchResult.tsx
new file mode 100644
index 00000000..6329fdc8
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/SearchResult.tsx
@@ -0,0 +1,32 @@
+import { Models } from "appwrite";
+import BigLoader from "./BigLoader";
+import GridPostList from "./GridPostList";
+// import { useEffect } from "react";
+
+type searchPostProps = {
+ isSearchFetching: boolean;
+ searchedPost?: Models.Document[];
+}
+
+const SearchResult = ({ isSearchFetching, searchedPost }: searchPostProps) => {
+
+ // useEffect(() => {
+ // console.log(searchedPost);
+ // }, [searchedPost]);
+
+ if (isSearchFetching) return ;
+
+ if (!searchedPost || searchedPost.length === 0) {
+ return (
+
+ no result found
+
+ );
+ }
+
+ return (
+
+ );
+}
+
+export default SearchResult;
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/TestimonialLable.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/TestimonialLable.tsx
new file mode 100644
index 00000000..c7ed252a
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/TestimonialLable.tsx
@@ -0,0 +1,24 @@
+const TestimonialLabel = () => {
+ return (
+
+
+ Thank you for visiting Kochu-Media
+
+
+ If you found my work helpful, consider giving it a star on GitHub.
+
+
+ โญ GitHub
+
+
+
+ );
+}
+
+export default TestimonialLabel;
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/Topbar.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/Topbar.tsx
new file mode 100644
index 00000000..523249c9
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/Topbar.tsx
@@ -0,0 +1,64 @@
+import { Link, NavLink, useLocation } from "react-router-dom";
+import { INavLink } from "@/types";
+import { getBookmarksLinks } from "@/constants";
+import { useUserContext } from "@/context/AuthContext";
+
+const Topbar = () => {
+ const { user, isLoading } = useUserContext(); // Fetch user from context
+ const { pathname } = useLocation();
+
+ const BookmarksLinks = getBookmarksLinks(user);
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+ {BookmarksLinks.map((link: INavLink) => {
+ const isActive = isLoading || pathname === link.route;
+ return (
+
+
+
+ );
+ })}
+
+
+ >
+ );
+};
+
+export default Topbar;
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/UserSearchResult.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/UserSearchResult.tsx
new file mode 100644
index 00000000..6c9a0da0
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/shared/UserSearchResult.tsx
@@ -0,0 +1,27 @@
+import { Models } from "appwrite";
+import BigLoader from "./BigLoader";
+import GridUsersList from "./GridUsersList";
+
+type searchPostProps = {
+ isSearchFetching: boolean;
+ searchedPost?: Models.Document[];
+}
+
+const UserSearchResult = ({ isSearchFetching, searchedPost }: searchPostProps) => {
+
+ if (isSearchFetching) return ;
+
+ if (!searchedPost || searchedPost.length === 0) {
+ return (
+
+ no result found
+
+ );
+ }
+ // console.log(searchedPost);
+ return (
+
+ );
+}
+
+export default UserSearchResult;
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/alert-dialog.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/alert-dialog.tsx
new file mode 100644
index 00000000..fa2b4429
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/alert-dialog.tsx
@@ -0,0 +1,139 @@
+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,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName
+
+const AlertDialogContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+
+))
+AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName
+
+const AlertDialogHeader = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+AlertDialogHeader.displayName = "AlertDialogHeader"
+
+const AlertDialogFooter = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+AlertDialogFooter.displayName = "AlertDialogFooter"
+
+const AlertDialogTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName
+
+const AlertDialogDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AlertDialogDescription.displayName =
+ AlertDialogPrimitive.Description.displayName
+
+const AlertDialogAction = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName
+
+const AlertDialogCancel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName
+
+export {
+ AlertDialog,
+ AlertDialogPortal,
+ AlertDialogOverlay,
+ AlertDialogTrigger,
+ AlertDialogContent,
+ AlertDialogHeader,
+ AlertDialogFooter,
+ AlertDialogTitle,
+ AlertDialogDescription,
+ AlertDialogAction,
+ AlertDialogCancel,
+}
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/button.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/button.tsx
new file mode 100644
index 00000000..0270f644
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/button.tsx
@@ -0,0 +1,57 @@
+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 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",
+ {
+ variants: {
+ variant: {
+ default:
+ "bg-primary text-primary-foreground shadow hover:bg-primary/90",
+ destructive:
+ "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
+ outline:
+ "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
+ secondary:
+ "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
+ ghost: "hover:bg-accent hover:text-accent-foreground",
+ link: "text-primary underline-offset-4 hover:underline",
+ },
+ size: {
+ default: "h-9 px-4 py-2",
+ sm: "h-8 rounded-md px-3 text-xs",
+ lg: "h-10 rounded-md px-8",
+ icon: "h-9 w-9",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ }
+)
+
+export interface ButtonProps
+ extends React.ButtonHTMLAttributes,
+ VariantProps {
+ asChild?: boolean
+}
+
+const Button = React.forwardRef(
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
+ const Comp = asChild ? Slot : "button"
+ return (
+
+ )
+ }
+)
+Button.displayName = "Button"
+
+export { Button, buttonVariants }
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/dropdown-menu.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/dropdown-menu.tsx
new file mode 100644
index 00000000..0e4dccfd
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/dropdown-menu.tsx
@@ -0,0 +1,203 @@
+import * as React from "react"
+import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"
+import {
+ CheckIcon,
+ ChevronRightIcon,
+ DotFilledIcon,
+} from "@radix-ui/react-icons"
+
+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,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, children, ...props }, ref) => (
+
+ {children}
+
+
+))
+DropdownMenuSubTrigger.displayName =
+ DropdownMenuPrimitive.SubTrigger.displayName
+
+const DropdownMenuSubContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DropdownMenuSubContent.displayName =
+ DropdownMenuPrimitive.SubContent.displayName
+
+const DropdownMenuContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, sideOffset = 4, ...props }, ref) => (
+
+
+
+))
+DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName
+
+const DropdownMenuItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, ...props }, ref) => (
+
+))
+DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName
+
+const DropdownMenuCheckboxItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, checked, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+DropdownMenuCheckboxItem.displayName =
+ DropdownMenuPrimitive.CheckboxItem.displayName
+
+const DropdownMenuRadioItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName
+
+const DropdownMenuLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, ...props }, ref) => (
+
+))
+DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName
+
+const DropdownMenuSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName
+
+const DropdownMenuShortcut = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => {
+ return (
+
+ )
+}
+DropdownMenuShortcut.displayName = "DropdownMenuShortcut"
+
+export {
+ DropdownMenu,
+ DropdownMenuTrigger,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuCheckboxItem,
+ DropdownMenuRadioItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuShortcut,
+ DropdownMenuGroup,
+ DropdownMenuPortal,
+ DropdownMenuSub,
+ DropdownMenuSubContent,
+ DropdownMenuSubTrigger,
+ DropdownMenuRadioGroup,
+}
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/form.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/form.tsx
new file mode 100644
index 00000000..f6afdaf2
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/form.tsx
@@ -0,0 +1,176 @@
+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 = FieldPath
+> = {
+ name: TName
+}
+
+const FormFieldContext = React.createContext(
+ {} as FormFieldContextValue
+)
+
+const FormField = <
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath
+>({
+ ...props
+}: ControllerProps) => {
+ return (
+
+
+
+ )
+}
+
+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 ")
+ }
+
+ 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(
+ {} as FormItemContextValue
+)
+
+const FormItem = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const id = React.useId()
+
+ return (
+
+
+
+ )
+})
+FormItem.displayName = "FormItem"
+
+const FormLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ const { error, formItemId } = useFormField()
+
+ return (
+
+ )
+})
+FormLabel.displayName = "FormLabel"
+
+const FormControl = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ ...props }, ref) => {
+ const { error, formItemId, formDescriptionId, formMessageId } = useFormField()
+
+ return (
+
+ )
+})
+FormControl.displayName = "FormControl"
+
+const FormDescription = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const { formDescriptionId } = useFormField()
+
+ return (
+
+ )
+})
+FormDescription.displayName = "FormDescription"
+
+const FormMessage = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, children, ...props }, ref) => {
+ const { error, formMessageId } = useFormField()
+ const body = error ? String(error?.message) : children
+
+ if (!body) {
+ return null
+ }
+
+ return (
+
+ {body}
+
+ )
+})
+FormMessage.displayName = "FormMessage"
+
+export {
+ useFormField,
+ Form,
+ FormItem,
+ FormLabel,
+ FormControl,
+ FormDescription,
+ FormMessage,
+ FormField,
+}
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/input.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/input.tsx
new file mode 100644
index 00000000..5af26b2c
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/input.tsx
@@ -0,0 +1,25 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+export interface InputProps
+ extends React.InputHTMLAttributes {}
+
+const Input = React.forwardRef(
+ ({ className, type, ...props }, ref) => {
+ return (
+
+ )
+ }
+)
+Input.displayName = "Input"
+
+export { Input }
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/label.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/label.tsx
new file mode 100644
index 00000000..683faa79
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/label.tsx
@@ -0,0 +1,24 @@
+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,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, ...props }, ref) => (
+
+))
+Label.displayName = LabelPrimitive.Root.displayName
+
+export { Label }
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/textarea.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/textarea.tsx
new file mode 100644
index 00000000..d1258e47
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/textarea.tsx
@@ -0,0 +1,24 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+export interface TextareaProps
+ extends React.TextareaHTMLAttributes {}
+
+const Textarea = React.forwardRef(
+ ({ className, ...props }, ref) => {
+ return (
+
+ )
+ }
+)
+Textarea.displayName = "Textarea"
+
+export { Textarea }
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/toast.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/toast.tsx
new file mode 100644
index 00000000..00ad6a1e
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/toast.tsx
@@ -0,0 +1,127 @@
+import * as React from "react"
+import { Cross2Icon } from "@radix-ui/react-icons"
+import * as ToastPrimitives from "@radix-ui/react-toast"
+import { cva, type VariantProps } from "class-variance-authority"
+
+import { cn } from "@/lib/utils"
+
+const ToastProvider = ToastPrimitives.Provider
+
+const ToastViewport = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ToastViewport.displayName = ToastPrimitives.Viewport.displayName
+
+const toastVariants = cva(
+ "group pointer-events-auto relative flex w-full items-center justify-between space-x-2 overflow-hidden rounded-md border p-4 pr-6 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,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, variant, ...props }, ref) => {
+ return (
+
+ )
+})
+Toast.displayName = ToastPrimitives.Root.displayName
+
+const ToastAction = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ToastAction.displayName = ToastPrimitives.Action.displayName
+
+const ToastClose = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+))
+ToastClose.displayName = ToastPrimitives.Close.displayName
+
+const ToastTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ToastTitle.displayName = ToastPrimitives.Title.displayName
+
+const ToastDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ToastDescription.displayName = ToastPrimitives.Description.displayName
+
+type ToastProps = React.ComponentPropsWithoutRef
+
+type ToastActionElement = React.ReactElement
+
+export {
+ type ToastProps,
+ type ToastActionElement,
+ ToastProvider,
+ ToastViewport,
+ Toast,
+ ToastTitle,
+ ToastDescription,
+ ToastClose,
+ ToastAction,
+}
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/toaster.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/toaster.tsx
new file mode 100644
index 00000000..9ca617f6
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/components/ui/toaster.tsx
@@ -0,0 +1,33 @@
+import { useToast } from "@/hooks/use-toast"
+import {
+ Toast,
+ ToastClose,
+ ToastDescription,
+ ToastProvider,
+ ToastTitle,
+ ToastViewport,
+} from "@/components/ui/toast"
+
+export function Toaster() {
+ const { toasts } = useToast()
+
+ return (
+
+ {toasts.map(function ({ id, title, description, action, ...props }) {
+ return (
+
+
+ {title && {title} }
+ {description && (
+ {description}
+ )}
+
+ {action}
+
+
+ )
+ })}
+
+
+ )
+}
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/constants/index.ts b/examples/apps/social-media/web/react-tailwind/kochu-media/src/constants/index.ts
new file mode 100644
index 00000000..7d2ee6c6
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/constants/index.ts
@@ -0,0 +1,85 @@
+export const sidebarLinks = [
+ {
+ imgURL: "/assets/icons/home.svg",
+ route: "/",
+ label: "Home",
+ },
+ {
+ imgURL: "/assets/icons/explore.svg",
+ route: "/explore",
+ label: "Explore",
+ },
+ {
+ imgURL: "/assets/icons/people.svg",
+ route: "/all-users",
+ label: "People",
+ },
+ {
+ imgURL: "/assets/icons/bookmark.svg",
+ route: "/saved",
+ label: "Saved",
+ },
+ {
+ imgURL: "/assets/icons/gallery-add.svg",
+ route: "/create-post",
+ label: "Create Post",
+ },
+];
+interface User {
+ id: string;
+}
+
+export const getBookmarksLinks = (user: User) => [
+ {
+ imgURL: "/assets/icons/home.svg",
+ route: "/",
+ label: "Home",
+ },
+ {
+ imgURL: "/assets/icons/explore.svg",
+ route: "/explore",
+ label: "Explore",
+ },
+ {
+ imgURL: "/assets/icons/people.svg",
+ route: "/all-users",
+ label: "People",
+ },
+ {
+ imgURL: "/assets/icons/account.svg",
+ route: `/profile/${user?.id}`,
+ label: "Account",
+ },
+ {
+ imgURL: "/assets/icons/gallery-add.svg",
+ route: "/create-post",
+ label: "Create",
+ },
+ {
+ imgURL: "/assets/icons/bookmark.svg",
+ route: "/saved",
+ label: "Saved",
+ },
+];
+
+
+export const socialLinks = [
+ {
+ title: "Follow me on GitHub !",
+ href: "#",
+ imageSrc: "/assets/images/github-mark-white.png",
+ alt: "GitHub",
+ },
+ {
+ title: "Connect on LinkedIn !",
+ href: "#",
+ imageSrc: "/assets/images/linkedin-mark.png",
+ alt: "LinkedIn",
+ },
+ {
+ title: "Catch me on X !",
+ href: "#",
+ imageSrc: "/assets/images/x-mark.svg",
+ alt: "X",
+ },
+];
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/context/AuthContext.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/context/AuthContext.tsx
new file mode 100644
index 00000000..8040c8d2
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/context/AuthContext.tsx
@@ -0,0 +1,92 @@
+import { getCurrentUser } from '@/lib/appwrite/api';
+import { IContextType, IUser } from '@/types'
+import { createContext, useContext, useEffect, useState } from 'react'
+import { useNavigate } from 'react-router-dom'
+
+export const INITIAL_USER = {
+ id: '',
+ name: '',
+ email: '',
+ username: '',
+ imageUrl: '',
+ bio: '',
+}
+
+const INITIAL_STATE = {
+ user: INITIAL_USER,
+ isLoading: false,
+ isAuthenticated: false,
+ setUser: () => { },
+ setIsAuthenticated: () => { },
+ checkAuthUser: async () => false as boolean,
+}
+
+const AuthContext = createContext(INITIAL_STATE);
+
+const AuthProvider = ({ children }: { children: React.ReactNode }) => {
+ const [user, setUser] = useState(INITIAL_USER)
+ const [isLoading, setIsLoading] = useState(false);
+ const [isAuthenticated, setIsAuthenticated] = useState(false)
+ const navigate = useNavigate();
+
+ const checkAuthUser = async () => {
+ setIsLoading(true); // Start loading
+ try {
+ const currentAccount = await getCurrentUser();
+
+ if (currentAccount) {
+ setUser({
+ id: currentAccount.$id,
+ name: currentAccount.name,
+ email: currentAccount.email,
+ username: currentAccount.username,
+ imageUrl: currentAccount.imageUrl,
+ bio: currentAccount.bio,
+ });
+
+ setIsAuthenticated(true);
+ return true;
+ }
+ return false;
+
+ } catch (error) {
+ console.log(error);
+ return false;
+
+ } finally {
+ setIsLoading(false); // End loading
+ }
+ }
+
+ useEffect(() => {
+ const checkUser = async () => {
+ const isLoggedIn = await checkAuthUser();
+
+ // If not authenticated, redirect to sign-in page
+ if (!isLoggedIn) {
+ navigate('/sign-in');
+ }
+ };
+
+ // Call the checkUser on component mount
+ checkUser();
+ }, []);
+
+ const value = {
+ user,
+ setUser,
+ isLoading,
+ isAuthenticated,
+ setIsAuthenticated,
+ checkAuthUser
+ }
+
+ return (
+
+ {children}
+
+ )
+}
+
+export default AuthProvider;
+export const useUserContext = () => useContext(AuthContext);
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/globals.css b/examples/apps/social-media/web/react-tailwind/kochu-media/src/globals.css
new file mode 100644
index 00000000..88f7f0e8
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/globals.css
@@ -0,0 +1,434 @@
+@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap");
+
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ * {
+ @apply box-border list-none p-0 m-0 scroll-smooth;
+ }
+
+ body {
+ @apply bg-[#000000] text-white min-h-screen font-inter overflow-hidden;
+ }
+}
+
+@keyframes shine {
+ 0% {
+ opacity: 0.5;
+ transform: translateX(-100%);
+ }
+
+ 50% {
+ opacity: 1;
+ transform: translateX(100%);
+ }
+
+ 100% {
+ opacity: 0.5;
+ transform: translateX(200%);
+ }
+}
+
+.premium-box {
+ background: transparent;
+ padding: 1.5rem;
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
+ border-radius: 15px;
+ transition: transform 0.4s ease, box-shadow 0.4s ease;
+}
+
+.premium-box:hover {
+ transform: translateY(-5px);
+}
+
+.shining-border {
+ pointer-events: none;
+ content: '';
+ position: absolute;
+ width: 200%;
+ height: 100%;
+ background: linear-gradient(120deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
+ animation: shine 3s infinite linear;
+}
+
+.shine-effect {
+ position: relative;
+ z-index: 2;
+}
+
+.premium-box::before {
+ content: '';
+ position: absolute;
+ top: -50%;
+ left: -50%;
+ width: 200%;
+ height: 200%;
+ background: linear-gradient(120deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0));
+ transform: rotate(45deg);
+ opacity: 0.3;
+}
+
+
+@layer utilities {
+
+ /* TYPOGRAPHY */
+ .h1-bold {
+ @apply text-[36px] font-bold leading-[140%] tracking-tighter;
+ }
+
+ .h1-semibold {
+ @apply text-[36px] font-semibold leading-[140%] tracking-tighter;
+ }
+
+ .h2-bold {
+ @apply text-[30px] font-bold leading-[140%] tracking-tighter;
+ }
+
+ .h3-bold {
+ @apply text-[24px] font-bold leading-[140%] tracking-tighter;
+ }
+
+ .base-semibold {
+ @apply text-[16px] font-semibold leading-[140%] tracking-tighter;
+ }
+
+ .base-medium {
+ @apply text-[16px] font-medium leading-[140%];
+ }
+
+ .base-regular {
+ @apply text-[16px] font-normal leading-[140%];
+ }
+
+ .body-bold {
+ @apply text-[18px] font-bold leading-[140%];
+ }
+
+ .body-medium {
+ @apply text-[18px] font-medium leading-[140%];
+ }
+
+ .small-semibold {
+ @apply text-[14px] font-semibold leading-[140%] tracking-tighter;
+ }
+
+ .small-medium {
+ @apply text-[14px] font-medium leading-[140%];
+ }
+
+ .small-regular {
+ @apply text-[14px] font-normal leading-[140%];
+ }
+
+ .subtle-semibold {
+ @apply text-[12px] font-semibold leading-[140%];
+ }
+
+ .tiny-medium {
+ @apply text-[10px] font-medium leading-[140%];
+ }
+
+ /* UTILITIES */
+ .invert-white {
+ @apply invert brightness-0 transition;
+ }
+
+ .flex-center {
+ @apply flex justify-center items-center;
+ }
+
+ .flex-between {
+ @apply flex justify-between items-center;
+ }
+
+ .flex-start {
+ @apply flex justify-start items-center;
+ }
+
+ .custom-scrollbar::-webkit-scrollbar {
+ width: 3px;
+ height: 3px;
+ border-radius: 2px;
+ }
+
+ .custom-scrollbar::-webkit-scrollbar-track {
+ background: #0a0a0a;
+ /* Darker background */
+ }
+
+ .custom-scrollbar::-webkit-scrollbar-thumb {
+ background: #1e5128;
+ /* Premium green */
+ border-radius: 50px;
+ }
+
+ .custom-scrollbar::-webkit-scrollbar-thumb:hover {
+ background: #4caf50;
+ /* Lighter green */
+ }
+
+ .common-container {
+ @apply pb-10 flex flex-col flex-1 items-center gap-10 overflow-scroll py-2 px-5 md:px-8 lg:py-14 md:py-10 custom-scrollbar;
+ }
+
+ /* All Users */
+ .user-container {
+ @apply max-w-5xl flex flex-col items-start w-full gap-6 md:gap-9;
+ }
+
+ .user-grid {
+ @apply w-full grid grid-cols-1 xs:grid-cols-2 md:grid-cols-2 lg:grid-cols-2 xl:grid-cols-3 gap-7 max-w-5xl;
+ }
+
+ /* Explore */
+ .explore-container {
+ @apply flex flex-col flex-1 items-center overflow-scroll py-2 lg:py-10 px-5 md:p-14 custom-scrollbar;
+ }
+
+ .explore-inner_container {
+ @apply max-w-5xl flex flex-col items-center w-full gap-6 md:gap-9;
+ }
+
+ .explore-search {
+ @apply h-12 bg-dark-4 border-none placeholder:text-light-4 focus-visible:ring-0 focus-visible:ring-offset-0 ring-offset-0 !important;
+ }
+
+ /* Home */
+ .home-container {
+ @apply overflow-x-hidden;
+ }
+
+ .home-posts {
+ @apply max-w-screen-sm flex flex-col items-center w-full md:gap-9;
+ }
+
+ .home-creators {
+ @apply hidden xl:flex flex-col w-72 2xl:w-465 px-6 py-10 gap-10 overflow-scroll custom-scrollbar;
+ }
+
+ .testimonial-lable {
+ @apply text-white p-6 rounded-lg shadow-lg h-[500px] lg:h-[200px] w-full flex flex-col items-center justify-start;
+ }
+
+ .root-layout {
+ @apply flex h-full w-full justify-center overflow-y-auto absolute md:static;
+ }
+
+ .post-creater-name {
+ @apply text-light-1 lg:body-bold body-medium;
+ }
+
+ .post-creater-username {
+ @apply subtle-semibold text-light-3
+ }
+
+
+
+ /* Post Details */
+ .post_details-container {
+ @apply flex flex-col flex-1 overflow-scroll py-2 px-5 md:p-14 lg:py-10 custom-scrollbar items-center;
+ }
+
+ .post_details-card {
+ @apply bg-dark-2 w-full max-w-5xl flex-col flex xl:flex-row border border-dark-4;
+ }
+
+ .post_details-img {
+ @apply h-80 lg:h-[480px] xl:w-[48%] rounded-t-[30px] xl:rounded-l-[24px] xl:rounded-tr-none object-cover p-5 bg-dark-1;
+ }
+
+ .post_details-info {
+ @apply bg-transparent flex flex-col gap-5 lg:gap-7 flex-1 items-start p-8 rounded-[30px];
+ }
+
+ .post_details-delete_btn {
+ @apply p-0 flex gap-3 hover:bg-transparent hover:text-light-1 text-light-1 small-medium lg:base-medium;
+ }
+
+ .drop-comment {
+ @apply bg-transparent border-none placeholder:text-light-4 focus-visible:ring-0 focus-visible:ring-offset-0 ring-offset-0 !important;
+
+ }
+
+ /* Profile */
+ .profile-container {
+ @apply flex flex-col items-center flex-1 gap-10 overflow-scroll py-10 px-5 md:p-14 custom-scrollbar;
+ }
+
+ .profile-inner_container {
+ @apply flex items-center md:mb-8 xl:items-start gap-8 flex-col xl:flex-row relative max-w-5xl w-full;
+ }
+
+ .profile-tab {
+ @apply flex-center gap-3 py-4 w-48 bg-dark-2 transition flex-1 xl:flex-initial;
+ }
+
+ .profile-navbar_box {
+ @apply flex gap-6 p-3 lg:gap-10 w-full border-b border-t border-border-1 items-center justify-evenly max-w-5xl;
+ }
+
+ /* Saved */
+ .saved-container {
+ @apply flex flex-col flex-1 items-center gap-10 overflow-scroll py-10 px-5 md:p-14 custom-scrollbar;
+ }
+
+ /* File uploader */
+ .file_uploader-img {
+ @apply h-80 lg:h-[480px] w-full rounded-[24px] object-cover object-top;
+ }
+
+ .file_uploader-label {
+ @apply text-light-4 text-center small-regular w-full p-4 border-t border-t-dark-4;
+ }
+
+ .file_uploader-box {
+ @apply flex-center flex-col p-7 h-80 lg:h-[612px];
+ }
+
+ /* Grid Post List */
+ .grid-container {
+ @apply w-full grid grid-cols-1 sm:grid-cols-2 md:grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 gap-7 max-w-5xl;
+ }
+
+ .grid-container-profile {
+ @apply w-full grid grid-cols-3 gap-2 max-w-5xl;
+ }
+
+ .grid-post_link_profile {
+ @apply flex rounded-[5px] border border-light-1 overflow-hidden cursor-pointer w-full h-full;
+ }
+
+ .grid-post_link {
+ @apply flex rounded-[24px] border border-dark-4 overflow-hidden cursor-pointer w-full h-full;
+ }
+
+ .grid-post_user {
+ @apply absolute bottom-0 p-5 flex-between w-full bg-gradient-to-t from-dark-3 to-transparent rounded-b-[24px] gap-2;
+ }
+
+ .grid-post_user_profile {
+ @apply absolute bottom-0 pb-2 w-full flex items-center bg-gradient-to-t from-dark-3 to-transparent gap-2;
+ }
+
+ /* Left sidebar */
+ .leftsidebar {
+ @apply hidden md:flex px-6 py-10 flex-col justify-between min-w-fit bg-transparent;
+ }
+
+ .leftsidebar-link {
+ @apply rounded-lg base-medium hover:bg-primary-500 transition;
+ }
+
+ /* Post Card */
+ .post-card {
+ @apply bg-transparent p-3 lg:p-5 w-full max-w-screen-sm border-b border-border-1 flex flex-1 flex-row gap-5 relative justify-center lg:justify-start;
+ }
+
+ .post-card_img {
+ @apply w-full max-h-[56vh] rounded-[15px] object-contain mb-5 lg:max-h-[70vh];
+ }
+
+
+ .post-card_details {
+ @apply max-h-[40rem] rounded-[15px] object-cover mb-5;
+ }
+
+ /* Topbar */
+ .topbar {
+ @apply sticky top-0 z-50 md:hidden bg-dark-4 w-full h-fit flex flex-col gap-5;
+ }
+
+ /* User card */
+ .user-card {
+ @apply flex-center flex-col gap-4 border border-dark-4 rounded-[20px] px-5 py-8;
+ }
+}
+
+@layer components {
+
+ /* SHADCN COMPONENTS */
+ .shad-form_label {
+ @apply text-white !important;
+ }
+
+ .shad-form_message {
+ @apply text-red !important;
+ }
+
+ .shad-input {
+ @apply h-12 bg-dark-4 border-none placeholder:text-light-4 focus-visible:ring-1 focus-visible:ring-offset-1 ring-offset-primary-500 rounded-[5px] !important;
+ }
+
+ .shad-textarea {
+ @apply h-36 bg-dark-3 rounded-xl border-none focus-visible:ring-1 focus-visible:ring-offset-1 ring-offset-primary-500 !important;
+ }
+
+ /* Button */
+ .shad-button_primary {
+ @apply bg-primary-500 hover:bg-primary-600 text-light-1 flex gap-2 rounded-[5px] !important;
+ }
+
+ /* for google auth btn */
+ .Google-auth_btn {
+ @apply bg-white hover:bg-gray-100 text-dark-1 flex gap-2 rounded-[5px] !important;
+ }
+
+ .shad-button_secondary {
+ @apply bg-dark-3 hover:bg-dark-4 text-light-1 flex gap-2 !important;
+ }
+
+ .shad-button_dark_4 {
+ @apply bg-dark-4 hover:bg-dark-4 text-light-1 flex gap-2 rounded-[5px] !important;
+ }
+
+
+
+
+}
+
+/* Firefox-specific styles */
+@-moz-document url-prefix() {
+ .root-layout {
+ @apply pb-[200px] py-0 md:pt-0 md:pb-0 md:py-0;
+ }
+}
+
+/* Chrome-specific styles */
+@supports (-webkit-appearance: none) and (not (-moz-appearance: none)) {
+ .root-layout {
+ @apply pb-[180px] md:pt-0 md:pb-0 md:py-0;
+ }
+
+ .post-creater-name {
+ @apply small-semibold lg:body-bold;
+ }
+
+ .post-creater-username {
+ @apply md:tiny-medium lg:small-semibold;
+ }
+}
+
+/* Custom scrollbar for Chrome */
+@supports (-webkit-appearance: none) {
+ .home-posts::-webkit-scrollbar {
+ width: 8px;
+ }
+
+ .home-posts::-webkit-scrollbar-track {
+ background: #1e1e1e;
+ border-radius: 10px;
+ }
+
+ .home-posts::-webkit-scrollbar-thumb {
+ background-color: #3b3b3b;
+ border-radius: 10px;
+ border: 2px solid transparent;
+ background-clip: padding-box;
+ }
+
+ .home-posts::-webkit-scrollbar-thumb:hover {
+ background-color: #555;
+ }
+}
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/hooks/use-toast.ts b/examples/apps/social-media/web/react-tailwind/kochu-media/src/hooks/use-toast.ts
new file mode 100644
index 00000000..2c14125a
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/hooks/use-toast.ts
@@ -0,0 +1,191 @@
+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
+ }
+ | {
+ type: ActionType["DISMISS_TOAST"]
+ toastId?: ToasterToast["id"]
+ }
+ | {
+ type: ActionType["REMOVE_TOAST"]
+ toastId?: ToasterToast["id"]
+ }
+
+interface State {
+ toasts: ToasterToast[]
+}
+
+const toastTimeouts = new Map>()
+
+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
+
+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(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 }
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/hooks/useDbounce.ts b/examples/apps/social-media/web/react-tailwind/kochu-media/src/hooks/useDbounce.ts
new file mode 100644
index 00000000..38ecbcbb
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/hooks/useDbounce.ts
@@ -0,0 +1,23 @@
+import { useEffect, useState } from "react";
+
+// https://codesandbox.io/s/react-query-debounce-ted8o?file=/src/useDebounce.js
+export default function useDebounce(value: T, delay: number): T {
+ // State and setters for debounced value
+ const [debouncedValue, setDebouncedValue] = useState(value);
+
+ useEffect(() => {
+ // Update debounced value after delay
+ const handler = setTimeout(() => {
+ setDebouncedValue(value);
+ }, delay);
+
+ // Cancel the timeout if value changes (also on delay change or unmount)
+ // This is how we prevent debounced value from updating if value is changed ...
+ // .. within the delay period. Timeout gets cleared and restarted.
+ return () => {
+ clearTimeout(handler);
+ };
+ }, [value, delay]); // Only re-call effect if value or delay changes
+
+ return debouncedValue;
+}
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/appwrite/api.ts b/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/appwrite/api.ts
new file mode 100644
index 00000000..8984aaad
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/appwrite/api.ts
@@ -0,0 +1,612 @@
+import { ID, ImageGravity } from "appwrite";
+import { INewPost, INewUser, IUpdatePost, IUpdateUser, } from "@/types";
+import { account, appwriteConfig, avatars, database, storage } from "./config";
+import { Query } from "appwrite";
+
+export async function createUserAccount(user: INewUser) {
+ try {
+ const newAccount = await account.create(
+ ID.unique(),
+ user.email,
+ user.password,
+ user.name,
+ )
+ if (!newAccount) throw Error;
+ const avatarUrl = avatars.getInitials(user.name);
+
+ const newUser = await saveUserToDatabase({
+ accountId: newAccount.$id,
+ email: newAccount.email,
+ name: newAccount.name,
+ username: user.username,
+ imageUrl: avatarUrl,
+ });
+
+ return newUser;
+ } catch (error) {
+ console.error(error);
+ return error;
+ }
+}
+
+export async function saveUserToDatabase(user: {
+ accountId: string,
+ email: string,
+ name: string,
+ imageUrl: URL,
+ username?: string,
+}) {
+ try {
+ const newUser = await database.createDocument(
+ appwriteConfig.databaseId,
+ appwriteConfig.userCollectonId,
+ ID.unique(),
+ user,
+ );
+
+ return newUser;
+ } catch (error) {
+ console.error(error);
+ return error;
+ }
+}
+
+export async function signInAccount(user: { email: string; password: string }) {
+ try {
+ // Check if the user already has an active session
+ const currentAccount = await getCurrentUser();
+ if (currentAccount) {
+ // console.log("Session already exists for user:", currentAccount);
+ return currentAccount;
+ }
+
+ // Create a new session if no active session exists
+ const session = await account.createEmailPasswordSession(
+ user.email,
+ user.password,
+ );
+
+ return session;
+ } catch (error) {
+ console.error("Error signing in:", error);
+ return error;
+ }
+}
+
+// export async function AuthWithGoogle() {
+// try {
+// // Start the Google OAuth process
+// const res = account.createOAuth2Session(
+// 'google',
+// 'http://localhost:5173/',
+// `http://localhost:5173/sign-up`,
+// );
+// if (!res) throw Error("OAuth2Session failed");
+
+// // Fetch the current user after OAuth session
+// const currentUser = await getCurrentUser();
+
+// if (!currentUser) {
+// // If the user doesn't exist, navigate to sign-up page
+// window.location.href = `http://localhost:5173/sign-up`; // Modify to your route
+// } else {
+// // If the user exists, log them in or fetch their details
+// await signInAccount(currentUser);
+// }
+// } catch (error) {
+// console.log("Google Sign-in Error:", error);
+// }
+// }
+
+
+export async function getCurrentUser() {
+ try {
+ const currentAccount = await account.get();
+ if (!currentAccount) {
+ return null;
+ }
+ const currentUser = await database.listDocuments(
+ appwriteConfig.databaseId,
+ appwriteConfig.userCollectonId,
+ [Query.equal('accountId', currentAccount.$id)]
+ );
+ if (currentUser.documents.length === 0) {
+ throw Error;
+ }
+ return currentUser.documents[0];
+ } catch (error) {
+ console.error("Error fetching current user:", error);
+ }
+}
+
+
+export async function signOutAccount() {
+ try {
+ const seasion = await account.deleteSession('current');
+ // console.log("Session deleted:", seasion);
+ return seasion;
+ } catch (error) {
+ console.log(error);
+ }
+}
+
+export async function createPost(post: INewPost) {
+ try {
+ // upload file to appwrite storage
+ // console.log("post object :", post, "file in 0 index", post.file);
+ const uploadedFile = await uploadfile(post.file);
+ // console.log("this is uploadfile :", uploadedFile);
+ if (!uploadedFile) throw Error;
+ // get file url
+ const fileUrl = getFilePreview(uploadedFile.$id);
+ if (!fileUrl) {
+ await deleteFile(uploadedFile.$id);
+ throw Error;
+ }
+ // Convert tags into array
+ const tags = post.tags?.replace(/ /g, "").split(",") || [];
+ // Create post object
+ const newPost = await database.createDocument(
+ appwriteConfig.databaseId,
+ appwriteConfig.postCollectionId,
+ ID.unique(),
+ {
+ creator: post.userId,
+ caption: post.caption,
+ imageUrl: fileUrl,
+ imageId: uploadedFile.$id,
+ location: post.location,
+ tags: tags,
+ }
+ )
+
+ if (!newPost) {
+ await deleteFile(uploadedFile.$id);
+ throw Error;
+ }
+
+ return newPost;
+ } catch (error) {
+ console.log("Error in createPost:", error);
+ }
+}
+
+// supporting functions that many time will be used
+export async function uploadfile(file: File) {
+ console.log("file reciving uploadfile :", file);
+ try {
+ if (!file) throw new Error("File not provided");
+
+ const uploadedFile = await storage.createFile(
+ appwriteConfig.storageId,
+ ID.unique(),
+ file
+ );
+ // console.log("Uploaded file:", uploadedFile);
+ return uploadedFile;
+ } catch (error) {
+ console.log('Error uploading file:', error);
+ }
+}
+
+
+export function getFilePreview(fileId: string) {
+ try {
+ const fileUrl = storage.getFilePreview(
+ appwriteConfig.storageId,
+ fileId,
+ 2000,
+ 2000,
+ ImageGravity.Top,
+ 50,
+ );
+
+ if (!fileUrl) throw Error;
+
+ return fileUrl;
+ } catch (error) {
+ console.log(error);
+ }
+}
+
+export async function deleteFile(fileId: string) {
+ try {
+ const deletedFile = await storage.deleteFile(
+ appwriteConfig.storageId,
+ fileId,
+ );
+ return deletedFile;
+ } catch (error) {
+ console.log(error);
+ }
+}
+
+
+export async function getRecentPost() {
+ try {
+ const posts = await database.listDocuments(
+ appwriteConfig.databaseId,
+ appwriteConfig.postCollectionId,
+ [Query.orderDesc('$createdAt'), Query.limit(20)]
+ )
+
+ if (!posts) throw Error;
+ return posts;
+ } catch (error) {
+ console.log(error)
+ }
+}
+export async function getPostById(postId: string) {
+ try {
+ const post = await database.getDocument(
+ appwriteConfig.databaseId,
+ appwriteConfig.postCollectionId,
+ postId
+ )
+ return post;
+ } catch (error) {
+ console.log(error);
+ }
+}
+export async function updatePost(post: IUpdatePost) {
+ const hasFileToUpdate = post.file && post.file.size > 0;
+
+ try {
+ let image = {
+ imageUrl: post.imageUrl,
+ imageId: post.imageId,
+ };
+
+ if (hasFileToUpdate) {
+ // Upload new file to Appwrite storage
+ // console.log("file in 0 index :", post.file);
+ const uploadedFile = await uploadfile(post.file);
+ if (!uploadedFile) throw new Error("File upload failed");
+
+ // console.log("this is uploaded file :", uploadedFile);
+
+ // Get new file URL
+ const fileUrl = getFilePreview(uploadedFile.$id);
+ if (!fileUrl) {
+ await deleteFile(uploadedFile.$id); // Clean up uploaded file
+ throw new Error("Failed to generate file URL");
+ }
+
+ image = { imageUrl: fileUrl, imageId: uploadedFile.$id };
+ }
+
+ // Convert tags into array and trim spaces properly
+ const tags = post.tags?.split(",").map(tag => tag.trim()) || [];
+
+ // Update post in the database
+ const updatedPost = await database.updateDocument(
+ appwriteConfig.databaseId,
+ appwriteConfig.postCollectionId,
+ post.postId,
+ {
+ caption: post.caption,
+ imageUrl: image.imageUrl,
+ imageId: image.imageId,
+ location: post.location,
+ tags: tags,
+ }
+ );
+
+ // Failed to update, delete the uploaded file if necessary
+ if (!updatedPost) {
+ if (hasFileToUpdate) {
+ await deleteFile(image.imageId); // Remove the newly uploaded file
+ }
+ throw new Error("Failed to update post");
+ }
+
+ // Safely delete the old image after successful update
+ if (hasFileToUpdate && post.imageId) {
+ await deleteFile(post.imageId); // Clean up the old image file
+ }
+
+ return updatedPost;
+ } catch (error) {
+ console.error("Error updating post:", error);
+ throw error; // Re-throw to handle the error in higher levels
+ }
+}
+export async function updateUser(user: IUpdateUser) {
+ // console.log("user in updateUser :", user);
+ const hasFileToUpdate = user.file && user.file.size > 0;
+
+ try {
+ let image = {
+ imageUrl: user.imageUrl,
+ imageId: user.imageId,
+ };
+
+ if (hasFileToUpdate) {
+ const uploadedFile = await uploadfile(user.file);
+ if (!uploadedFile) throw new Error("File upload failed");
+
+ // Get new file URL
+ const fileUrl = getFilePreview(uploadedFile.$id);
+ if (!fileUrl) {
+ await deleteFile(uploadedFile.$id);
+ throw new Error("Failed to generate file URL");
+ }
+
+ image = { imageUrl: fileUrl, imageId: uploadedFile.$id };
+ }
+
+ const updatedUser = await database.updateDocument(
+ appwriteConfig.databaseId,
+ appwriteConfig.userCollectonId,
+ user.userId,
+ {
+ name: user.name,
+ bio: user.bio,
+ imageUrl: image.imageUrl,
+ imageId: image.imageId,
+ }
+ );
+ if (!updatedUser) {
+ if (hasFileToUpdate) {
+ await deleteFile(image.imageId);
+ }
+ throw new Error("Failed to update user");
+ }
+ if (hasFileToUpdate && user.imageId) {
+ await deleteFile(user.imageId);
+ }
+
+ return updatedUser;
+ } catch (error) {
+ console.error("Error updating user:", error);
+ throw error;
+ }
+
+}
+
+export async function deletePost(postId: string, imageId: string) {
+ if (!postId || !imageId) throw Error;
+
+ try {
+ await database.deleteDocument(
+ appwriteConfig.databaseId,
+ appwriteConfig.postCollectionId,
+ postId
+ )
+
+ return { status: "ok" }
+ } catch (error) {
+ console.log(error)
+ }
+}
+
+
+export async function likePosts(postId: string, likesArray: string[]) {
+ try {
+ const updatedPost = await database.updateDocument(
+ appwriteConfig.databaseId,
+ appwriteConfig.postCollectionId,
+ postId,
+ {
+ likes: likesArray
+ }
+ )
+
+ if (!updatedPost) throw Error;
+ return updatedPost;
+ } catch (error) {
+ console.log(error);
+ }
+}
+
+export async function savePosts(postId: string, userId: string) {
+ try {
+ const updatePosts = await database.createDocument(
+ appwriteConfig.databaseId,
+ appwriteConfig.saveCollectionId,
+ ID.unique(),
+ {
+ user: userId,
+ post: postId,
+ }
+ )
+
+ if (!updatePosts) throw Error;
+ return updatePosts;
+ } catch (error) {
+ console.log(error)
+ }
+}
+
+export async function deleteSavePosts(savePostsId: string) {
+ try {
+ const statusCode = await database.deleteDocument(
+ appwriteConfig.databaseId,
+ appwriteConfig.saveCollectionId,
+ savePostsId,
+ )
+
+ if (!statusCode) throw Error;
+ return { status: "ok" };
+ } catch (error) {
+ console.log(error);
+ }
+}
+
+
+// explore
+export async function getInFininitePost({ pageParam }: { pageParam?: string | null }) {
+ const queries: any[] = [Query.orderDesc('$updatedAt'), Query.limit(9)];
+ if (pageParam) {
+ queries.push(Query.cursorAfter(pageParam.toString()));
+ }
+ try {
+ const posts = await database.listDocuments(
+ appwriteConfig.databaseId,
+ appwriteConfig.postCollectionId,
+ queries
+ )
+
+ if (!posts) throw Error;
+ return posts;
+ } catch (error) {
+ console.log(error)
+ throw error;
+ }
+}
+// Fetch infinite users
+export async function getInfiniteUsers({ pageParam }: { pageParam?: string | null }) {
+ const queries: any[] = [Query.orderDesc('$updatedAt'), Query.limit(10)];
+ if (pageParam) {
+ queries.push(Query.cursorAfter(pageParam.toString()));
+ }
+ try {
+ const users = await database.listDocuments(
+ appwriteConfig.databaseId,
+ appwriteConfig.userCollectonId,
+ queries
+ )
+
+ if (!users) throw Error;
+ return users;
+ } catch (error) {
+ console.log(error);
+ throw error;
+ }
+}
+export async function searchPost(searchTerm: string) {
+ try {
+ const posts = await database.listDocuments(
+ appwriteConfig.databaseId,
+ appwriteConfig.postCollectionId,
+ [Query.search('caption', searchTerm)]
+ )
+
+ if (!posts) throw Error;
+ return posts;
+ } catch (error) {
+ console.log(error)
+ }
+}
+// Search for users
+export async function searchUsers(searchTerm: string) {
+ try {
+ const users = await database.listDocuments(
+ appwriteConfig.databaseId,
+ appwriteConfig.userCollectonId,
+ [Query.search('name', searchTerm)]
+ )
+
+ if (!users) throw Error;
+ return users;
+ } catch (error) {
+ console.log(error);
+ }
+}
+
+// user
+export async function getUserById(userId: string) {
+ try {
+ const user = await database.getDocument(
+ appwriteConfig.databaseId,
+ appwriteConfig.userCollectonId,
+ userId
+ )
+
+ if (!user) throw Error;
+ return user;
+ } catch (error) {
+ console.log(error)
+ }
+}
+
+export async function getManyUserByIds(userIds: string[]) {
+ try {
+ const users = await database.listDocuments(
+ appwriteConfig.databaseId,
+ appwriteConfig.userCollectonId,
+ [Query.equal('accountId', userIds)]
+ )
+
+ if (!users) throw Error;
+ return users;
+ } catch (error) {
+ console.log(error)
+ }
+}
+
+// post a new comment
+export async function createNewComment(postId: string, userId: string, comment: string) {
+ try {
+ const newComment = await database.createDocument(
+ appwriteConfig.databaseId,
+ appwriteConfig.commentsCollectionId,
+ ID.unique(),
+ {
+ commentater: userId,
+ comment: comment,
+ posts: postId,
+ }
+ )
+
+ if (!newComment) throw Error;
+ return newComment;
+ } catch (error) {
+ console.log(error)
+ }
+}
+export async function getCommentsById(postId: string) {
+ try {
+ const rawComments = await database.listDocuments(
+ appwriteConfig.databaseId,
+ appwriteConfig.commentsCollectionId,
+ [
+ Query.equal('posts', postId),
+ Query.orderDesc('$createdAt'),
+ Query.limit(10)
+ ]
+ );
+
+ if (!rawComments) throw Error;
+
+ // Filter out unnecessary data
+ const comments = rawComments.documents.map((comment) => {
+ return {
+ _id: comment.$id,
+ comment: comment.comment,
+ $createdAt: comment.$createdAt,
+ Commentlikes: comment.Commentlikes,
+ commenter: {
+ imageUrl: comment.commentater.imageUrl,
+ name: comment.commentater.name,
+ username: comment.commentater.username,
+ id: comment.commentater.$id,
+ }
+ };
+ });
+
+ return comments;
+ } catch (error) {
+ console.log(error);
+ }
+}
+
+export async function likeComment(commentId: string, likesArray: string[]) {
+ try {
+ const updateComment = await database.updateDocument(
+ appwriteConfig.databaseId,
+ appwriteConfig.commentsCollectionId,
+ commentId,
+ {
+ likesArray
+ }
+ )
+
+ if (!updateComment) {
+ throw Error
+ }
+ return updateComment;
+ } catch (error) {
+ console.log(error);
+ }
+}
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/appwrite/config.ts b/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/appwrite/config.ts
new file mode 100644
index 00000000..533cf303
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/appwrite/config.ts
@@ -0,0 +1,27 @@
+import {
+ Client,
+ Account,
+ Databases,
+ Storage,
+ Avatars
+} from 'appwrite';
+
+export const appwriteConfig = {
+ projectId: import.meta.env.VITE_APPWRITE_PROJECT_ID,
+ url: import.meta.env.VITE_APPWRITE_URL,
+ storageId: import.meta.env.VITE_APPWRITE_STORAGE_ID,
+ databaseId: import.meta.env.VITE_APPWRITE_DATABASE_ID,
+ saveCollectionId: import.meta.env.VITE_APPWRITE_SAVE_COLLECTION_ID,
+ userCollectonId: import.meta.env.VITE_APPWRITE_USER_COLLECTION_ID,
+ postCollectionId: import.meta.env.VITE_APPWRITE_POST_COLLECTION_ID,
+ commentsCollectionId: import.meta.env.VITE_APPWRITE_COMMENTS_COLLECTION_ID,
+};
+
+export const client = new Client();
+client.setProject(appwriteConfig.projectId);
+client.setEndpoint(appwriteConfig.url);
+
+export const account = new Account(client);
+export const database = new Databases(client);
+export const storage = new Storage(client);
+export const avatars = new Avatars(client);
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/react-query/QueryProvider.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/react-query/QueryProvider.tsx
new file mode 100644
index 00000000..210f9a7d
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/react-query/QueryProvider.tsx
@@ -0,0 +1,11 @@
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query"
+
+const queryClient = new QueryClient();
+
+export const QueryProvider = ({ children }: { children: React.ReactNode }) => {
+ return (
+
+ {children}
+
+ )
+}
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/react-query/queriesAndMutation.ts b/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/react-query/queriesAndMutation.ts
new file mode 100644
index 00000000..87a8f62a
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/react-query/queriesAndMutation.ts
@@ -0,0 +1,296 @@
+import {
+ useInfiniteQuery,
+ // usequery,
+ useMutation,
+ useQuery,
+ useQueryClient,
+ // useInfiniteQuery,
+} from '@tanstack/react-query'
+import { createNewComment, createPost, createUserAccount, deletePost, deleteSavePosts, getCommentsById, getCurrentUser, getInFininitePost, getInfiniteUsers, getManyUserByIds, getPostById, getRecentPost, getUserById, likeComment, likePosts, savePosts, searchPost, searchUsers, signInAccount, signOutAccount, updatePost, updateUser } from '../appwrite/api'
+import { INewPost, INewUser, IUpdatePost, IUpdateUser, } from '@/types'
+import { QUERY_KEYS } from './queryKeys'
+
+
+export const useCreateUserAccount = () => {
+ return useMutation({
+ mutationFn: (user: INewUser) => createUserAccount(user)
+ })
+}
+export const useSignInAccount = () => {
+ return useMutation({
+ mutationFn: (user: { email: string; password: string }) => signInAccount(user)
+ })
+}
+
+export const useSignOutAccount = () => {
+ return useMutation({
+ mutationFn: signOutAccount
+ })
+}
+
+export const useCreatePost = () => {
+ const queryClient = useQueryClient()
+
+ return useMutation({
+ mutationFn: (post: INewPost) => createPost(post),
+ onSuccess: () => {
+ queryClient.invalidateQueries(
+ {
+ queryKey: [QUERY_KEYS.GET_RECENT_POSTS]
+ }
+ )
+ }
+ })
+}
+
+export const useGetRecentPost = () => {
+ return useQuery({
+ queryKey: [QUERY_KEYS.GET_RECENT_POSTS],
+ queryFn: getRecentPost,
+ })
+}
+
+
+export const useLikePost = () => {
+ const queryClient = useQueryClient();
+ return useMutation({
+ mutationFn: ({ postId, likesArray }: { postId: string, likesArray: string[] }) => likePosts(postId, likesArray),
+ onSuccess: (data) => {
+ queryClient.invalidateQueries(
+ {
+ queryKey: [QUERY_KEYS.GET_POST_BY_ID, data?.$id]
+ }
+ )
+ queryClient.invalidateQueries(
+ {
+ queryKey: [QUERY_KEYS.GET_RECENT_POSTS]
+ }
+ )
+ queryClient.invalidateQueries(
+ {
+ queryKey: [QUERY_KEYS.GET_POSTS]
+ }
+ )
+ queryClient.invalidateQueries(
+ {
+ queryKey: [QUERY_KEYS.GET_CURRENT_USER]
+ }
+ )
+ }
+ })
+}
+
+export const useLikeComment = () => {
+ const queryClient = useQueryClient();
+ return useMutation({
+ mutationFn: ({ commentId, likesArray }: { commentId: string, likesArray: string[] }) => likeComment(commentId, likesArray),
+ onSuccess: () => {
+ queryClient.invalidateQueries(
+ {
+ queryKey: [QUERY_KEYS.GET_CURRENT_COMMENTS]
+ }
+ )
+ queryClient.invalidateQueries(
+ {
+ queryKey: [QUERY_KEYS.GET_CURRENT_USER]
+ }
+ )
+ }
+ })
+}
+
+export const useSavePost = () => {
+ const queryClient = useQueryClient();
+ return useMutation({
+ mutationFn: ({ postId, userId }: { postId: string, userId: string }) => savePosts(postId, userId),
+ onSuccess: () => {
+ queryClient.invalidateQueries(
+ {
+ queryKey: [QUERY_KEYS.GET_RECENT_POSTS]
+ }
+ )
+ queryClient.invalidateQueries(
+ {
+ queryKey: [QUERY_KEYS.GET_POSTS]
+ }
+ )
+ queryClient.invalidateQueries(
+ {
+ queryKey: [QUERY_KEYS.GET_CURRENT_USER]
+ }
+ )
+ }
+ })
+}
+export const useDeleteSavePost = () => {
+ const queryClient = useQueryClient();
+ return useMutation({
+ mutationFn: (savePostsId: string) => deleteSavePosts(savePostsId),
+ onSuccess: () => {
+ queryClient.invalidateQueries(
+ {
+ queryKey: [QUERY_KEYS.GET_RECENT_POSTS]
+ }
+ )
+ queryClient.invalidateQueries(
+ {
+ queryKey: [QUERY_KEYS.GET_POSTS]
+ }
+ )
+ queryClient.invalidateQueries(
+ {
+ queryKey: [QUERY_KEYS.GET_CURRENT_USER]
+ }
+ )
+ }
+ })
+}
+
+export const useGetCurrentUser = () => {
+ return useQuery({
+ queryKey: [QUERY_KEYS.GET_CURRENT_USER],
+ queryFn: getCurrentUser,
+ });
+};
+
+export const useGetCurrentUserPosts = () => {
+ return useQuery({
+ queryKey: [QUERY_KEYS.GET_CURRENT_USER],
+ queryFn: getCurrentUser,
+ staleTime: 1000 * 60 * 5,
+ refetchOnWindowFocus: false,
+ });
+};
+
+
+export const useGetPostById = (postId: string) => {
+ return useQuery({
+ queryKey: [QUERY_KEYS.GET_POST_BY_ID, postId],
+ queryFn: () => getPostById(postId),
+ enabled: !!postId,
+ })
+}
+
+export const useUpdatePost = () => {
+ const queryClient = useQueryClient()
+ return useMutation({
+ mutationFn: (post: IUpdatePost) => updatePost(post),
+ onSuccess: (data) => {
+ queryClient.invalidateQueries({
+ queryKey: [QUERY_KEYS.GET_POST_BY_ID, data?.$id]
+ })
+ }
+ })
+}
+
+export const useUpdateProfile = () => {
+ const queryClient = useQueryClient()
+ return useMutation({
+ mutationFn: (user: IUpdateUser) => updateUser(user),
+ onSuccess: () => {
+ queryClient.invalidateQueries({
+ queryKey: [QUERY_KEYS.GET_CURRENT_USER]
+ })
+ }
+ })
+}
+
+export const useDeletePost = () => {
+ const queryClient = useQueryClient()
+ return useMutation({
+ mutationFn: ({ postId, imageId }: { postId: string, imageId: string }) => deletePost(postId, imageId),
+ onSuccess: () => {
+ queryClient.invalidateQueries({
+ queryKey: [QUERY_KEYS.GET_RECENT_POSTS]
+ })
+ }
+ })
+}
+
+// expore
+export const useGetPosts = () => {
+ return useInfiniteQuery({
+ queryKey: [QUERY_KEYS.GET_INFINITE_POSTS],
+ queryFn: getInFininitePost,
+ staleTime: 1000 * 60 * 5,
+ refetchOnWindowFocus: false,
+ getNextPageParam: (lastPage) => {
+ if (lastPage && lastPage.documents.length === 0) return null;
+ const lastId = lastPage?.documents[lastPage.documents.length - 1].$id;
+ return lastId ?? null;
+ },
+ initialPageParam: null
+ })
+}
+// Infinite query to fetch users
+export const useGetUsers = () => {
+ return useInfiniteQuery({
+ queryKey: [QUERY_KEYS.GET_USERS],
+ queryFn: getInfiniteUsers,
+ staleTime: 1000 * 60 * 5,
+ refetchOnWindowFocus: false,
+ getNextPageParam: (lastPage) => {
+ if (lastPage && lastPage.documents.length === 0) return null;
+ const lastId = lastPage?.documents[lastPage.documents.length - 1].$id;
+ return lastId ?? null;
+ },
+ initialPageParam: null
+ });
+}
+
+export const useSearchPost = (searchTurm: string) => {
+ return useQuery({
+ queryKey: [QUERY_KEYS.SEARCH_POSTS, searchTurm],
+ queryFn: () => searchPost(searchTurm),
+ enabled: !!searchTurm
+ })
+}
+export const useSearchUsers = (searchTurm: string) => {
+ return useQuery({
+ queryKey: [QUERY_KEYS.SEARCH_USERS, searchTurm],
+ queryFn: () => searchUsers(searchTurm),
+ enabled: !!searchTurm
+ })
+}
+// users
+export const useGetUserById = (userId: string) => {
+ return useQuery({
+ queryKey: [QUERY_KEYS.GET_USER_BY_ID, userId],
+ queryFn: () => getUserById(userId),
+ enabled: !!userId,
+ })
+}
+
+export const useGetManyUserById = (userIds: string[]) => {
+ return useQuery({
+ queryKey: [QUERY_KEYS.GET_MANY_USER_BY_IDS, userIds],
+ queryFn: () => getManyUserByIds(userIds),
+ enabled: !!userIds
+ })
+}
+
+// comments on post
+export const usePostComment = () => {
+ const queryClient = useQueryClient();
+ return useMutation({
+ mutationFn: ({ postId, userId, comment }: { postId: string, userId: string, comment: string }) => createNewComment(postId, userId, comment),
+ onSuccess: () => {
+ queryClient.invalidateQueries(
+ {
+ queryKey: [QUERY_KEYS.GET_CURRENT_COMMENTS]
+ }
+ )
+ }
+ })
+}
+
+// get all comments on post
+export const useGetCommentsById = (postId: string) => {
+ return useQuery({
+ queryKey: [QUERY_KEYS.GET_CURRENT_COMMENTS, postId],
+ queryFn: () => getCommentsById(postId),
+ staleTime: 1000 * 60 * 5,
+ refetchOnWindowFocus: false,
+ enabled: !!postId
+ })
+}
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/react-query/queryKeys.ts b/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/react-query/queryKeys.ts
new file mode 100644
index 00000000..7a203083
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/react-query/queryKeys.ts
@@ -0,0 +1,25 @@
+export enum QUERY_KEYS {
+ // AUTH KEYS
+ CREATE_USER_ACCOUNT = "createUserAccount",
+
+ // USER KEYS
+ GET_CURRENT_USER = "getCurrentUser",
+ GET_USERS = "getUsers",
+ GET_USER_BY_ID = "getUserById",
+ SEARCH_USERS = "searchUsers",
+
+ // POST KEYS
+ GET_POSTS = "getPosts",
+ GET_INFINITE_POSTS = "getInfinitePosts",
+ GET_RECENT_POSTS = "getRecentPosts",
+ GET_POST_BY_ID = "getPostById",
+ GET_USER_POSTS = "getUserPosts",
+ GET_FILE_PREVIEW = "getFilePreview",
+ GET_CURRENT_USER_SAVED_POSTS = "getCurrentUserSavedPosts",
+ GET_CURRENT_COMMENTS = "getCurrentComments",
+
+ // SEARCH KEYS
+ SEARCH_POSTS = "getSearchPosts",
+ GET_MANY_USER_BY_IDS = "getManyUserByIds",
+
+}
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/utils.ts b/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/utils.ts
new file mode 100644
index 00000000..020f61d6
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/utils.ts
@@ -0,0 +1,54 @@
+import { type ClassValue, clsx } from "clsx"
+import { twMerge } from "tailwind-merge"
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs))
+}
+
+export function formatDate(dateString: string): string {
+ const date = new Date(dateString);
+ const now = new Date();
+
+ const secondsAgo = Math.floor((now.getTime() - date.getTime()) / 1000);
+
+ const minutesAgo = Math.floor(secondsAgo / 60);
+ const hoursAgo = Math.floor(minutesAgo / 60);
+ const daysAgo = Math.floor(hoursAgo / 24);
+ const weeksAgo = Math.floor(daysAgo / 7);
+ const monthsAgo = Math.floor(daysAgo / 30);
+ const yearsAgo = Math.floor(daysAgo / 365);
+
+ if (yearsAgo >= 1) return `${yearsAgo}y`;
+ if (monthsAgo >= 1) return `${monthsAgo}mo`;
+ if (weeksAgo >= 1) return `${weeksAgo}w`;
+ if (daysAgo >= 1) return `${daysAgo}d`;
+ if (hoursAgo >= 1) return `${hoursAgo}h`;
+ if (minutesAgo >= 1) return `${minutesAgo}m`;
+ return `just now`;
+}
+
+export function formatDateMathYearDay(dateString: string): string {
+ const date = new Date(dateString);
+
+ // Extract hours, minutes, and AM/PM
+ let hours = date.getHours();
+ const minutes = date.getMinutes().toString().padStart(2, '0');
+ const ampm = hours >= 12 ? 'PM' : 'AM';
+ hours = hours % 12;
+ hours = hours ? hours : 12; // the hour '0' should be '12'
+
+ // Get month name
+ const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
+ const month = monthNames[date.getMonth()];
+
+ // Format the date
+ const day = date.getDate();
+ const year = date.getFullYear();
+
+ return `${hours}:${minutes} ${ampm} ยท ${month} ${day}, ${year}`;
+}
+
+
+export const checkIsLiked = (likeList: string[], userId: string) => {
+ return likeList.includes(userId);
+};
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/validation/index.ts b/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/validation/index.ts
new file mode 100644
index 00000000..9b9d119a
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/lib/validation/index.ts
@@ -0,0 +1,27 @@
+import { z } from "zod"
+
+
+export const signupValidarion = z.object({
+ name: z.string().min(2).max(50),
+ username: z.string().min(2).max(50,),
+ email: z.string().email(),
+ password: z.string().min(4).max(50),
+})
+
+export const signinValidarion = z.object({
+ email: z.string().email(),
+ password: z.string().min(4).max(50),
+})
+
+export const postValidation = z.object({
+ caption: z.string().min(5).max(2200),
+ file: z.custom(),
+ location: z.string().min(2).max(100),
+ tags: z.string()
+})
+
+export const updateUserValidation = z.object({
+ name: z.string().min(2).max(50),
+ bio: z.string().min(2).max(100),
+ file: z.custom(),
+})
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/mian.tsx b/examples/apps/social-media/web/react-tailwind/kochu-media/src/mian.tsx
new file mode 100644
index 00000000..b4de9a88
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/mian.tsx
@@ -0,0 +1,16 @@
+import ReactDOM from "react-dom/client";
+import { BrowserRouter } from 'react-router-dom'
+import App from "./App";
+import AuthProvider from "./context/AuthContext";
+import { QueryProvider } from "./lib/react-query/QueryProvider";
+
+
+ReactDOM.createRoot(document.getElementById('root')!).render(
+
+
+
+
+
+
+
+)
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/types/index.ts b/examples/apps/social-media/web/react-tailwind/kochu-media/src/types/index.ts
new file mode 100644
index 00000000..72e966d7
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/types/index.ts
@@ -0,0 +1,73 @@
+export type IContextType = {
+ user: IUser;
+ isLoading: boolean;
+ setUser: React.Dispatch>;
+ isAuthenticated: boolean;
+ setIsAuthenticated: React.Dispatch>;
+ checkAuthUser: () => Promise;
+}
+
+export type INavLink = {
+ imgURL: string;
+ route: string;
+ label: string;
+};
+
+export type IUpdateUser = {
+ userId: string;
+ name: string;
+ bio: string;
+ imageId: string;
+ imageUrl: URL | string;
+ file: File;
+};
+
+export type INewPost = {
+ userId: string;
+ caption: string;
+ file: File;
+ location?: string;
+ tags?: string;
+};
+
+export type IUpdatePost = {
+ postId: string;
+ caption: string;
+ imageId: string;
+ imageUrl: URL;
+ file: File;
+ location?: string;
+ tags?: string;
+};
+
+export type IUser = {
+ id: string;
+ name: string;
+ username: string;
+ email: string;
+ imageUrl: string;
+ bio: string;
+};
+
+export type IUserWithImageId = IUser & {
+ imageId: string;
+};
+
+export type INewUser = {
+ name: string;
+ email: string;
+ username: string;
+ password: string;
+};
+export interface Document {
+ $id: string;
+ title: string;
+ content: string;
+ createdAt: string;
+ updatedAt: string;
+}
+
+export interface DocumentList {
+ documents: T[];
+ total: number;
+}
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/src/vite-env.d.ts b/examples/apps/social-media/web/react-tailwind/kochu-media/src/vite-env.d.ts
new file mode 100644
index 00000000..151aa685
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
\ No newline at end of file
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/tailwind.config.js b/examples/apps/social-media/web/react-tailwind/kochu-media/tailwind.config.js
new file mode 100644
index 00000000..7e4d49fe
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/tailwind.config.js
@@ -0,0 +1,115 @@
+/** @type {import('tailwindcss').Config} */
+export default {
+ darkMode: ["class"],
+ content: [
+ "./pages/**/*.{ts,tsx}",
+ "./components/**/*.{ts,tsx}",
+ "./app/**/*.{ts,tsx}",
+ "./src/**/*.{ts,tsx}",
+ ],
+ theme: {
+ container: {
+ center: "true",
+ padding: "2rem",
+ screens: {
+ "2xl": "1400px",
+ },
+ },
+ extend: {
+ colors: {
+ "primary-500": "#F2613F",
+ "primary-600": "#9B3922",
+ "secondary-500": "#FFB620",
+ "off-white": "#D0DFFF",
+ red: "#FF5A5A",
+ "dark-1": "#151515",
+ "dark-2": "#0C0C0C",
+ "dark-3": "#101012",
+ "dark-4": "#1F1F22",
+ "light-1": "#FFFFFF",
+ "light-2": "#EFEFEF",
+ "light-3": "#7878A3",
+ "light-4": "#8c8e90",
+ "border-1": "#2f3336",
+ background: "hsl(var(--background))",
+ foreground: "hsl(var(--foreground))",
+ card: {
+ DEFAULT: "hsl(var(--card))",
+ foreground: "hsl(var(--card-foreground))",
+ },
+ popover: {
+ DEFAULT: "hsl(var(--popover))",
+ foreground: "hsl(var(--popover-foreground))",
+ },
+ primary: {
+ DEFAULT: "hsl(var(--primary))",
+ foreground: "hsl(var(--primary-foreground))",
+ },
+ secondary: {
+ DEFAULT: "hsl(var(--secondary))",
+ foreground: "hsl(var(--secondary-foreground))",
+ },
+ muted: {
+ DEFAULT: "hsl(var(--muted))",
+ foreground: "hsl(var(--muted-foreground))",
+ },
+ accent: {
+ DEFAULT: "hsl(var(--accent))",
+ foreground: "hsl(var(--accent-foreground))",
+ },
+ destructive: {
+ DEFAULT: "hsl(var(--destructive))",
+ foreground: "hsl(var(--destructive-foreground))",
+ },
+ border: "hsl(var(--border))",
+ input: "hsl(var(--input))",
+ ring: "hsl(var(--ring))",
+ chart: {
+ 1: "hsl(var(--chart-1))",
+ 2: "hsl(var(--chart-2))",
+ 3: "hsl(var(--chart-3))",
+ 4: "hsl(var(--chart-4))",
+ 5: "hsl(var(--chart-5))",
+ },
+ },
+ screens: {
+ xs: "480px",
+ },
+ width: {
+ 420: "420px",
+ 465: "465px",
+ },
+ fontFamily: {
+ inter: ["Inter", "sans-serif"],
+ },
+ 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",
+ },
+ borderRadius: {
+ lg: "var(--radius)",
+ md: "calc(var(--radius) - 2px)",
+ sm: "calc(var(--radius) - 4px)",
+ },
+ },
+ },
+ plugins: [require("tailwindcss-animate")],
+};
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/tsconfig.app.json b/examples/apps/social-media/web/react-tailwind/kochu-media/tsconfig.app.json
new file mode 100644
index 00000000..7594f69b
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/tsconfig.app.json
@@ -0,0 +1,30 @@
+{
+ "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": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+
+ /* shadcn */
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ },
+ "include": ["src"]
+}
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/tsconfig.json b/examples/apps/social-media/web/react-tailwind/kochu-media/tsconfig.json
new file mode 100644
index 00000000..1e173931
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/tsconfig.json
@@ -0,0 +1,17 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.node.json"
+ }
+ ],
+ "compilerOptions": {
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/tsconfig.node.json b/examples/apps/social-media/web/react-tailwind/kochu-media/tsconfig.node.json
new file mode 100644
index 00000000..0d3d7144
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/tsconfig.node.json
@@ -0,0 +1,22 @@
+{
+ "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": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/examples/apps/social-media/web/react-tailwind/kochu-media/vite.config.ts b/examples/apps/social-media/web/react-tailwind/kochu-media/vite.config.ts
new file mode 100644
index 00000000..41cba577
--- /dev/null
+++ b/examples/apps/social-media/web/react-tailwind/kochu-media/vite.config.ts
@@ -0,0 +1,16 @@
+import path from "path";
+import react from "@vitejs/plugin-react";
+import { defineConfig } from "vite";
+
+export default defineConfig({
+ plugins: [react()],
+ resolve: {
+ alias: {
+ "@": path.resolve(__dirname, "./src"),
+ },
+ },
+ server: {
+ host: true, // This will make it accessible on the local network
+ port: 3000, // You can change the port if needed
+ },
+});