diff --git a/Backend/.env-example b/Backend/.env-example
deleted file mode 100644
index 18e42cd..0000000
--- a/Backend/.env-example
+++ /dev/null
@@ -1,10 +0,0 @@
-user=postgres
-password=[YOUR-PASSWORD]
-host=
-port=5432
-dbname=postgres
-GROQ_API_KEY=
-SUPABASE_URL=
-SUPABASE_KEY=
-GEMINI_API_KEY=
-YOUTUBE_API_KEY=
\ No newline at end of file
diff --git a/Backend/.gitignore b/Backend/.gitignore
deleted file mode 100644
index 18503aa..0000000
--- a/Backend/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-.env
-__pycache__/
-venv
-.venv
\ No newline at end of file
diff --git a/Backend/app/config.py b/Backend/app/config.py
deleted file mode 100644
index e69de29..0000000
diff --git a/Backend/app/db/db.py b/Backend/app/db/db.py
deleted file mode 100644
index ae0f517..0000000
--- a/Backend/app/db/db.py
+++ /dev/null
@@ -1,40 +0,0 @@
-from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
-from sqlalchemy.orm import sessionmaker, declarative_base
-from sqlalchemy.exc import SQLAlchemyError
-import os
-from dotenv import load_dotenv
-
-# Load environment variables from .env
-load_dotenv()
-
-# Fetch database credentials
-USER = os.getenv("user")
-PASSWORD = os.getenv("password")
-HOST = os.getenv("host")
-PORT = os.getenv("port")
-DBNAME = os.getenv("dbname")
-
-# Corrected async SQLAlchemy connection string (removed `sslmode=require`)
-DATABASE_URL = f"postgresql+asyncpg://{USER}:{PASSWORD}@{HOST}:{PORT}/{DBNAME}"
-
-# Initialize async SQLAlchemy components
-try:
- engine = create_async_engine(
- DATABASE_URL, echo=True, connect_args={"ssl": "require"}
- )
-
- AsyncSessionLocal = sessionmaker(
- bind=engine, class_=AsyncSession, expire_on_commit=False
- )
- Base = declarative_base()
- print("✅ Database connected successfully!")
-except SQLAlchemyError as e:
- print(f"❌ Error connecting to the database: {e}")
- engine = None
- AsyncSessionLocal = None
- Base = None
-
-
-async def get_db():
- async with AsyncSessionLocal() as session:
- yield session
diff --git a/Backend/app/db/seed.py b/Backend/app/db/seed.py
deleted file mode 100644
index 77a015e..0000000
--- a/Backend/app/db/seed.py
+++ /dev/null
@@ -1,57 +0,0 @@
-from datetime import datetime
-from app.db.db import AsyncSessionLocal
-from app.models.models import User
-
-
-async def seed_db():
- users = [
- {
- "id": "aabb1fd8-ba93-4e8c-976e-35e5c40b809c",
- "username": "creator1",
- "email": "creator1@example.com",
- "password": "password123",
- "role": "creator",
- "bio": "Lifestyle and travel content creator",
- "profile_image": None,
- "created_at": datetime.utcnow()
- },
- {
- "id": "6dbfcdd5-795f-49c1-8f7a-a5538b8c6f6f",
- "username": "brand1",
- "email": "brand1@example.com",
- "password": "password123",
- "role": "brand",
- "bio": "Sustainable fashion brand looking for influencers",
- "profile_image": None,
- "created_at": datetime.utcnow()
- },
- ]
-
- # Insert or update the users
- async with AsyncSessionLocal() as session:
- for user_data in users:
- # Check if user exists
- existing_user = await session.execute(
- User.__table__.select().where(User.email == user_data["email"])
- )
- existing_user = existing_user.scalar_one_or_none()
-
- if existing_user:
- continue
- else:
- # Create new user
- user = User(
- id=user_data["id"],
- username=user_data["username"],
- email=user_data["email"],
- role=user_data["role"],
- profile_image=user_data["profile_image"],
- bio=user_data["bio"],
- created_at=user_data["created_at"]
- )
- session.add(user)
- print(f"Created user: {user_data['email']}")
-
- # Commit the session
- await session.commit()
- print("✅ Users seeded successfully.")
diff --git a/Backend/app/main.py b/Backend/app/main.py
deleted file mode 100644
index 86d892a..0000000
--- a/Backend/app/main.py
+++ /dev/null
@@ -1,66 +0,0 @@
-from fastapi import FastAPI
-from fastapi.middleware.cors import CORSMiddleware
-from .db.db import engine
-from .db.seed import seed_db
-from .models import models, chat
-from .routes.post import router as post_router
-from .routes.chat import router as chat_router
-from .routes.match import router as match_router
-from sqlalchemy.exc import SQLAlchemyError
-import logging
-import os
-from dotenv import load_dotenv
-from contextlib import asynccontextmanager
-from app.routes import ai
-
-# Load environment variables
-load_dotenv()
-
-
-# Async function to create database tables with exception handling
-async def create_tables():
- try:
- async with engine.begin() as conn:
- await conn.run_sync(models.Base.metadata.create_all)
- await conn.run_sync(chat.Base.metadata.create_all)
- print("✅ Tables created successfully or already exist.")
- except SQLAlchemyError as e:
- print(f"❌ Error creating tables: {e}")
-
-
-# Lifespan context manager for startup and shutdown events
-@asynccontextmanager
-async def lifespan(app: FastAPI):
- print("App is starting...")
- await create_tables()
- await seed_db()
- yield
- print("App is shutting down...")
-
-
-# Initialize FastAPI
-app = FastAPI(lifespan=lifespan)
-
-# Add CORS middleware
-app.add_middleware(
- CORSMiddleware,
- allow_origins=["http://localhost:5173"],
- allow_credentials=True,
- allow_methods=["*"],
- allow_headers=["*"],
-)
-
-# Include the routes
-app.include_router(post_router)
-app.include_router(chat_router)
-app.include_router(match_router)
-app.include_router(ai.router)
-app.include_router(ai.youtube_router)
-
-
-@app.get("/")
-async def home():
- try:
- return {"message": "Welcome to Inpact API!"}
- except Exception as e:
- return {"error": f"Unexpected error: {e}"}
diff --git a/Backend/app/models/chat.py b/Backend/app/models/chat.py
deleted file mode 100644
index 16c6d93..0000000
--- a/Backend/app/models/chat.py
+++ /dev/null
@@ -1,54 +0,0 @@
-from sqlalchemy import Column, String, ForeignKey, DateTime, Enum, UniqueConstraint
-from sqlalchemy.orm import relationship
-from datetime import datetime, timezone
-from app.db.db import Base
-import uuid
-import enum
-
-
-def generate_uuid():
- return str(uuid.uuid4())
-
-
-class MessageStatus(enum.Enum):
- SENT = "sent"
- DELIVERED = "delivered"
- SEEN = "seen"
-
-
-class ChatList(Base):
- __tablename__ = "chat_list"
-
- id = Column(String, primary_key=True, default=generate_uuid)
- user1_id = Column(String, ForeignKey("users.id"), nullable=False)
- user2_id = Column(String, ForeignKey("users.id"), nullable=False)
- last_message_time = Column(
- DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)
- )
-
- user1 = relationship("User", foreign_keys=[user1_id], backref="chatlist_user1")
- user2 = relationship("User", foreign_keys=[user2_id], backref="chatlist_user2")
-
- __table_args__ = (UniqueConstraint("user1_id", "user2_id", name="unique_chat"),)
-
-
-class ChatMessage(Base):
- __tablename__ = "chat_messages"
-
- id = Column(String, primary_key=True, default=generate_uuid)
- sender_id = Column(String, ForeignKey("users.id"), nullable=False)
- receiver_id = Column(String, ForeignKey("users.id"), nullable=False)
- message = Column(String, nullable=False)
- status = Column(
- Enum(MessageStatus), default=MessageStatus.SENT
- ) # Using the enum class
- created_at = Column(
- DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)
- )
-
- sender = relationship("User", foreign_keys=[sender_id], backref="sent_messages")
- receiver = relationship(
- "User", foreign_keys=[receiver_id], backref="received_messages"
- )
- chat_list_id = Column(String, ForeignKey("chat_list.id"), nullable=False)
- chat = relationship("ChatList", backref="messages")
diff --git a/Backend/app/models/models.py b/Backend/app/models/models.py
deleted file mode 100644
index 56681ab..0000000
--- a/Backend/app/models/models.py
+++ /dev/null
@@ -1,162 +0,0 @@
-from sqlalchemy import (
- Column,
- String,
- Integer,
- ForeignKey,
- Float,
- Text,
- JSON,
- DECIMAL,
- DateTime,
- Boolean,
- TIMESTAMP,
-)
-from sqlalchemy.orm import relationship
-from datetime import datetime
-from app.db.db import Base
-import uuid
-
-
-def generate_uuid():
- return str(uuid.uuid4())
-
-
-# User Table (Creators & Brands)
-class User(Base):
- __tablename__ = "users"
-
- id = Column(String, primary_key=True, default=generate_uuid)
- username = Column(String, unique=True, nullable=False)
- email = Column(String, unique=True, nullable=False)
- # password_hash = Column(Text, nullable=False) # Removed as Supabase handles auth
- role = Column(String, nullable=False) # 'creator' or 'brand'
- profile_image = Column(Text, nullable=True)
- bio = Column(Text, nullable=True)
- created_at = Column(TIMESTAMP, default=datetime.utcnow)
-
- is_online = Column(Boolean, default=False) # ✅ Track if user is online
- last_seen = Column(TIMESTAMP, default=datetime.utcnow)
-
- audience = relationship("AudienceInsights", back_populates="user", uselist=False)
- sponsorships = relationship("Sponsorship", back_populates="brand")
- posts = relationship("UserPost", back_populates="user")
- applications = relationship("SponsorshipApplication", back_populates="creator")
- payments = relationship(
- "SponsorshipPayment",
- foreign_keys="[SponsorshipPayment.creator_id]",
- back_populates="creator",
- )
- brand_payments = relationship(
- "SponsorshipPayment",
- foreign_keys="[SponsorshipPayment.brand_id]",
- back_populates="brand",
- )
-
-
-# Audience Insights Table
-class AudienceInsights(Base):
- __tablename__ = "audience_insights"
-
- id = Column(String, primary_key=True, default=generate_uuid)
- user_id = Column(String, ForeignKey("users.id"), nullable=False)
- audience_age_group = Column(JSON)
- audience_location = Column(JSON)
- engagement_rate = Column(Float)
- average_views = Column(Integer)
- time_of_attention = Column(Integer) # in seconds
- price_expectation = Column(DECIMAL(10, 2))
- created_at = Column(
- DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)
- )
-
- user = relationship("User", back_populates="audience")
-
-
-# Sponsorship Table (For Brands)
-class Sponsorship(Base):
- __tablename__ = "sponsorships"
-
- id = Column(String, primary_key=True, default=generate_uuid)
- brand_id = Column(String, ForeignKey("users.id"), nullable=False)
- title = Column(String, nullable=False)
- description = Column(Text, nullable=False)
- required_audience = Column(JSON) # {"age": ["18-24"], "location": ["USA", "UK"]}
- budget = Column(DECIMAL(10, 2))
- engagement_minimum = Column(Float)
- status = Column(String, default="open")
- created_at = Column(
- DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)
- )
-
- brand = relationship("User", back_populates="sponsorships")
- applications = relationship("SponsorshipApplication", back_populates="sponsorship")
-
-
-# User Posts Table
-class UserPost(Base):
- __tablename__ = "user_posts"
-
- id = Column(String, primary_key=True, default=generate_uuid)
- user_id = Column(String, ForeignKey("users.id"), nullable=False)
- title = Column(String, nullable=False)
- content = Column(Text, nullable=False)
- post_url = Column(Text, nullable=True)
- category = Column(String, nullable=True)
- engagement_metrics = Column(JSON) # {"likes": 500, "comments": 100, "shares": 50}
- created_at = Column(
- DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)
- )
-
- user = relationship("User", back_populates="posts")
-
-
-# Sponsorship Applications Table
-class SponsorshipApplication(Base):
- __tablename__ = "sponsorship_applications"
-
- id = Column(String, primary_key=True, default=generate_uuid)
- creator_id = Column(String, ForeignKey("users.id"), nullable=False)
- sponsorship_id = Column(String, ForeignKey("sponsorships.id"), nullable=False)
- post_id = Column(String, ForeignKey("user_posts.id"), nullable=True)
- proposal = Column(Text, nullable=False)
- status = Column(String, default="pending")
- applied_at = Column(
- DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)
- )
-
- creator = relationship("User", back_populates="applications")
- sponsorship = relationship("Sponsorship", back_populates="applications")
-
-
-# Collaborations Table
-class Collaboration(Base):
- __tablename__ = "collaborations"
-
- id = Column(String, primary_key=True, default=generate_uuid)
- creator_1_id = Column(String, ForeignKey("users.id"), nullable=False)
- creator_2_id = Column(String, ForeignKey("users.id"), nullable=False)
- collaboration_details = Column(Text, nullable=False)
- status = Column(String, default="pending")
- created_at = Column(
- DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)
- )
-
-
-# Sponsorship Payments Table
-class SponsorshipPayment(Base):
- __tablename__ = "sponsorship_payments"
-
- id = Column(String, primary_key=True, default=generate_uuid)
- creator_id = Column(String, ForeignKey("users.id"), nullable=False)
- brand_id = Column(String, ForeignKey("users.id"), nullable=False)
- sponsorship_id = Column(String, ForeignKey("sponsorships.id"), nullable=False)
- amount = Column(DECIMAL(10, 2), nullable=False)
- status = Column(String, default="pending")
- transaction_date = Column(
- DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)
- )
-
- creator = relationship("User", foreign_keys=[creator_id], back_populates="payments")
- brand = relationship(
- "User", foreign_keys=[brand_id], back_populates="brand_payments"
- )
diff --git a/Backend/app/models/posts.py b/Backend/app/models/posts.py
deleted file mode 100644
index e69de29..0000000
diff --git a/Backend/app/models/users.py b/Backend/app/models/users.py
deleted file mode 100644
index e69de29..0000000
diff --git a/Backend/app/routes/ai.py b/Backend/app/routes/ai.py
deleted file mode 100644
index a21a482..0000000
--- a/Backend/app/routes/ai.py
+++ /dev/null
@@ -1,101 +0,0 @@
-# FastAPI router for AI-powered endpoints, including trending niches
-from fastapi import APIRouter, HTTPException, Query
-from datetime import date
-import os
-import requests
-import json
-from supabase import create_client, Client
-from requests.adapters import HTTPAdapter
-from urllib3.util.retry import Retry
-
-# Initialize router
-router = APIRouter()
-
-# Load environment variables for Supabase and Gemini
-SUPABASE_URL = os.environ.get("SUPABASE_URL")
-SUPABASE_KEY = os.environ.get("SUPABASE_KEY")
-GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY")
-
-# Validate required environment variables
-if not all([SUPABASE_URL, SUPABASE_KEY, GEMINI_API_KEY]):
- raise ValueError("Missing required environment variables: SUPABASE_URL, SUPABASE_KEY, GEMINI_API_KEY")
-
-supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY)
-
-def fetch_from_gemini():
- prompt = (
- "List the top 6 trending content niches for creators and brands this week. For each, provide: name (the niche), insight (a short qualitative reason why it's trending), and global_activity (a number from 1 to 5, where 5 means very high global activity in this category, and 1 means low).Return as a JSON array of objects with keys: name, insight, global_activity."
- )
- url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-lite:generateContent?key={GEMINI_API_KEY}"
- # Set up retry strategy
- retry_strategy = Retry(
- total=3,
- backoff_factor=1,
- status_forcelist=[429, 500, 502, 503, 504],
- allowed_methods=["POST"],
- )
- adapter = HTTPAdapter(max_retries=retry_strategy)
- http = requests.Session()
- http.mount("https://", adapter)
- http.mount("http://", adapter)
- resp = http.post(url, json={"contents": [{"parts": [{"text": prompt}]}]}, timeout=(3.05, 10))
- resp.raise_for_status()
- print("Gemini raw response:", resp.text)
- data = resp.json()
- print("Gemini parsed JSON:", data)
- text = data['candidates'][0]['content']['parts'][0]['text']
- print("Gemini text to parse as JSON:", text)
- # Remove Markdown code block if present
- if text.strip().startswith('```'):
- text = text.strip().split('\n', 1)[1] # Remove the first line (```json)
- text = text.rsplit('```', 1)[0] # Remove the last ```
- text = text.strip()
- return json.loads(text)
-
-@router.get("/api/trending-niches")
-def trending_niches():
- """
- API endpoint to get trending niches for the current day.
- - If today's data exists in Supabase, return it.
- - Otherwise, fetch from Gemini, store in Supabase, and return the new data.
- - If Gemini fails, fallback to the most recent data available.
- """
- today = str(date.today())
- # Check if today's data exists in Supabase
- result = supabase.table("trending_niches").select("*").eq("fetched_at", today).execute()
- if not result.data:
- # Fetch from Gemini and store
- try:
- niches = fetch_from_gemini()
- for niche in niches:
- supabase.table("trending_niches").insert({
- "name": niche["name"],
- "insight": niche["insight"],
- "global_activity": int(niche["global_activity"]),
- "fetched_at": today
- }).execute()
- result = supabase.table("trending_niches").select("*").eq("fetched_at", today).execute()
- except Exception as e:
- print("Gemini fetch failed:", e)
- # fallback: serve most recent data
- result = supabase.table("trending_niches").select("*").order("fetched_at", desc=True).limit(6).execute()
- return result.data
-
-youtube_router = APIRouter(prefix="/youtube", tags=["YouTube"])
-
-@youtube_router.get("/channel-info")
-def get_youtube_channel_info(channelId: str = Query(..., description="YouTube Channel ID")):
- """
- Proxy endpoint to fetch YouTube channel info securely from the backend.
- The API key is kept secret and rate limiting can be enforced here.
- """
- api_key = os.getenv("YOUTUBE_API_KEY")
- if not api_key:
- raise HTTPException(status_code=500, detail="YouTube API key not configured on server.")
- url = f"https://www.googleapis.com/youtube/v3/channels?part=snippet,statistics&id={channelId}&key={api_key}"
- try:
- resp = requests.get(url, timeout=10)
- resp.raise_for_status()
- return resp.json()
- except requests.RequestException as e:
- raise HTTPException(status_code=502, detail=f"YouTube API error: {str(e)}")
diff --git a/Backend/app/routes/auth.py b/Backend/app/routes/auth.py
deleted file mode 100644
index 19d59a2..0000000
--- a/Backend/app/routes/auth.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from fastapi import APIRouter
-
-router = APIRouter()
-
-@router.get("/auth/ping")
-def ping():
- return {"message": "Auth route is working!"}
diff --git a/Backend/app/routes/chat.py b/Backend/app/routes/chat.py
deleted file mode 100644
index f51d6b7..0000000
--- a/Backend/app/routes/chat.py
+++ /dev/null
@@ -1,128 +0,0 @@
-from fastapi import (
- APIRouter,
- WebSocket,
- Depends,
- WebSocketDisconnect,
- Request,
- HTTPException,
-)
-from sqlalchemy.ext.asyncio import AsyncSession
-from ..db.db import get_db
-from ..services.chat_services import chat_service
-from redis.asyncio import Redis
-from ..services.redis_client import get_redis
-import asyncio
-from ..services.chat_pubsub import listen_to_channel
-
-router = APIRouter(prefix="/chat", tags=["Chat"])
-
-
-@router.websocket("/ws/{user_id}")
-async def websocket_endpoint(
- websocket: WebSocket,
- user_id: str,
- redis: Redis = Depends(get_redis),
- db: AsyncSession = Depends(get_db),
-):
- await chat_service.connect(user_id, websocket, db)
-
- listener_task = asyncio.create_task(listen_to_channel(user_id, websocket, redis))
-
- try:
- while True:
- data = await websocket.receive_json()
- event_type = data.get("event_type", "")
- if event_type == "SEND_MESSAGE":
- receiver_id = data.get("receiver_id")
- sender_id = user_id
- message_text = data.get("message")
- await chat_service.send_message(
- sender_id, receiver_id, message_text, db, redis
- )
-
- except WebSocketDisconnect:
- listener_task.cancel()
- await chat_service.disconnect(user_id, redis, db)
-
- except Exception as e:
- listener_task.cancel()
- await chat_service.disconnect(user_id, redis, db)
- # Optionally log the error
- print(f"Error in websocket for user {user_id}: {e}")
-
-
-@router.get("/user_name/{user_id}")
-async def get_user_name(user_id: str, db: AsyncSession = Depends(get_db)):
- return await chat_service.get_user_name(user_id, db)
-
-
-@router.get("/chat_list/{user_id}")
-async def get_user_chat_list(
- user_id: str,
- last_message_time: str | None = None,
- db: AsyncSession = Depends(get_db),
-):
- return await chat_service.get_user_chat_list(user_id, last_message_time, db)
-
-
-@router.get("/user_status/{target_user_id}")
-async def get_user_status(
- target_user_id: str,
- redis: Redis = Depends(get_redis),
- db: AsyncSession = Depends(get_db),
-):
- return await chat_service.get_user_status(target_user_id, redis, db)
-
-
-@router.get("/messages/{user_id}/{chat_list_id}")
-async def get_chat_history(
- user_id: str,
- chat_list_id: str,
- last_fetched: int = 0,
- db: AsyncSession = Depends(get_db),
-):
- return await chat_service.get_chat_history(user_id, chat_list_id, last_fetched, db)
-
-
-@router.put("/read/{user_id}/{chat_list_id}/{message_id}")
-async def mark_message_as_read(
- user_id: str,
- chat_list_id: str,
- message_id: str,
- db: AsyncSession = Depends(get_db),
- redis: Redis = Depends(get_redis),
-):
- if not message_id:
- raise HTTPException(status_code=400, detail="message_id is required")
-
- return await chat_service.mark_message_as_read(
- user_id, chat_list_id, message_id, db, redis
- )
-
-
-@router.put("/read/{user_id}/{chat_list_id}")
-async def mark_chat_as_read(
- user_id: str,
- chat_list_id: str,
- db: AsyncSession = Depends(get_db),
- redis: Redis = Depends(get_redis),
-):
- if not chat_list_id:
- raise HTTPException(status_code=400, detail="chat_list_id is required")
-
- return await chat_service.mark_chat_as_read(user_id, chat_list_id, db, redis)
-
-
-@router.post("/new_chat/{user_id}/{username}")
-async def create_new_chat_message(
- user_id: str,
- username: str,
- request: Request,
- db: AsyncSession = Depends(get_db),
- redis: Redis = Depends(get_redis),
-):
- body = await request.json()
- message = body.get("message")
- return await chat_service.create_new_chat_message(
- user_id, username, message, db, redis
- )
diff --git a/Backend/app/routes/match.py b/Backend/app/routes/match.py
deleted file mode 100644
index 48ba7f5..0000000
--- a/Backend/app/routes/match.py
+++ /dev/null
@@ -1,29 +0,0 @@
-from fastapi import APIRouter, HTTPException
-from supabase import create_client, Client
-import os
-from dotenv import load_dotenv
-from ..services.db_service import match_creators_for_brand, match_brands_for_creator
-
-# Load environment variables
-# load_dotenv()
-# url: str = os.getenv("SUPABASE_URL")
-# key: str = os.getenv("SUPABASE_KEY")
-# supabase: Client = create_client(url, key)
-
-router = APIRouter(prefix="/match", tags=["Matching"])
-
-@router.get("/creators-for-brand/{sponsorship_id}")
-def get_creators_for_brand(sponsorship_id: str):
- matches = match_creators_for_brand(sponsorship_id)
- if not matches:
- raise HTTPException(status_code=404, detail="No matching creators found.")
- return {"matches": matches}
-
-@router.get("/brands-for-creator/{creator_id}")
-def get_brands_for_creator(creator_id: str):
- matches = match_brands_for_creator(creator_id)
- if not matches:
- raise HTTPException(status_code=404, detail="No matching brand campaigns found.")
- return {"matches": matches}
-
-# Placeholder for endpoints, logic to be added next
\ No newline at end of file
diff --git a/Backend/app/routes/post.py b/Backend/app/routes/post.py
deleted file mode 100644
index a90e313..0000000
--- a/Backend/app/routes/post.py
+++ /dev/null
@@ -1,199 +0,0 @@
-from fastapi import APIRouter, Depends, HTTPException
-from sqlalchemy.ext.asyncio import AsyncSession
-from sqlalchemy.future import select
-from ..db.db import AsyncSessionLocal
-from ..models.models import (
- User, AudienceInsights, Sponsorship, UserPost,
- SponsorshipApplication, SponsorshipPayment, Collaboration
-)
-from ..schemas.schema import (
- UserCreate, AudienceInsightsCreate, SponsorshipCreate, UserPostCreate,
- SponsorshipApplicationCreate, SponsorshipPaymentCreate, CollaborationCreate
-)
-
-from fastapi import APIRouter, HTTPException
-import os
-from supabase import create_client, Client
-from dotenv import load_dotenv
-import uuid
-from datetime import datetime, timezone
-
-# Load environment variables
-load_dotenv()
-url: str = os.getenv("SUPABASE_URL")
-key: str = os.getenv("SUPABASE_KEY")
-supabase: Client = create_client(url, key)
-
-# Define Router
-router = APIRouter()
-
-# Helper Functions
-def generate_uuid():
- return str(uuid.uuid4())
-
-def current_timestamp():
- return datetime.now(timezone.utc).isoformat()
-
-# ========== USER ROUTES ==========
-@router.post("/users/")
-async def create_user(user: UserCreate):
- user_id = generate_uuid()
- t = current_timestamp()
-
- response = supabase.table("users").insert({
- "id": user_id,
- "username": user.username,
- "email": user.email,
- "role": user.role,
- "profile_image": user.profile_image,
- "bio": user.bio,
- "created_at": t
- }).execute()
-
- return response
-
-@router.get("/users/")
-async def get_users():
- result = supabase.table("users").select("*").execute()
- return result
-
-# ========== AUDIENCE INSIGHTS ROUTES ==========
-@router.post("/audience-insights/")
-async def create_audience_insights(insights: AudienceInsightsCreate):
- insight_id = generate_uuid()
- t = current_timestamp()
-
- response = supabase.table("audience_insights").insert({
- "id": insight_id,
- "user_id": insights.user_id,
- "audience_age_group": insights.audience_age_group,
- "audience_location": insights.audience_location,
- "engagement_rate": insights.engagement_rate,
- "average_views": insights.average_views,
- "time_of_attention": insights.time_of_attention,
- "price_expectation": insights.price_expectation,
- "created_at": t
- }).execute()
-
- return response
-
-@router.get("/audience-insights/")
-async def get_audience_insights():
- result = supabase.table("audience_insights").select("*").execute()
- return result
-
-# ========== SPONSORSHIP ROUTES ==========
-@router.post("/sponsorships/")
-async def create_sponsorship(sponsorship: SponsorshipCreate):
- sponsorship_id = generate_uuid()
- t = current_timestamp()
-
- response = supabase.table("sponsorships").insert({
- "id": sponsorship_id,
- "brand_id": sponsorship.brand_id,
- "title": sponsorship.title,
- "description": sponsorship.description,
- "required_audience": sponsorship.required_audience,
- "budget": sponsorship.budget,
- "engagement_minimum": sponsorship.engagement_minimum,
- "status": sponsorship.status,
- "created_at": t
- }).execute()
-
- return response
-
-@router.get("/sponsorships/")
-async def get_sponsorships():
- result = supabase.table("sponsorships").select("*").execute()
- return result
-
-# ========== USER POST ROUTES ==========
-@router.post("/posts/")
-async def create_post(post: UserPostCreate):
- post_id = generate_uuid()
- t = current_timestamp()
-
- response = supabase.table("user_posts").insert({
- "id": post_id,
- "user_id": post.user_id,
- "title": post.title,
- "content": post.content,
- "post_url": post.post_url,
- "category": post.category,
- "engagement_metrics": post.engagement_metrics,
- "created_at": t
- }).execute()
-
- return response
-
-@router.get("/posts/")
-async def get_posts():
- result = supabase.table("user_posts").select("*").execute()
- return result
-
-# ========== SPONSORSHIP APPLICATION ROUTES ==========
-@router.post("/sponsorship-applications/")
-async def create_sponsorship_application(application: SponsorshipApplicationCreate):
- application_id = generate_uuid()
- t = current_timestamp()
-
- response = supabase.table("sponsorship_applications").insert({
- "id": application_id,
- "creator_id": application.creator_id,
- "sponsorship_id": application.sponsorship_id,
- "post_id": application.post_id,
- "proposal": application.proposal,
- "status": application.status,
- "applied_at": t
- }).execute()
-
- return response
-
-@router.get("/sponsorship-applications/")
-async def get_sponsorship_applications():
- result = supabase.table("sponsorship_applications").select("*").execute()
- return result
-
-# ========== SPONSORSHIP PAYMENT ROUTES ==========
-@router.post("/sponsorship-payments/")
-async def create_sponsorship_payment(payment: SponsorshipPaymentCreate):
- payment_id = generate_uuid()
- t = current_timestamp()
-
- response = supabase.table("sponsorship_payments").insert({
- "id": payment_id,
- "creator_id": payment.creator_id,
- "sponsorship_id": payment.sponsorship_id,
- "amount": payment.amount,
- "status": payment.status,
- "payment_date": t
- }).execute()
-
- return response
-
-@router.get("/sponsorship-payments/")
-async def get_sponsorship_payments():
- result = supabase.table("sponsorship_payments").select("*").execute()
- return result
-
-# ========== COLLABORATION ROUTES ==========
-@router.post("/collaborations/")
-async def create_collaboration(collab: CollaborationCreate):
- collaboration_id = generate_uuid()
- t = current_timestamp()
-
- response = supabase.table("collaborations").insert({
- "id": collaboration_id,
- "creator_1_id": collab.creator_1_id,
- "creator_2_id": collab.creator_2_id,
- "collab_details": collab.collab_details,
- "status": collab.status,
- "created_at": t
- }).execute()
-
- return response
-
-@router.get("/collaborations/")
-async def get_collaborations():
- result = supabase.table("collaborations").select("*").execute()
- return result
diff --git a/Backend/app/schemas/schema.py b/Backend/app/schemas/schema.py
deleted file mode 100644
index 7389488..0000000
--- a/Backend/app/schemas/schema.py
+++ /dev/null
@@ -1,53 +0,0 @@
-from pydantic import BaseModel
-from typing import Optional, Dict
-from datetime import datetime
-
-class UserCreate(BaseModel):
- username: str
- email: str
- role: str
- profile_image: Optional[str] = None
- bio: Optional[str] = None
-
-class AudienceInsightsCreate(BaseModel):
- user_id: str
- audience_age_group: Dict[str, int]
- audience_location: Dict[str, int]
- engagement_rate: float
- average_views: int
- time_of_attention: int
- price_expectation: float
-
-class SponsorshipCreate(BaseModel):
- brand_id: str
- title: str
- description: str
- required_audience: Dict[str, list]
- budget: float
- engagement_minimum: float
-
-class UserPostCreate(BaseModel):
- user_id: str
- title: str
- content: str
- post_url: Optional[str] = None
- category: Optional[str] = None
- engagement_metrics: Dict[str, int]
-
-class SponsorshipApplicationCreate(BaseModel):
- creator_id: str
- sponsorship_id: str
- post_id: Optional[str] = None
- proposal: str
-
-class SponsorshipPaymentCreate(BaseModel):
- creator_id: str
- brand_id: str
- sponsorship_id: str
- amount: float
- status: Optional[str] = "pending"
-
-class CollaborationCreate(BaseModel):
- creator_1_id: str
- creator_2_id: str
- collaboration_details: str
diff --git a/Backend/app/services/ai_services.py b/Backend/app/services/ai_services.py
deleted file mode 100644
index 30482d3..0000000
--- a/Backend/app/services/ai_services.py
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-# from sqlalchemy.pool import NullPool
-from dotenv import load_dotenv
-import os
-
-# Load environment variables from .env
-load_dotenv()
-
-# ChatGroq API keys
-CHATGROQ_API_URL_TRANSCRIBE = "https://api.groq.com/openai/v1/audio/transcriptions"
-CHATGROQ_API_URL_CHAT = "https://api.groq.com/openai/v1/chat/completions"
-API_KEY = os.getenv("GROQ_API_KEY")
-
-import requests
-
-def query_sponsorship_client(info):
- prompt = f"Extract key details about sponsorship and client interactions from the following:\n\n{info}\n\nRespond in JSON with 'sponsorship_details' and 'client_interaction_summary'."
-
- headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
- payload = {"model": "llama3-8b-8192", "messages": [{"role": "user", "content": prompt}], "temperature": 0}
-
- try:
- response = requests.post(CHATGROQ_API_URL_CHAT, json=payload, headers=headers)
- return response.json().get("choices", [{}])[0].get("message", {}).get("content", {})
- except Exception as e:
- return {"error": str(e)}
diff --git a/Backend/app/services/chat_pubsub.py b/Backend/app/services/chat_pubsub.py
deleted file mode 100644
index 1b9e8cd..0000000
--- a/Backend/app/services/chat_pubsub.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from fastapi import WebSocket
-from redis.asyncio import Redis
-import json
-
-
-async def listen_to_channel(user_id: str, websocket: WebSocket, redis_client: Redis):
- pubsub = redis_client.pubsub()
- await pubsub.subscribe(f"to_user:{user_id}")
-
- try:
- async for message in pubsub.listen():
- if message["type"] == "message":
- await websocket.send_json(json.loads(message["data"]))
- finally:
- await pubsub.unsubscribe(f"to_user:{user_id}")
- await pubsub.close()
diff --git a/Backend/app/services/chat_services.py b/Backend/app/services/chat_services.py
deleted file mode 100644
index 4b5d1a6..0000000
--- a/Backend/app/services/chat_services.py
+++ /dev/null
@@ -1,428 +0,0 @@
-from fastapi import WebSocket, HTTPException
-from sqlalchemy.ext.asyncio import AsyncSession
-from sqlalchemy.sql import select
-from datetime import datetime, timezone
-from app.models.models import User
-from app.models.chat import ChatList, ChatMessage, MessageStatus
-from typing import Dict
-from redis.asyncio import Redis
-import logging
-import json
-
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
-
-class ChatService:
- def __init__(self):
- self.active_connections: Dict[str, WebSocket] = {}
-
- async def connect(
- self,
- user_id: str,
- websocket: WebSocket,
- db: AsyncSession,
- ):
- """Accept WebSocket connection and update user status to online."""
- await websocket.accept()
- # Mark user as online
- user = await db.get(User, user_id)
- if user:
- self.active_connections[user_id] = websocket
- user.is_online = True
- await db.commit()
-
- query = select(ChatMessage).where(
- (ChatMessage.receiver_id == user_id)
- & (ChatMessage.status == MessageStatus.SENT)
- )
- messages = (await db.execute(query)).scalars().all()
- # mark as delivered
- for message in messages:
- message.status = MessageStatus.DELIVERED
- await db.commit()
- else:
- logger.warning(f"User {user_id} not found in the database.")
- await websocket.close()
-
- async def disconnect(self, user_id: str, redis: Redis, db: AsyncSession):
- """Remove connection and update last seen."""
- self.active_connections.pop(user_id, None)
-
- # Mark user as offline and update last seen
- user = await db.get(User, user_id)
- if user:
- user.is_online = False
- user.last_seen = datetime.now(timezone.utc)
- await db.commit()
- await redis.set(
- f"user:{user_id}:last_seen", user.last_seen.isoformat(), ex=600
- )
-
- async def send_message(
- self,
- sender_id: str,
- receiver_id: str,
- message_text: str,
- db: AsyncSession,
- redis: Redis,
- ):
- """Send a message to the receiver if they are online."""
-
- if not message_text:
- raise HTTPException(status_code=400, detail="Message text is required")
- if sender_id == receiver_id:
- raise HTTPException(
- status_code=400, detail="Cannot send message to yourself"
- )
-
- # Find or create chat list
- chat_list = await db.execute(
- select(ChatList).where(
- ((ChatList.user1_id == sender_id) & (ChatList.user2_id == receiver_id))
- | (
- (ChatList.user1_id == receiver_id)
- & (ChatList.user2_id == sender_id)
- )
- )
- )
- chat_list = chat_list.scalar_one_or_none()
-
- is_chat_list_exists = chat_list is not None
-
- if not chat_list:
- chat_list = ChatList(user1_id=sender_id, user2_id=receiver_id)
- db.add(chat_list)
- await db.commit()
-
- # Store message in DB
- new_message = ChatMessage(
- sender_id=sender_id,
- receiver_id=receiver_id,
- chat_list_id=chat_list.id,
- message=message_text,
- status=MessageStatus.SENT,
- )
- db.add(new_message)
- await db.commit()
-
- # Update last message time
- chat_list.last_message_time = datetime.now(timezone.utc)
- await db.commit()
-
- receiver_channel = f"to_user:{receiver_id}"
- sender_channel = f"to_user:{sender_id}"
-
- # Send message to receiver if online
- if receiver_id in self.active_connections:
- new_message.status = MessageStatus.DELIVERED
- await db.commit()
-
- if sender_id in self.active_connections:
- await redis.publish(
- sender_channel,
- json.dumps(
- {
- "eventType": "NEW_MESSAGE_DELIVERED",
- "chatListId": chat_list.id,
- "id": new_message.id,
- "message": message_text,
- "createdAt": new_message.created_at.isoformat(),
- "isSent": True,
- "status": "delivered",
- "senderId": sender_id,
- }
- ),
- )
-
- # Send message to receiver
- await redis.publish(
- receiver_channel,
- json.dumps(
- {
- "eventType": "NEW_MESSAGE_RECEIVED",
- "chatListId": chat_list.id,
- "id": new_message.id,
- "message": message_text,
- "createdAt": new_message.created_at.isoformat(),
- "isSent": False,
- "senderId": sender_id,
- }
- ),
- )
-
- else:
- if sender_id in self.active_connections:
- # Send delivered message to sender
- await redis.publish(
- sender_channel,
- json.dumps(
- {
- "eventType": "NEW_MESSAGE_SENT",
- "chatListId": chat_list.id,
- "id": new_message.id,
- "message": message_text,
- "createdAt": new_message.created_at.isoformat(),
- "isSent": True,
- "status": "sent",
- "senderId": receiver_id,
- }
- ),
- )
-
- # used in create_new_chat_message
- return {
- "chatListId": chat_list.id,
- "isChatListExists": is_chat_list_exists,
- }
-
- async def get_chat_history(
- self, user_id: str, chat_list_id: str, last_fetched: int, db: AsyncSession
- ):
- """Fetch chat history between two users."""
- limit = 20
- last_fetched_date = (
- datetime.fromtimestamp(last_fetched / 1000, tz=timezone.utc)
- if last_fetched
- else datetime.now(timezone.utc)
- )
- chat_list = await db.execute(
- select(ChatList).where(
- ((ChatList.user1_id == user_id) | (ChatList.user2_id == user_id))
- & (ChatList.id == chat_list_id)
- )
- )
- chat_list = chat_list.scalar_one_or_none()
-
- if not chat_list:
- raise HTTPException(status_code=404, detail="Chat not found")
-
- messages = await db.execute(
- select(ChatMessage)
- .where(
- ChatMessage.chat_list_id == chat_list.id,
- ChatMessage.created_at < last_fetched_date,
- )
- .order_by(ChatMessage.created_at.desc())
- .limit(limit)
- )
- messages = messages.scalars().all()
- # Format messages removing user IDs and adding isSent flag
- formatted_messages = []
- for message in messages:
- formatted_message = {
- "id": message.id,
- "message": message.message,
- "status": message.status.value,
- "createdAt": message.created_at.isoformat(),
- "isSent": message.sender_id == user_id,
- }
- formatted_messages.append(formatted_message)
-
- return formatted_messages
-
- async def mark_message_as_read(
- self,
- user_id: str,
- chat_list_id: str,
- message_id: str,
- db: AsyncSession,
- redis: Redis,
- ):
- """Mark a specific message as read and notify sender."""
- # Get the specific message
- message = await db.get(ChatMessage, message_id)
-
- if not message:
- raise HTTPException(status_code=404, detail="Message not found")
-
- # Verify the message belongs to the specified chat list and user is the receiver
- if message.chat_list_id != chat_list_id or message.receiver_id != user_id:
- raise HTTPException(
- status_code=403, detail="Not authorized to mark this message as read"
- )
-
- # Update message status
- if message.status != MessageStatus.SEEN:
- message.status = MessageStatus.SEEN
- await db.commit()
-
- # Notify sender if they're online
- if message.sender_id in self.active_connections:
- # Send message read notification to sender
- await redis.publish(
- f"to_user:{message.sender_id}",
- json.dumps(
- {
- "eventType": "MESSAGE_READ",
- "chatListId": chat_list_id,
- "messageId": message_id,
- }
- ),
- )
-
- return True
-
- async def mark_chat_as_read(
- self, user_id: str, chat_list_id: str, db: AsyncSession, redis: Redis
- ):
- """Mark messages as read and notify sender."""
- result = await db.execute(
- select(ChatMessage).where(
- (
- (ChatMessage.sender_id == user_id)
- | (ChatMessage.receiver_id == user_id)
- )
- & (ChatMessage.chat_list_id == chat_list_id)
- & (ChatMessage.status != MessageStatus.SEEN)
- )
- )
- messages = result.scalars().all()
-
- for message in messages:
- if message.sender_id == user_id:
- message.status = MessageStatus.SEEN
-
- await db.commit()
-
- receiver_id = (
- (
- messages[0].receiver_id
- if messages[0].sender_id == user_id
- else messages[0].sender_id
- )
- if len(messages)
- else None
- )
-
- # Notify receiver
- if receiver_id and (receiver_id in self.active_connections):
- await redis.publish(
- f"to_user:{receiver_id}",
- json.dumps(
- {
- "eventType": "CHAT_MESSAGES_READ",
- "chatListId": chat_list_id,
- }
- ),
- )
-
- return {"message": "Messages marked as read"}
-
- async def get_user_status(
- self, target_user_id: str, redis: Redis, db: AsyncSession
- ):
- """Check if user is online. If not, send their last seen time."""
- is_online = target_user_id in self.active_connections
- if not is_online:
- last_seen = await redis.get(f"user:{target_user_id}:last_seen")
- if not last_seen:
- user = await db.get(User, target_user_id)
- if user:
- last_seen = user.last_seen
- await redis.set(
- f"user:{target_user_id}:last_seen",
- last_seen.isoformat(),
- ex=600,
- )
- return {
- "isOnline": False,
- "lastSeen": last_seen,
- }
-
- return {
- "isOnline": is_online,
- }
-
- async def get_user_chat_list(
- self, user_id: str, last_message_time: str | None, db: AsyncSession
- ):
- """Get all chat lists for a user."""
- limit = 20
- last_message_date = (
- datetime.fromisoformat(last_message_time)
- if last_message_time
- else datetime.now(timezone.utc)
- )
- chat_lists = await db.execute(
- select(ChatList)
- .where(
- ((ChatList.user1_id == user_id) | (ChatList.user2_id == user_id))
- & (ChatList.last_message_time < last_message_date)
- )
- .order_by(ChatList.last_message_time.desc())
- .limit(limit)
- )
- chat_lists = chat_lists.scalars().all()
-
- formatted_chat_lists = []
- for chat_list in chat_lists:
- receiver_id = (
- chat_list.user1_id
- if chat_list.user2_id == user_id
- else chat_list.user2_id
- )
-
- receiver = await db.get(User, receiver_id)
- if not receiver:
- continue
- formatted_chat_list = {
- "chatListId": chat_list.id,
- "lastMessageTime": chat_list.last_message_time.isoformat(),
- "receiver": {
- "id": receiver.id,
- "username": receiver.username,
- "profileImage": receiver.profile_image,
- },
- }
- formatted_chat_lists.append(formatted_chat_list)
- return formatted_chat_lists
-
- async def get_user_name(self, user_id: str, db: AsyncSession):
- """Get the username of a user."""
- user = await db.get(User, user_id)
- if not user:
- raise HTTPException(status_code=404, detail="User not found")
- return {
- "username": user.username,
- "profileImage": user.profile_image,
- }
-
- async def create_new_chat_message(
- self,
- user_id: str,
- username: str,
- message_text: str,
- db: AsyncSession,
- redis: Redis,
- ):
- """Create a new chat message."""
- if not message_text:
- raise HTTPException(status_code=400, detail="Message text is required")
-
- receiver = await db.execute(select(User).where(User.username == username))
-
- receiver = receiver.scalar_one_or_none()
- if not receiver:
- raise HTTPException(status_code=404, detail="Receiver not found")
- if receiver.id == user_id:
- raise HTTPException(
- status_code=400, detail="Cannot send message to yourself"
- )
-
- chat_list = await db.execute(
- select(ChatList).where(
- ((ChatList.user1_id == user_id) & (ChatList.user2_id == receiver.id))
- | ((ChatList.user1_id == receiver.id) & (ChatList.user2_id == user_id))
- )
- )
- if chat_list:
- return {
- "chatListId": chat_list.scalar_one().id,
- "isChatListExists": True,
- }
-
- return await self.send_message(user_id, receiver.id, message_text, db, redis)
-
-
-chat_service = ChatService()
diff --git a/Backend/app/services/db_service.py b/Backend/app/services/db_service.py
deleted file mode 100644
index ccb4199..0000000
--- a/Backend/app/services/db_service.py
+++ /dev/null
@@ -1,85 +0,0 @@
-from supabase import create_client, Client
-import os
-from dotenv import load_dotenv
-from typing import List, Dict, Any
-
-# Load environment variables
-load_dotenv()
-url: str = os.getenv("SUPABASE_URL")
-key: str = os.getenv("SUPABASE_KEY")
-supabase: Client = create_client(url, key)
-
-
-def match_creators_for_brand(sponsorship_id: str) -> List[Dict[str, Any]]:
- # Fetch sponsorship details
- sponsorship_resp = supabase.table("sponsorships").select("*").eq("id", sponsorship_id).execute()
- if not sponsorship_resp.data:
- return []
- sponsorship = sponsorship_resp.data[0]
-
- # Fetch all audience insights (for creators)
- audience_resp = supabase.table("audience_insights").select("*").execute()
- creators = []
- for audience in audience_resp.data:
- # Basic matching logic: audience, engagement, price, etc.
- match_score = 0
- # Audience age group overlap
- if 'required_audience' in sponsorship and 'audience_age_group' in audience:
- required_ages = sponsorship['required_audience'].get('age_group', [])
- creator_ages = audience.get('audience_age_group', {})
- overlap = sum([creator_ages.get(age, 0) for age in required_ages])
- if overlap > 0:
- match_score += 1
- # Audience location overlap
- if 'required_audience' in sponsorship and 'audience_location' in audience:
- required_locs = sponsorship['required_audience'].get('location', [])
- creator_locs = audience.get('audience_location', {})
- overlap = sum([creator_locs.get(loc, 0) for loc in required_locs])
- if overlap > 0:
- match_score += 1
- # Engagement rate
- if audience.get('engagement_rate', 0) >= sponsorship.get('engagement_minimum', 0):
- match_score += 1
- # Price expectation
- if audience.get('price_expectation', 0) <= sponsorship.get('budget', 0):
- match_score += 1
- if match_score >= 2: # Threshold for a match
- creators.append({"user_id": audience["user_id"], "match_score": match_score, **audience})
- return creators
-
-
-def match_brands_for_creator(creator_id: str) -> List[Dict[str, Any]]:
- # Fetch creator's audience insights
- audience_resp = supabase.table("audience_insights").select("*").eq("user_id", creator_id).execute()
- if not audience_resp.data:
- return []
- audience = audience_resp.data[0]
-
- # Fetch all sponsorships
- sponsorships_resp = supabase.table("sponsorships").select("*").execute()
- matches = []
- for sponsorship in sponsorships_resp.data:
- match_score = 0
- # Audience age group overlap
- if 'required_audience' in sponsorship and 'audience_age_group' in audience:
- required_ages = sponsorship['required_audience'].get('age_group', [])
- creator_ages = audience.get('audience_age_group', {})
- overlap = sum([creator_ages.get(age, 0) for age in required_ages])
- if overlap > 0:
- match_score += 1
- # Audience location overlap
- if 'required_audience' in sponsorship and 'audience_location' in audience:
- required_locs = sponsorship['required_audience'].get('location', [])
- creator_locs = audience.get('audience_location', {})
- overlap = sum([creator_locs.get(loc, 0) for loc in required_locs])
- if overlap > 0:
- match_score += 1
- # Engagement rate
- if audience.get('engagement_rate', 0) >= sponsorship.get('engagement_minimum', 0):
- match_score += 1
- # Price expectation
- if audience.get('price_expectation', 0) <= sponsorship.get('budget', 0):
- match_score += 1
- if match_score >= 2: # Threshold for a match
- matches.append({"sponsorship_id": sponsorship["id"], "match_score": match_score, **sponsorship})
- return matches
diff --git a/Backend/app/services/redis_client.py b/Backend/app/services/redis_client.py
deleted file mode 100644
index d2fb922..0000000
--- a/Backend/app/services/redis_client.py
+++ /dev/null
@@ -1,7 +0,0 @@
-import redis.asyncio as redis
-
-redis_client = redis.Redis(host="localhost", port=6379, decode_responses=True)
-
-
-async def get_redis():
- return redis_client
diff --git a/Backend/docker-compose.yml b/Backend/docker-compose.yml
deleted file mode 100644
index aa1451b..0000000
--- a/Backend/docker-compose.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-services:
- redis:
- image: redis:latest
- container_name: redis
- ports:
- - "6379:6379"
- volumes:
- - redis_data:/data
- restart: unless-stopped
- command: redis-server --appendonly yes
-
-volumes:
- redis_data:
diff --git a/Backend/requirements.txt b/Backend/requirements.txt
deleted file mode 100644
index ea1ab73..0000000
--- a/Backend/requirements.txt
+++ /dev/null
@@ -1,55 +0,0 @@
-aiohappyeyeballs==2.6.1
-aiohttp==3.11.12
-aiosignal==1.3.2
-alembic==1.15.2
-annotated-types==0.7.0
-anyio==4.9.0
-asyncpg==0.30.0
-attrs==25.3.0
-certifi==2025.1.31
-charset-normalizer==3.4.1
-click==8.1.8
-deprecation==2.1.0
-fastapi==0.115.12
-frozenlist==1.5.0
-gotrue==2.12.0
-greenlet==3.1.1
-h11==0.14.0
-h2==4.2.0
-hpack==4.1.0
-httpcore==1.0.7
-httpx==0.28.1
-hyperframe==6.1.0
-idna==3.10
-iniconfig==2.1.0
-Mako==1.3.9
-MarkupSafe==3.0.2
-multidict==6.3.0
-packaging==24.2
-pluggy==1.5.0
-postgrest==1.0.1
-propcache==0.3.1
-pydantic==2.11.1
-pydantic_core==2.33.0
-PyJWT==2.10.1
-pytest==8.3.5
-pytest-mock==3.14.0
-python-dateutil==2.9.0.post0
-python-dotenv==1.1.0
-realtime==2.4.0
-redis==5.2.1
-requests==2.32.3
-six==1.17.0
-sniffio==1.3.1
-SQLAlchemy==2.0.40
-starlette==0.46.1
-storage3==0.11.3
-StrEnum==0.4.15
-supabase==2.15.0
-supafunc==0.9.4
-typing-inspection==0.4.0
-typing_extensions==4.13.0
-urllib3==2.3.0
-uvicorn==0.34.0
-websockets==14.2
-yarl==1.18.3
diff --git a/Backend/sql.txt b/Backend/sql.txt
deleted file mode 100644
index 3ee28b5..0000000
--- a/Backend/sql.txt
+++ /dev/null
@@ -1,41 +0,0 @@
--- Insert into users table
-INSERT INTO users (id, username, email, role, profile_image, bio, created_at) VALUES
- (gen_random_uuid(), 'creator1', 'creator1@example.com', 'creator', 'image1.jpg', 'Bio of creator1', NOW()),
- (gen_random_uuid(), 'brand1', 'brand1@example.com', 'brand', 'image2.jpg', 'Bio of brand1', NOW()),
- (gen_random_uuid(), 'creator2', 'creator2@example.com', 'creator', 'image3.jpg', 'Bio of creator2', NOW());
-
--- Insert into audience_insights table
-INSERT INTO audience_insights (id, user_id, audience_age_group, audience_location, engagement_rate, average_views, time_of_attention, price_expectation, created_at) VALUES
- (gen_random_uuid(), (SELECT id FROM users WHERE username = 'creator1'), '{"18-24": 70, "25-34": 30}', '{"USA": 50, "UK": 50}', 4.5, 10000, 120, 500.00, NOW()),
- (gen_random_uuid(), (SELECT id FROM users WHERE username = 'creator2'), '{"18-24": 60, "25-34": 40}', '{"India": 70, "Canada": 30}', 3.8, 8000, 100, 450.00, NOW()),
- (gen_random_uuid(), (SELECT id FROM users WHERE username = 'brand1'), '{"18-24": 50, "25-34": 50}', '{"Germany": 60, "France": 40}', 4.2, 9000, 110, 480.00, NOW());
-
--- Insert into sponsorships table
-INSERT INTO sponsorships (id, brand_id, title, description, required_audience, budget, engagement_minimum, status, created_at) VALUES
- (gen_random_uuid(), (SELECT id FROM users WHERE username = 'brand1'), 'Tech Sponsorship', 'Sponsorship for tech influencers', '{"age": ["18-24"], "location": ["USA", "UK"]}', 5000.00, 4.0, 'open', NOW()),
- (gen_random_uuid(), (SELECT id FROM users WHERE username = 'brand1'), 'Fashion Sponsorship', 'Sponsorship for fashion bloggers', '{"age": ["18-34"], "location": ["India"]}', 3000.00, 3.5, 'open', NOW()),
- (gen_random_uuid(), (SELECT id FROM users WHERE username = 'brand1'), 'Gaming Sponsorship', 'Sponsorship for gaming content creators', '{"age": ["18-30"], "location": ["Germany"]}', 4000.00, 4.2, 'open', NOW());
-
--- Insert into user_posts table
-INSERT INTO user_posts (id, user_id, title, content, post_url, category, engagement_metrics, created_at) VALUES
- (gen_random_uuid(), (SELECT id FROM users WHERE username = 'creator1'), 'Tech Review', 'A review of the latest smartphone.', 'https://example.com/post1', 'Tech', '{"likes": 500, "comments": 100, "shares": 50}', NOW()),
- (gen_random_uuid(), (SELECT id FROM users WHERE username = 'creator2'), 'Fashion Trends', 'Exploring the latest fashion trends.', 'https://example.com/post2', 'Fashion', '{"likes": 300, "comments": 50, "shares": 20}', NOW()),
- (gen_random_uuid(), (SELECT id FROM users WHERE username = 'creator1'), 'Gaming Setup', 'A detailed guide on the best gaming setup.', 'https://example.com/post3', 'Gaming', '{"likes": 400, "comments": 80, "shares": 40}', NOW());
-
--- Insert into sponsorship_applications table
-INSERT INTO sponsorship_applications (id, creator_id, sponsorship_id, post_id, proposal, status, applied_at) VALUES
- (gen_random_uuid(), (SELECT id FROM users WHERE username = 'creator1'), (SELECT id FROM sponsorships WHERE title = 'Tech Sponsorship'), (SELECT id FROM user_posts WHERE title = 'Tech Review'), 'I am interested in this sponsorship', 'pending', NOW()),
- (gen_random_uuid(), (SELECT id FROM users WHERE username = 'creator2'), (SELECT id FROM sponsorships WHERE title = 'Fashion Sponsorship'), (SELECT id FROM user_posts WHERE title = 'Fashion Trends'), 'I can provide quality content', 'pending', NOW()),
- (gen_random_uuid(), (SELECT id FROM users WHERE username = 'creator1'), (SELECT id FROM sponsorships WHERE title = 'Gaming Sponsorship'), (SELECT id FROM user_posts WHERE title = 'Gaming Setup'), 'I am a perfect fit for this campaign', 'pending', NOW());
-
--- Insert into collaborations table
-INSERT INTO collaborations (id, creator_1_id, creator_2_id, collaboration_details, status, created_at) VALUES
- (gen_random_uuid(), (SELECT id FROM users WHERE username = 'creator1'), (SELECT id FROM users WHERE username = 'creator2'), 'Collaboration on tech and fashion', 'pending', NOW()),
- (gen_random_uuid(), (SELECT id FROM users WHERE username = 'creator2'), (SELECT id FROM users WHERE username = 'creator1'), 'Gaming and tech collaboration', 'pending', NOW()),
- (gen_random_uuid(), (SELECT id FROM users WHERE username = 'creator1'), (SELECT id FROM users WHERE username = 'brand1'), 'Brand deal collaboration', 'pending', NOW());
-
--- Insert into sponsorship_payments table
-INSERT INTO sponsorship_payments (id, creator_id, brand_id, sponsorship_id, amount, status, transaction_date) VALUES
- (gen_random_uuid(), (SELECT id FROM users WHERE username = 'creator1'), (SELECT id FROM users WHERE username = 'brand1'), (SELECT id FROM sponsorships WHERE title = 'Tech Sponsorship'), 500.00, 'completed', NOW()),
- (gen_random_uuid(), (SELECT id FROM users WHERE username = 'creator2'), (SELECT id FROM users WHERE username = 'brand1'), (SELECT id FROM sponsorships WHERE title = 'Fashion Sponsorship'), 300.00, 'completed', NOW()),
- (gen_random_uuid(), (SELECT id FROM users WHERE username = 'creator1'), (SELECT id FROM users WHERE username = 'brand1'), (SELECT id FROM sponsorships WHERE title = 'Gaming Sponsorship'), 400.00, 'pending', NOW());
diff --git a/Frontend/.gitignore b/Frontend/.gitignore
deleted file mode 100644
index 6450872..0000000
--- a/Frontend/.gitignore
+++ /dev/null
@@ -1,26 +0,0 @@
-.env*
-
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-pnpm-debug.log*
-lerna-debug.log*
-
-node_modules
-dist
-dist-ssr
-*.local
-
-# Editor directories and files
-.vscode/*
-!.vscode/extensions.json
-.idea
-.DS_Store
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?
diff --git a/Frontend/.npmrc b/Frontend/.npmrc
deleted file mode 100644
index e9ee3cb..0000000
--- a/Frontend/.npmrc
+++ /dev/null
@@ -1 +0,0 @@
-legacy-peer-deps=true
\ No newline at end of file
diff --git a/Frontend/README.md b/Frontend/README.md
deleted file mode 100644
index 40ede56..0000000
--- a/Frontend/README.md
+++ /dev/null
@@ -1,54 +0,0 @@
-# React + TypeScript + Vite
-
-This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
-
-Currently, two official plugins are available:
-
-- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
-- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
-
-## Expanding the ESLint configuration
-
-If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
-
-```js
-export default tseslint.config({
- extends: [
- // Remove ...tseslint.configs.recommended and replace with this
- ...tseslint.configs.recommendedTypeChecked,
- // Alternatively, use this for stricter rules
- ...tseslint.configs.strictTypeChecked,
- // Optionally, add this for stylistic rules
- ...tseslint.configs.stylisticTypeChecked,
- ],
- languageOptions: {
- // other options...
- parserOptions: {
- project: ['./tsconfig.node.json', './tsconfig.app.json'],
- tsconfigRootDir: import.meta.dirname,
- },
- },
-})
-```
-
-You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
-
-```js
-// eslint.config.js
-import reactX from 'eslint-plugin-react-x'
-import reactDom from 'eslint-plugin-react-dom'
-
-export default tseslint.config({
- plugins: {
- // Add the react-x and react-dom plugins
- 'react-x': reactX,
- 'react-dom': reactDom,
- },
- rules: {
- // other rules...
- // Enable its recommended typescript rules
- ...reactX.configs['recommended-typescript'].rules,
- ...reactDom.configs.recommended.rules,
- },
-})
-```
diff --git a/Frontend/components.json b/Frontend/components.json
deleted file mode 100644
index 73afbdb..0000000
--- a/Frontend/components.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "$schema": "https://ui.shadcn.com/schema.json",
- "style": "new-york",
- "rsc": false,
- "tsx": true,
- "tailwind": {
- "config": "",
- "css": "src/index.css",
- "baseColor": "neutral",
- "cssVariables": true,
- "prefix": ""
- },
- "aliases": {
- "components": "@/components",
- "utils": "@/lib/utils",
- "ui": "@/components/ui",
- "lib": "@/lib",
- "hooks": "@/hooks"
- },
- "iconLibrary": "lucide"
-}
\ No newline at end of file
diff --git a/Frontend/env-example b/Frontend/env-example
deleted file mode 100644
index 4ce57da..0000000
--- a/Frontend/env-example
+++ /dev/null
@@ -1,3 +0,0 @@
-VITE_SUPABASE_URL=https://your-project.supabase.co
-VITE_SUPABASE_ANON_KEY=your-anon-key-here
-VITE_YOUTUBE_API_KEY=your-youtube-api-key-here
\ No newline at end of file
diff --git a/Frontend/eslint.config.js b/Frontend/eslint.config.js
deleted file mode 100644
index 0bbf074..0000000
--- a/Frontend/eslint.config.js
+++ /dev/null
@@ -1,28 +0,0 @@
-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/Frontend/index.html b/Frontend/index.html
deleted file mode 100644
index 304e2d9..0000000
--- a/Frontend/index.html
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
- Inpact - AI-Powered Creator Collaboration Platform
-
-
-
-
-
-
diff --git a/Frontend/package-lock.json b/Frontend/package-lock.json
deleted file mode 100644
index deae757..0000000
--- a/Frontend/package-lock.json
+++ /dev/null
@@ -1,6241 +0,0 @@
-{
- "name": "frontend",
- "version": "0.0.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "frontend",
- "version": "0.0.0",
- "dependencies": {
- "@radix-ui/react-avatar": "^1.1.3",
- "@radix-ui/react-dialog": "^1.1.6",
- "@radix-ui/react-dropdown-menu": "^2.1.6",
- "@radix-ui/react-label": "^2.1.2",
- "@radix-ui/react-popover": "^1.1.6",
- "@radix-ui/react-scroll-area": "^1.2.3",
- "@radix-ui/react-select": "^2.1.6",
- "@radix-ui/react-separator": "^1.1.2",
- "@radix-ui/react-slider": "^1.2.3",
- "@radix-ui/react-slot": "^1.1.2",
- "@radix-ui/react-switch": "^1.1.3",
- "@radix-ui/react-tabs": "^1.1.3",
- "@reduxjs/toolkit": "^2.6.1",
- "@supabase/supabase-js": "^2.49.4",
- "@tailwindcss/vite": "^4.0.16",
- "axios": "^1.8.4",
- "class-variance-authority": "^0.7.1",
- "clsx": "^2.1.1",
- "date-fns": "^4.1.0",
- "dotenv": "^16.4.7",
- "framer-motion": "^12.5.0",
- "lucide-react": "^0.477.0",
- "react": "^19.0.0",
- "react-day-picker": "^8.10.1",
- "react-dom": "^19.0.0",
- "react-redux": "^9.2.0",
- "react-router-dom": "^7.2.0",
- "recharts": "^2.15.1",
- "tailwind-merge": "^3.0.2",
- "tailwindcss": "^4.0.16",
- "tw-animate-css": "^1.2.4"
- },
- "devDependencies": {
- "@eslint/js": "^9.21.0",
- "@types/node": "^22.13.13",
- "@types/react": "^19.0.10",
- "@types/react-dom": "^19.0.4",
- "@vitejs/plugin-react": "^4.3.4",
- "eslint": "^9.21.0",
- "eslint-plugin-react-hooks": "^5.1.0",
- "eslint-plugin-react-refresh": "^0.4.19",
- "globals": "^15.15.0",
- "typescript": "~5.7.2",
- "typescript-eslint": "^8.24.1",
- "vite": "^6.2.0"
- }
- },
- "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.26.2",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
- "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.25.9",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/compat-data": {
- "version": "7.26.8",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz",
- "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/core": {
- "version": "7.26.10",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz",
- "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.26.2",
- "@babel/generator": "^7.26.10",
- "@babel/helper-compilation-targets": "^7.26.5",
- "@babel/helper-module-transforms": "^7.26.0",
- "@babel/helpers": "^7.26.10",
- "@babel/parser": "^7.26.10",
- "@babel/template": "^7.26.9",
- "@babel/traverse": "^7.26.10",
- "@babel/types": "^7.26.10",
- "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.27.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz",
- "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.27.0",
- "@babel/types": "^7.27.0",
- "@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.27.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz",
- "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.26.8",
- "@babel/helper-validator-option": "^7.25.9",
- "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.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
- "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.25.9",
- "@babel/types": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
- "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.25.9",
- "@babel/helper-validator-identifier": "^7.25.9",
- "@babel/traverse": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-plugin-utils": {
- "version": "7.26.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
- "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-string-parser": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
- "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
- "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-option": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
- "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helpers": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz",
- "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/template": "^7.27.0",
- "@babel/types": "^7.27.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz",
- "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.27.0"
- },
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-self": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz",
- "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-source": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz",
- "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/runtime": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz",
- "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
- "license": "MIT",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/template": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz",
- "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.26.2",
- "@babel/parser": "^7.27.0",
- "@babel/types": "^7.27.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz",
- "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.26.2",
- "@babel/generator": "^7.27.0",
- "@babel/parser": "^7.27.0",
- "@babel/template": "^7.27.0",
- "@babel/types": "^7.27.0",
- "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.27.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz",
- "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-string-parser": "^7.25.9",
- "@babel/helper-validator-identifier": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz",
- "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz",
- "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz",
- "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-x64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz",
- "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz",
- "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz",
- "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz",
- "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz",
- "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz",
- "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz",
- "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz",
- "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz",
- "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz",
- "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==",
- "cpu": [
- "mips64el"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz",
- "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz",
- "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz",
- "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-x64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz",
- "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-arm64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz",
- "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz",
- "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-arm64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz",
- "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz",
- "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz",
- "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz",
- "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz",
- "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz",
- "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@eslint-community/eslint-utils": {
- "version": "4.5.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz",
- "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
- }
- },
- "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint-community/regexpp": {
- "version": "4.12.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
- "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
- }
- },
- "node_modules/@eslint/config-array": {
- "version": "0.19.2",
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz",
- "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/object-schema": "^2.1.6",
- "debug": "^4.3.1",
- "minimatch": "^3.1.2"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/config-helpers": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.0.tgz",
- "integrity": "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/core": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz",
- "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/eslintrc": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
- "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^10.0.1",
- "globals": "^14.0.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint/eslintrc/node_modules/globals": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
- "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@eslint/js": {
- "version": "9.23.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz",
- "integrity": "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/object-schema": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
- "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/plugin-kit": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz",
- "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/core": "^0.12.0",
- "levn": "^0.4.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@floating-ui/core": {
- "version": "1.6.9",
- "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz",
- "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/utils": "^0.2.9"
- }
- },
- "node_modules/@floating-ui/dom": {
- "version": "1.6.13",
- "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz",
- "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/core": "^1.6.0",
- "@floating-ui/utils": "^0.2.9"
- }
- },
- "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.9",
- "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz",
- "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==",
- "license": "MIT"
- },
- "node_modules/@humanfs/core": {
- "version": "0.19.1",
- "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
- "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanfs/node": {
- "version": "0.16.6",
- "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
- "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@humanfs/core": "^0.19.1",
- "@humanwhocodes/retry": "^0.3.0"
- },
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
- "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=12.22"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/retry": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz",
- "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
- "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
- "dev": true,
- "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==",
- "dev": true,
- "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==",
- "dev": true,
- "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==",
- "dev": true,
- "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==",
- "dev": true,
- "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==",
- "dev": true,
- "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==",
- "dev": true,
- "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==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@radix-ui/number": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz",
- "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==",
- "license": "MIT"
- },
- "node_modules/@radix-ui/primitive": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.1.tgz",
- "integrity": "sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==",
- "license": "MIT"
- },
- "node_modules/@radix-ui/react-arrow": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.2.tgz",
- "integrity": "sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-primitive": "2.0.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-avatar": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.3.tgz",
- "integrity": "sha512-Paen00T4P8L8gd9bNsRMw7Cbaz85oxiv+hzomsRZgFm2byltPFDtfcoqlWJ8GyZlIBWgLssJlzLCnKU0G0302g==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-use-callback-ref": "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-collection": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.2.tgz",
- "integrity": "sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-slot": "1.1.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-compose-refs": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz",
- "integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==",
- "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.13",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.13.tgz",
- "integrity": "sha512-ARFmqUyhIVS3+riWzwGTe7JLjqwqgnODBUZdqpWar/z1WFs9z76fuOs/2BOWCR+YboRn4/WN9aoaGVwqNRr8VA==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.2",
- "@radix-ui/react-compose-refs": "1.1.2",
- "@radix-ui/react-context": "1.1.2",
- "@radix-ui/react-dismissable-layer": "1.1.9",
- "@radix-ui/react-focus-guards": "1.1.2",
- "@radix-ui/react-focus-scope": "1.1.6",
- "@radix-ui/react-id": "1.1.1",
- "@radix-ui/react-portal": "1.1.8",
- "@radix-ui/react-presence": "1.1.4",
- "@radix-ui/react-primitive": "2.1.2",
- "@radix-ui/react-slot": "1.2.2",
- "@radix-ui/react-use-controllable-state": "1.2.2",
- "aria-hidden": "^1.2.4",
- "react-remove-scroll": "^2.6.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz",
- "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==",
- "license": "MIT"
- },
- "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
- "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz",
- "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.9.tgz",
- "integrity": "sha512-way197PiTvNp+WBP7svMJasHl+vibhWGQDb6Mgf5mhEWJkgb85z7Lfl9TUdkqpWsf8GRNmoopx9ZxCyDzmgRMQ==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.2",
- "@radix-ui/react-compose-refs": "1.1.2",
- "@radix-ui/react-primitive": "2.1.2",
- "@radix-ui/react-use-callback-ref": "1.1.1",
- "@radix-ui/react-use-escape-keydown": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-guards": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz",
- "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-focus-scope": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.6.tgz",
- "integrity": "sha512-r9zpYNUQY+2jWHWZGyddQLL9YHkM/XvSFHVcWs7bdVuxMAnCwTAuy6Pf47Z4nw7dYcUou1vg/VgjjrrH03VeBw==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.2",
- "@radix-ui/react-primitive": "2.1.2",
- "@radix-ui/react-use-callback-ref": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz",
- "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-use-layout-effect": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.8.tgz",
- "integrity": "sha512-hQsTUIn7p7fxCPvao/q6wpbxmCwgLrlz+nOrJgC+RwfZqWY/WN+UMqkXzrtKbPrF82P43eCTl3ekeKuyAQbFeg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-primitive": "2.1.2",
- "@radix-ui/react-use-layout-effect": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz",
- "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.2",
- "@radix-ui/react-use-layout-effect": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.2.tgz",
- "integrity": "sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-slot": "1.2.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.2.tgz",
- "integrity": "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-callback-ref": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
- "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz",
- "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-use-effect-event": "0.0.2",
- "@radix-ui/react-use-layout-effect": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-escape-keydown": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz",
- "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-use-callback-ref": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-layout-effect": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
- "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-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.5",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.5.tgz",
- "integrity": "sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-primitive": "2.0.2",
- "@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.6",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.6.tgz",
- "integrity": "sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-id": "1.1.0",
- "@radix-ui/react-menu": "2.1.6",
- "@radix-ui/react-primitive": "2.0.2",
- "@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.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.2.tgz",
- "integrity": "sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-primitive": "2.0.2",
- "@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-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.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.2.tgz",
- "integrity": "sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-primitive": "2.0.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-menu": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.6.tgz",
- "integrity": "sha512-tBBb5CXDJW3t2mo9WlO7r6GTmWV0F0uzHZVFmlRmYpiSK1CDU5IKojP1pm7oknpBOrFZx/YgBRW9oorPO2S/Lg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-collection": "1.1.2",
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-direction": "1.1.0",
- "@radix-ui/react-dismissable-layer": "1.1.5",
- "@radix-ui/react-focus-guards": "1.1.1",
- "@radix-ui/react-focus-scope": "1.1.2",
- "@radix-ui/react-id": "1.1.0",
- "@radix-ui/react-popper": "1.2.2",
- "@radix-ui/react-portal": "1.1.4",
- "@radix-ui/react-presence": "1.1.2",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-roving-focus": "1.1.2",
- "@radix-ui/react-slot": "1.1.2",
- "@radix-ui/react-use-callback-ref": "1.1.0",
- "aria-hidden": "^1.2.4",
- "react-remove-scroll": "^2.6.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-popover": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.6.tgz",
- "integrity": "sha512-NQouW0x4/GnkFJ/pRqsIS3rM/k97VzKnVb2jB7Gq7VEGPy5g7uNV1ykySFt7eWSp3i2uSGFwaJcvIRJBAHmmFg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-dismissable-layer": "1.1.5",
- "@radix-ui/react-focus-guards": "1.1.1",
- "@radix-ui/react-focus-scope": "1.1.2",
- "@radix-ui/react-id": "1.1.0",
- "@radix-ui/react-popper": "1.2.2",
- "@radix-ui/react-portal": "1.1.4",
- "@radix-ui/react-presence": "1.1.2",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-slot": "1.1.2",
- "@radix-ui/react-use-controllable-state": "1.1.0",
- "aria-hidden": "^1.2.4",
- "react-remove-scroll": "^2.6.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-popper": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.2.tgz",
- "integrity": "sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/react-dom": "^2.0.0",
- "@radix-ui/react-arrow": "1.1.2",
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-primitive": "2.0.2",
- "@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-portal": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.4.tgz",
- "integrity": "sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-primitive": "2.0.2",
- "@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.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.2.tgz",
- "integrity": "sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.1",
- "@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.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.2.tgz",
- "integrity": "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-slot": "1.1.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-roving-focus": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.2.tgz",
- "integrity": "sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-collection": "1.1.2",
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-direction": "1.1.0",
- "@radix-ui/react-id": "1.1.0",
- "@radix-ui/react-primitive": "2.0.2",
- "@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-scroll-area": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.3.tgz",
- "integrity": "sha512-l7+NNBfBYYJa9tNqVcP2AGvxdE3lmE6kFTBXdvHgUaZuy+4wGCL1Cl2AfaR7RKyimj7lZURGLwFO59k4eBnDJQ==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/number": "1.1.0",
- "@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-direction": "1.1.0",
- "@radix-ui/react-presence": "1.1.2",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-use-callback-ref": "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-select": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.6.tgz",
- "integrity": "sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/number": "1.1.0",
- "@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-collection": "1.1.2",
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-direction": "1.1.0",
- "@radix-ui/react-dismissable-layer": "1.1.5",
- "@radix-ui/react-focus-guards": "1.1.1",
- "@radix-ui/react-focus-scope": "1.1.2",
- "@radix-ui/react-id": "1.1.0",
- "@radix-ui/react-popper": "1.2.2",
- "@radix-ui/react-portal": "1.1.4",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-slot": "1.1.2",
- "@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-use-previous": "1.1.0",
- "@radix-ui/react-visually-hidden": "1.1.2",
- "aria-hidden": "^1.2.4",
- "react-remove-scroll": "^2.6.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-separator": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.2.tgz",
- "integrity": "sha512-oZfHcaAp2Y6KFBX6I5P1u7CQoy4lheCGiYj+pGFrHy8E/VNRb5E39TkTr3JrV520csPBTZjkuKFdEsjS5EUNKQ==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-primitive": "2.0.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-slider": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.2.3.tgz",
- "integrity": "sha512-nNrLAWLjGESnhqBqcCNW4w2nn7LxudyMzeB6VgdyAnFLC6kfQgnAjSL2v6UkQTnDctJBlxrmxfplWS4iYjdUTw==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/number": "1.1.0",
- "@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-collection": "1.1.2",
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-direction": "1.1.0",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-use-controllable-state": "1.1.0",
- "@radix-ui/react-use-layout-effect": "1.1.0",
- "@radix-ui/react-use-previous": "1.1.0",
- "@radix-ui/react-use-size": "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-slot": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz",
- "integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-switch": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.3.tgz",
- "integrity": "sha512-1nc+vjEOQkJVsJtWPSiISGT6OKm4SiOdjMo+/icLxo2G4vxz1GntC5MzfL4v8ey9OEfw787QCD1y3mUv0NiFEQ==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-compose-refs": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-use-controllable-state": "1.1.0",
- "@radix-ui/react-use-previous": "1.1.0",
- "@radix-ui/react-use-size": "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-tabs": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.3.tgz",
- "integrity": "sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.1",
- "@radix-ui/react-context": "1.1.1",
- "@radix-ui/react-direction": "1.1.0",
- "@radix-ui/react-id": "1.1.0",
- "@radix-ui/react-presence": "1.1.2",
- "@radix-ui/react-primitive": "2.0.2",
- "@radix-ui/react-roving-focus": "1.1.2",
- "@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-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-effect-event": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz",
- "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-use-layout-effect": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-use-effect-event/node_modules/@radix-ui/react-use-layout-effect": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
- "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-use-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-previous": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz",
- "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==",
- "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.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.2.tgz",
- "integrity": "sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-primitive": "2.0.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/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/@reduxjs/toolkit": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.8.0.tgz",
- "integrity": "sha512-7OAPcjqZwxzTV9UQ5l6hKQ9ap9GV1xJi6mh6hzDm+qvEjZ4hRdWMBx9b5oE8k1X9PQY8aE/Zf0WBKAYw0digXg==",
- "license": "MIT",
- "dependencies": {
- "@standard-schema/spec": "^1.0.0",
- "@standard-schema/utils": "^0.3.0",
- "immer": "^10.0.3",
- "redux": "^5.0.1",
- "redux-thunk": "^3.1.0",
- "reselect": "^5.1.0"
- },
- "peerDependencies": {
- "react": "^16.9.0 || ^17.0.0 || ^18 || ^19",
- "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0"
- },
- "peerDependenciesMeta": {
- "react": {
- "optional": true
- },
- "react-redux": {
- "optional": true
- }
- }
- },
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.37.0.tgz",
- "integrity": "sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.37.0.tgz",
- "integrity": "sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.37.0.tgz",
- "integrity": "sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.37.0.tgz",
- "integrity": "sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.37.0.tgz",
- "integrity": "sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.37.0.tgz",
- "integrity": "sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.37.0.tgz",
- "integrity": "sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.37.0.tgz",
- "integrity": "sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.37.0.tgz",
- "integrity": "sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.37.0.tgz",
- "integrity": "sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.37.0.tgz",
- "integrity": "sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.37.0.tgz",
- "integrity": "sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.37.0.tgz",
- "integrity": "sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.37.0.tgz",
- "integrity": "sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.37.0.tgz",
- "integrity": "sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.37.0.tgz",
- "integrity": "sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.37.0.tgz",
- "integrity": "sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.37.0.tgz",
- "integrity": "sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.37.0.tgz",
- "integrity": "sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.37.0.tgz",
- "integrity": "sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@standard-schema/spec": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz",
- "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==",
- "license": "MIT"
- },
- "node_modules/@standard-schema/utils": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz",
- "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==",
- "license": "MIT"
- },
- "node_modules/@supabase/auth-js": {
- "version": "2.69.1",
- "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.69.1.tgz",
- "integrity": "sha512-FILtt5WjCNzmReeRLq5wRs3iShwmnWgBvxHfqapC/VoljJl+W8hDAyFmf1NVw3zH+ZjZ05AKxiKxVeb0HNWRMQ==",
- "license": "MIT",
- "dependencies": {
- "@supabase/node-fetch": "^2.6.14"
- }
- },
- "node_modules/@supabase/functions-js": {
- "version": "2.4.4",
- "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.4.4.tgz",
- "integrity": "sha512-WL2p6r4AXNGwop7iwvul2BvOtuJ1YQy8EbOd0dhG1oN1q8el/BIRSFCFnWAMM/vJJlHWLi4ad22sKbKr9mvjoA==",
- "license": "MIT",
- "dependencies": {
- "@supabase/node-fetch": "^2.6.14"
- }
- },
- "node_modules/@supabase/node-fetch": {
- "version": "2.6.15",
- "resolved": "https://registry.npmjs.org/@supabase/node-fetch/-/node-fetch-2.6.15.tgz",
- "integrity": "sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==",
- "license": "MIT",
- "dependencies": {
- "whatwg-url": "^5.0.0"
- },
- "engines": {
- "node": "4.x || >=6.0.0"
- }
- },
- "node_modules/@supabase/postgrest-js": {
- "version": "1.19.4",
- "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.19.4.tgz",
- "integrity": "sha512-O4soKqKtZIW3olqmbXXbKugUtByD2jPa8kL2m2c1oozAO11uCcGrRhkZL0kVxjBLrXHE0mdSkFsMj7jDSfyNpw==",
- "license": "MIT",
- "dependencies": {
- "@supabase/node-fetch": "^2.6.14"
- }
- },
- "node_modules/@supabase/realtime-js": {
- "version": "2.11.2",
- "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.11.2.tgz",
- "integrity": "sha512-u/XeuL2Y0QEhXSoIPZZwR6wMXgB+RQbJzG9VErA3VghVt7uRfSVsjeqd7m5GhX3JR6dM/WRmLbVR8URpDWG4+w==",
- "license": "MIT",
- "dependencies": {
- "@supabase/node-fetch": "^2.6.14",
- "@types/phoenix": "^1.5.4",
- "@types/ws": "^8.5.10",
- "ws": "^8.18.0"
- }
- },
- "node_modules/@supabase/storage-js": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.7.1.tgz",
- "integrity": "sha512-asYHcyDR1fKqrMpytAS1zjyEfvxuOIp1CIXX7ji4lHHcJKqyk+sLl/Vxgm4sN6u8zvuUtae9e4kDxQP2qrwWBA==",
- "license": "MIT",
- "dependencies": {
- "@supabase/node-fetch": "^2.6.14"
- }
- },
- "node_modules/@supabase/supabase-js": {
- "version": "2.49.4",
- "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.49.4.tgz",
- "integrity": "sha512-jUF0uRUmS8BKt37t01qaZ88H9yV1mbGYnqLeuFWLcdV+x1P4fl0yP9DGtaEhFPZcwSom7u16GkLEH9QJZOqOkw==",
- "license": "MIT",
- "dependencies": {
- "@supabase/auth-js": "2.69.1",
- "@supabase/functions-js": "2.4.4",
- "@supabase/node-fetch": "2.6.15",
- "@supabase/postgrest-js": "1.19.4",
- "@supabase/realtime-js": "2.11.2",
- "@supabase/storage-js": "2.7.1"
- }
- },
- "node_modules/@tailwindcss/node": {
- "version": "4.0.16",
- "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.16.tgz",
- "integrity": "sha512-T6IK79hoCFScxD5tRxWMtwqwSs4sT81Vw+YbzL7RZD0/Ndm4y5kboV7LdQ97YGH6udoOZyVT/uEfrnU2L5Nkog==",
- "license": "MIT",
- "dependencies": {
- "enhanced-resolve": "^5.18.1",
- "jiti": "^2.4.2",
- "tailwindcss": "4.0.16"
- }
- },
- "node_modules/@tailwindcss/oxide": {
- "version": "4.0.16",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.16.tgz",
- "integrity": "sha512-n++F8Rzvo/e+FYxikZgKW4sCRXneSstLhTI91Ay9toeRcE/+WO33SQWzGtgmjWJcTupXZreskJ8FCr9b+kdXew==",
- "license": "MIT",
- "engines": {
- "node": ">= 10"
- },
- "optionalDependencies": {
- "@tailwindcss/oxide-android-arm64": "4.0.16",
- "@tailwindcss/oxide-darwin-arm64": "4.0.16",
- "@tailwindcss/oxide-darwin-x64": "4.0.16",
- "@tailwindcss/oxide-freebsd-x64": "4.0.16",
- "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.16",
- "@tailwindcss/oxide-linux-arm64-gnu": "4.0.16",
- "@tailwindcss/oxide-linux-arm64-musl": "4.0.16",
- "@tailwindcss/oxide-linux-x64-gnu": "4.0.16",
- "@tailwindcss/oxide-linux-x64-musl": "4.0.16",
- "@tailwindcss/oxide-win32-arm64-msvc": "4.0.16",
- "@tailwindcss/oxide-win32-x64-msvc": "4.0.16"
- }
- },
- "node_modules/@tailwindcss/oxide-android-arm64": {
- "version": "4.0.16",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.16.tgz",
- "integrity": "sha512-mieEZrNLHatpQu6ad0pWBnL8ObUE9ZSe4eoX6GKTqsKv98AxNw5lUa5nJM0FgD8rYJeZ2dPtHNN/YM2xY9R+9g==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@tailwindcss/oxide-darwin-arm64": {
- "version": "4.0.16",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.16.tgz",
- "integrity": "sha512-pfilSvgrX5UDdjh09gGVMhAPfZVucm4AnwFBkwBe6WFl7gzMAZ92/35GC0yMDeS+W+RNSXclXJz+HamF1iS/aA==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@tailwindcss/oxide-darwin-x64": {
- "version": "4.0.16",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.16.tgz",
- "integrity": "sha512-Z3lJY3yUjlHbzgXwWH9Y6IGeSGXfwjbXuvTPolyJUGMZl2ZaHdQMPOZ8dMll1knSLjctOif+QijMab0+GSXYLQ==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@tailwindcss/oxide-freebsd-x64": {
- "version": "4.0.16",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.16.tgz",
- "integrity": "sha512-dv2U8Yc7vKIDyiJkUouhjsl+dTfRImNyZRCTFsHvvrhJvenYZBRtE/wDSYlZHR0lWKhIocxk1ScAkAcMR3F3QQ==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
- "version": "4.0.16",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.16.tgz",
- "integrity": "sha512-XBRXyUUyjMg5UMiyuQxJqWSs27w0V49g1iPuhrFakmu1/idDSly59XYteRrI2onoS9AzmMwfyzdiQSJXM89+PQ==",
- "cpu": [
- "arm"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
- "version": "4.0.16",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.16.tgz",
- "integrity": "sha512-+bL1zkU8MDzv389OqyI0SJbrG9kGsdxf+k2ZAILlw1TPWg5oeMkwoqgaQRqGwpOHz0pycT94qIgWVNJavAz+Iw==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
- "version": "4.0.16",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.16.tgz",
- "integrity": "sha512-Uqfnyx9oFxoX+/iy9pIDTADHLLNwuZNB8QSp+BwKAhtHjBTTYmDAdxKy3u8lJZve1aOd+S145eWpn3tT08cm4w==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
- "version": "4.0.16",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.16.tgz",
- "integrity": "sha512-v0Hx0KD94F6FG0IW3AJyCzQepSv/47xhShCgiWJ2TNVu406VtREkGpJtxS0Gu1ecSXhgn/36LToU5kivAuQiPg==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-x64-musl": {
- "version": "4.0.16",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.16.tgz",
- "integrity": "sha512-CjV6hhQAVNYw6W2EXp1ZVL81CTSBEh6nTmS5EZq5rdEhqOx8G8YQtFKjcCJiojsS+vMXt9r87gGoORJcHOA0lg==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
- "version": "4.0.16",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.16.tgz",
- "integrity": "sha512-Pj9eaAtXYH7NrvVx8Jx0U/sEaNpcIbb8d+2WnC8a+xL0LfIXWsu4AyeRUeTeb8Ty4fTGhKSJTohdXj1iSdN9WQ==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
- "version": "4.0.16",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.16.tgz",
- "integrity": "sha512-M35hoFrhJe+1QdSiZpn85y8K7tfEVw6lswv3TjIfJ44JiPjPzZ4URg+rsTjTq0kue6NjNCbbY99AsRSSpJZxOw==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@tailwindcss/vite": {
- "version": "4.0.16",
- "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.16.tgz",
- "integrity": "sha512-6mZVWhAyjVNMMRw0Pvv2RZfTttjsAClU8HouLNZbeLbX0yURMa0UYEY/qS4dB1tZlRpiDBnCLsGsWbxEyIjW6A==",
- "license": "MIT",
- "dependencies": {
- "@tailwindcss/node": "4.0.16",
- "@tailwindcss/oxide": "4.0.16",
- "lightningcss": "1.29.2",
- "tailwindcss": "4.0.16"
- },
- "peerDependencies": {
- "vite": "^5.2.0 || ^6"
- }
- },
- "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/cookie": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
- "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==",
- "license": "MIT"
- },
- "node_modules/@types/d3-array": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz",
- "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==",
- "license": "MIT"
- },
- "node_modules/@types/d3-color": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
- "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",
- "license": "MIT"
- },
- "node_modules/@types/d3-ease": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
- "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",
- "license": "MIT"
- },
- "node_modules/@types/d3-interpolate": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
- "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
- "license": "MIT",
- "dependencies": {
- "@types/d3-color": "*"
- }
- },
- "node_modules/@types/d3-path": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz",
- "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==",
- "license": "MIT"
- },
- "node_modules/@types/d3-scale": {
- "version": "4.0.9",
- "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz",
- "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==",
- "license": "MIT",
- "dependencies": {
- "@types/d3-time": "*"
- }
- },
- "node_modules/@types/d3-shape": {
- "version": "3.1.7",
- "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz",
- "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==",
- "license": "MIT",
- "dependencies": {
- "@types/d3-path": "*"
- }
- },
- "node_modules/@types/d3-time": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz",
- "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==",
- "license": "MIT"
- },
- "node_modules/@types/d3-timer": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
- "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
- "license": "MIT"
- },
- "node_modules/@types/estree": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
- "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
- "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.13.13",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.13.tgz",
- "integrity": "sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ==",
- "license": "MIT",
- "dependencies": {
- "undici-types": "~6.20.0"
- }
- },
- "node_modules/@types/phoenix": {
- "version": "1.6.6",
- "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.6.tgz",
- "integrity": "sha512-PIzZZlEppgrpoT2QgbnDU+MMzuR6BbCjllj0bM70lWoejMeNJAxCchxnv7J3XFkI8MpygtRpzXrIlmWUBclP5A==",
- "license": "MIT"
- },
- "node_modules/@types/react": {
- "version": "19.0.12",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.12.tgz",
- "integrity": "sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@types/react-dom": {
- "version": "19.0.4",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.4.tgz",
- "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "^19.0.0"
- }
- },
- "node_modules/@types/use-sync-external-store": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz",
- "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==",
- "license": "MIT"
- },
- "node_modules/@types/ws": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
- "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.28.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.28.0.tgz",
- "integrity": "sha512-lvFK3TCGAHsItNdWZ/1FkvpzCxTHUVuFrdnOGLMa0GGCFIbCgQWVk3CzCGdA7kM3qGVc+dfW9tr0Z/sHnGDFyg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.28.0",
- "@typescript-eslint/type-utils": "8.28.0",
- "@typescript-eslint/utils": "8.28.0",
- "@typescript-eslint/visitor-keys": "8.28.0",
- "graphemer": "^1.4.0",
- "ignore": "^5.3.1",
- "natural-compare": "^1.4.0",
- "ts-api-utils": "^2.0.1"
- },
- "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",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/@typescript-eslint/parser": {
- "version": "8.28.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.28.0.tgz",
- "integrity": "sha512-LPcw1yHD3ToaDEoljFEfQ9j2xShY367h7FZ1sq5NJT9I3yj4LHer1Xd1yRSOdYy9BpsrxU7R+eoDokChYM53lQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/scope-manager": "8.28.0",
- "@typescript-eslint/types": "8.28.0",
- "@typescript-eslint/typescript-estree": "8.28.0",
- "@typescript-eslint/visitor-keys": "8.28.0",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "8.28.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.28.0.tgz",
- "integrity": "sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.28.0",
- "@typescript-eslint/visitor-keys": "8.28.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.28.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.28.0.tgz",
- "integrity": "sha512-oRoXu2v0Rsy/VoOGhtWrOKDiIehvI+YNrDk5Oqj40Mwm0Yt01FC/Q7nFqg088d3yAsR1ZcZFVfPCTTFCe/KPwg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/typescript-estree": "8.28.0",
- "@typescript-eslint/utils": "8.28.0",
- "debug": "^4.3.4",
- "ts-api-utils": "^2.0.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/@typescript-eslint/types": {
- "version": "8.28.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.28.0.tgz",
- "integrity": "sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==",
- "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.28.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.28.0.tgz",
- "integrity": "sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.28.0",
- "@typescript-eslint/visitor-keys": "8.28.0",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.0.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
- "version": "2.0.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.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@typescript-eslint/utils": {
- "version": "8.28.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.28.0.tgz",
- "integrity": "sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "8.28.0",
- "@typescript-eslint/types": "8.28.0",
- "@typescript-eslint/typescript-estree": "8.28.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.28.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.28.0.tgz",
- "integrity": "sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.28.0",
- "eslint-visitor-keys": "^4.2.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@vitejs/plugin-react": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz",
- "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.26.0",
- "@babel/plugin-transform-react-jsx-self": "^7.25.9",
- "@babel/plugin-transform-react-jsx-source": "^7.25.9",
- "@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 || ^6.0.0"
- }
- },
- "node_modules/acorn": {
- "version": "8.14.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
- "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
- "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-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true,
- "license": "Python-2.0"
- },
- "node_modules/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/axios": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz",
- "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==",
- "license": "MIT",
- "dependencies": {
- "follow-redirects": "^1.15.6",
- "form-data": "^4.0.0",
- "proxy-from-env": "^1.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==",
- "dev": true,
- "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==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fill-range": "^7.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browserslist": {
- "version": "4.24.4",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
- "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
- "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.30001688",
- "electron-to-chromium": "^1.5.73",
- "node-releases": "^2.0.19",
- "update-browserslist-db": "^1.1.1"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/call-bind-apply-helpers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
- "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "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/caniuse-lite": {
- "version": "1.0.30001707",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz",
- "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "CC-BY-4.0"
- },
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/class-variance-authority": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
- "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
- "license": "Apache-2.0",
- "dependencies": {
- "clsx": "^2.1.1"
- },
- "funding": {
- "url": "https://polar.sh/cva"
- }
- },
- "node_modules/clsx": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
- "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/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/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/cookie": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz",
- "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==",
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
- "license": "MIT"
- },
- "node_modules/d3-array": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
- "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
- "license": "ISC",
- "dependencies": {
- "internmap": "1 - 2"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-color": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
- "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-ease": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
- "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-format": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
- "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-interpolate": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
- "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
- "license": "ISC",
- "dependencies": {
- "d3-color": "1 - 3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-path": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
- "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-scale": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
- "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
- "license": "ISC",
- "dependencies": {
- "d3-array": "2.10.0 - 3",
- "d3-format": "1 - 3",
- "d3-interpolate": "1.2.0 - 3",
- "d3-time": "2.1.1 - 3",
- "d3-time-format": "2 - 4"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-shape": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
- "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
- "license": "ISC",
- "dependencies": {
- "d3-path": "^3.1.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-time": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
- "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
- "license": "ISC",
- "dependencies": {
- "d3-array": "2 - 3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-time-format": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
- "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
- "license": "ISC",
- "dependencies": {
- "d3-time": "1 - 3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-timer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
- "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/date-fns": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz",
- "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/kossnocorp"
- }
- },
- "node_modules/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/decimal.js-light": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
- "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==",
- "license": "MIT"
- },
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/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-libc": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
- "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">=8"
- }
- },
- "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/dom-helpers": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
- "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.8.7",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/dotenv": {
- "version": "16.5.0",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz",
- "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://dotenvx.com"
- }
- },
- "node_modules/dunder-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "es-errors": "^1.3.0",
- "gopd": "^1.2.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/electron-to-chromium": {
- "version": "1.5.123",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.123.tgz",
- "integrity": "sha512-refir3NlutEZqlKaBLK0tzlVLe5P2wDKS7UQt/3SpibizgsRAPOsqQC3ffw1nlv3ze5gjRQZYHoPymgVZkplFA==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/enhanced-resolve": {
- "version": "5.18.1",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz",
- "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==",
- "license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/es-define-property": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-object-atoms": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
- "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-set-tostringtag": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
- "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/esbuild": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz",
- "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.25.1",
- "@esbuild/android-arm": "0.25.1",
- "@esbuild/android-arm64": "0.25.1",
- "@esbuild/android-x64": "0.25.1",
- "@esbuild/darwin-arm64": "0.25.1",
- "@esbuild/darwin-x64": "0.25.1",
- "@esbuild/freebsd-arm64": "0.25.1",
- "@esbuild/freebsd-x64": "0.25.1",
- "@esbuild/linux-arm": "0.25.1",
- "@esbuild/linux-arm64": "0.25.1",
- "@esbuild/linux-ia32": "0.25.1",
- "@esbuild/linux-loong64": "0.25.1",
- "@esbuild/linux-mips64el": "0.25.1",
- "@esbuild/linux-ppc64": "0.25.1",
- "@esbuild/linux-riscv64": "0.25.1",
- "@esbuild/linux-s390x": "0.25.1",
- "@esbuild/linux-x64": "0.25.1",
- "@esbuild/netbsd-arm64": "0.25.1",
- "@esbuild/netbsd-x64": "0.25.1",
- "@esbuild/openbsd-arm64": "0.25.1",
- "@esbuild/openbsd-x64": "0.25.1",
- "@esbuild/sunos-x64": "0.25.1",
- "@esbuild/win32-arm64": "0.25.1",
- "@esbuild/win32-ia32": "0.25.1",
- "@esbuild/win32-x64": "0.25.1"
- }
- },
- "node_modules/escalade": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint": {
- "version": "9.23.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz",
- "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.12.1",
- "@eslint/config-array": "^0.19.2",
- "@eslint/config-helpers": "^0.2.0",
- "@eslint/core": "^0.12.0",
- "@eslint/eslintrc": "^3.3.1",
- "@eslint/js": "9.23.0",
- "@eslint/plugin-kit": "^0.2.7",
- "@humanfs/node": "^0.16.6",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@humanwhocodes/retry": "^0.4.2",
- "@types/estree": "^1.0.6",
- "@types/json-schema": "^7.0.15",
- "ajv": "^6.12.4",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.6",
- "debug": "^4.3.2",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^8.3.0",
- "eslint-visitor-keys": "^4.2.0",
- "espree": "^10.3.0",
- "esquery": "^1.5.0",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^8.0.0",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.3"
- },
- "bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://eslint.org/donate"
- },
- "peerDependencies": {
- "jiti": "*"
- },
- "peerDependenciesMeta": {
- "jiti": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-plugin-react-hooks": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
- "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
- }
- },
- "node_modules/eslint-plugin-react-refresh": {
- "version": "0.4.19",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz",
- "integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "eslint": ">=8.40"
- }
- },
- "node_modules/eslint-scope": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz",
- "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
- "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/espree": {
- "version": "10.3.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
- "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "acorn": "^8.14.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^4.2.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/eventemitter3": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
- "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
- "license": "MIT"
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-equals": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz",
- "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==",
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/fast-glob": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
- "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
- "dev": true,
- "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.8"
- },
- "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==",
- "dev": true,
- "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.19.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
- "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/file-entry-cache": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
- "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flat-cache": "^4.0.0"
- },
- "engines": {
- "node": ">=16.0.0"
- }
- },
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
- "dev": true,
- "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.3",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
- "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/follow-redirects": {
- "version": "1.15.9",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
- "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/form-data": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
- "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
- "license": "MIT",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "es-set-tostringtag": "^2.1.0",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/framer-motion": {
- "version": "12.6.0",
- "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.6.0.tgz",
- "integrity": "sha512-91XLZ3VwDlXe9u2ABhTzYBiFQ/qdoiqyTiTCQDDJ4es5/5lzp76hdB+WG7gcNklcQlOmfDZQqVO48tqzY9Z/bQ==",
- "license": "MIT",
- "dependencies": {
- "motion-dom": "^12.6.0",
- "motion-utils": "^12.5.0",
- "tslib": "^2.4.0"
- },
- "peerDependencies": {
- "@emotion/is-prop-valid": "*",
- "react": "^18.0.0 || ^19.0.0",
- "react-dom": "^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@emotion/is-prop-valid": {
- "optional": true
- },
- "react": {
- "optional": true
- },
- "react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "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-intrinsic": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
- "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.2",
- "es-define-property": "^1.0.1",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "function-bind": "^1.1.2",
- "get-proto": "^1.0.1",
- "gopd": "^1.2.0",
- "has-symbols": "^1.1.0",
- "hasown": "^2.0.2",
- "math-intrinsics": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-nonce": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
- "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/get-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
- "license": "MIT",
- "dependencies": {
- "dunder-proto": "^1.0.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/globals": {
- "version": "15.15.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
- "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/gopd": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "license": "ISC"
- },
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-tostringtag": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
- "license": "MIT",
- "dependencies": {
- "has-symbols": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/ignore": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
- "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/immer": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz",
- "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==",
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/immer"
- }
- },
- "node_modules/import-fresh": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
- "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/internmap": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
- "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "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==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/jiti": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
- "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
- "license": "MIT",
- "bin": {
- "jiti": "lib/jiti-cli.mjs"
- }
- },
- "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.1.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
- "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
- "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/lightningcss": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz",
- "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==",
- "license": "MPL-2.0",
- "dependencies": {
- "detect-libc": "^2.0.3"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- },
- "optionalDependencies": {
- "lightningcss-darwin-arm64": "1.29.2",
- "lightningcss-darwin-x64": "1.29.2",
- "lightningcss-freebsd-x64": "1.29.2",
- "lightningcss-linux-arm-gnueabihf": "1.29.2",
- "lightningcss-linux-arm64-gnu": "1.29.2",
- "lightningcss-linux-arm64-musl": "1.29.2",
- "lightningcss-linux-x64-gnu": "1.29.2",
- "lightningcss-linux-x64-musl": "1.29.2",
- "lightningcss-win32-arm64-msvc": "1.29.2",
- "lightningcss-win32-x64-msvc": "1.29.2"
- }
- },
- "node_modules/lightningcss-darwin-arm64": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz",
- "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==",
- "cpu": [
- "arm64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-darwin-x64": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz",
- "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==",
- "cpu": [
- "x64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-freebsd-x64": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz",
- "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==",
- "cpu": [
- "x64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm-gnueabihf": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz",
- "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==",
- "cpu": [
- "arm"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm64-gnu": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz",
- "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==",
- "cpu": [
- "arm64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm64-musl": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz",
- "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==",
- "cpu": [
- "arm64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-x64-gnu": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz",
- "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==",
- "cpu": [
- "x64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-x64-musl": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz",
- "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==",
- "cpu": [
- "x64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-win32-arm64-msvc": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz",
- "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==",
- "cpu": [
- "arm64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-win32-x64-msvc": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz",
- "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==",
- "cpu": [
- "x64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "license": "MIT"
- },
- "node_modules/lodash.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.477.0",
- "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.477.0.tgz",
- "integrity": "sha512-yCf7aYxerFZAbd8jHJxjwe1j7jEMPptjnaOqdYeirFnEy85cNR3/L+o0I875CYFYya+eEVzZSbNuRk8BZPDpVw==",
- "license": "ISC",
- "peerDependencies": {
- "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- }
- },
- "node_modules/math-intrinsics": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
- "dev": true,
- "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/motion-dom": {
- "version": "12.6.0",
- "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.6.0.tgz",
- "integrity": "sha512-1s/+/V0ny/gfhocSSf0qhkspZK2da7jrwGw7xHzgiQPcimdHaPRcRCoJ3OxEZYBNzy3ma1ERUD+eUStk6a9pQw==",
- "license": "MIT",
- "dependencies": {
- "motion-utils": "^12.5.0"
- }
- },
- "node_modules/motion-utils": {
- "version": "12.5.0",
- "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.5.0.tgz",
- "integrity": "sha512-+hFFzvimn0sBMP9iPxBa9OtRX35ZQ3py0UHnb8U29VD+d8lQ8zH3dTygJWqK7av2v6yhg7scj9iZuvTS0f4+SA==",
- "license": "MIT"
- },
- "node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/nanoid": {
- "version": "3.3.11",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
- "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/node-releases": {
- "version": "2.0.19",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
- "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/optionator": {
- "version": "0.9.4",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
- "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.5"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "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==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/picocolors": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/postcss": {
- "version": "8.5.3",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
- "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.8",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/prop-types": {
- "version": "15.8.1",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
- "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
- "license": "MIT",
- "dependencies": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.13.1"
- }
- },
- "node_modules/prop-types/node_modules/react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
- "license": "MIT"
- },
- "node_modules/proxy-from-env": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
- "license": "MIT"
- },
- "node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "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": "19.0.0",
- "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz",
- "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-day-picker": {
- "version": "8.10.1",
- "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz",
- "integrity": "sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==",
- "license": "MIT",
- "funding": {
- "type": "individual",
- "url": "https://github.com/sponsors/gpbl"
- },
- "peerDependencies": {
- "date-fns": "^2.28.0 || ^3.0.0",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
- }
- },
- "node_modules/react-dom": {
- "version": "19.0.0",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz",
- "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==",
- "license": "MIT",
- "dependencies": {
- "scheduler": "^0.25.0"
- },
- "peerDependencies": {
- "react": "^19.0.0"
- }
- },
- "node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "license": "MIT"
- },
- "node_modules/react-redux": {
- "version": "9.2.0",
- "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz",
- "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==",
- "license": "MIT",
- "dependencies": {
- "@types/use-sync-external-store": "^0.0.6",
- "use-sync-external-store": "^1.4.0"
- },
- "peerDependencies": {
- "@types/react": "^18.2.25 || ^19",
- "react": "^18.0 || ^19",
- "redux": "^5.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "redux": {
- "optional": true
- }
- }
- },
- "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.3",
- "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.3.tgz",
- "integrity": "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==",
- "license": "MIT",
- "dependencies": {
- "react-remove-scroll-bar": "^2.3.7",
- "react-style-singleton": "^2.2.3",
- "tslib": "^2.1.0",
- "use-callback-ref": "^1.3.3",
- "use-sidecar": "^1.1.3"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/react-remove-scroll-bar": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
- "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
- "license": "MIT",
- "dependencies": {
- "react-style-singleton": "^2.2.2",
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/react-router": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.4.0.tgz",
- "integrity": "sha512-Y2g5ObjkvX3VFeVt+0CIPuYd9PpgqCslG7ASSIdN73LwA1nNWzcMLaoMRJfP3prZFI92svxFwbn7XkLJ+UPQ6A==",
- "license": "MIT",
- "dependencies": {
- "@types/cookie": "^0.6.0",
- "cookie": "^1.0.1",
- "set-cookie-parser": "^2.6.0",
- "turbo-stream": "2.4.0"
- },
- "engines": {
- "node": ">=20.0.0"
- },
- "peerDependencies": {
- "react": ">=18",
- "react-dom": ">=18"
- },
- "peerDependenciesMeta": {
- "react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/react-router-dom": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.4.0.tgz",
- "integrity": "sha512-VlksBPf3n2bijPvnA7nkTsXxMAKOj+bWp4R9c3i+bnwlSOFAGOkJkKhzy/OsRkWaBMICqcAl1JDzh9ZSOze9CA==",
- "license": "MIT",
- "dependencies": {
- "react-router": "7.4.0"
- },
- "engines": {
- "node": ">=20.0.0"
- },
- "peerDependencies": {
- "react": ">=18",
- "react-dom": ">=18"
- }
- },
- "node_modules/react-smooth": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz",
- "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==",
- "license": "MIT",
- "dependencies": {
- "fast-equals": "^5.0.1",
- "prop-types": "^15.8.1",
- "react-transition-group": "^4.4.5"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- }
- },
- "node_modules/react-style-singleton": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
- "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
- "license": "MIT",
- "dependencies": {
- "get-nonce": "^1.0.0",
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/react-transition-group": {
- "version": "4.4.5",
- "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
- "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "@babel/runtime": "^7.5.5",
- "dom-helpers": "^5.0.1",
- "loose-envify": "^1.4.0",
- "prop-types": "^15.6.2"
- },
- "peerDependencies": {
- "react": ">=16.6.0",
- "react-dom": ">=16.6.0"
- }
- },
- "node_modules/recharts": {
- "version": "2.15.1",
- "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.1.tgz",
- "integrity": "sha512-v8PUTUlyiDe56qUj82w/EDVuzEFXwEHp9/xOowGAZwfLjB9uAy3GllQVIYMWF6nU+qibx85WF75zD7AjqoT54Q==",
- "license": "MIT",
- "dependencies": {
- "clsx": "^2.0.0",
- "eventemitter3": "^4.0.1",
- "lodash": "^4.17.21",
- "react-is": "^18.3.1",
- "react-smooth": "^4.0.4",
- "recharts-scale": "^0.4.4",
- "tiny-invariant": "^1.3.1",
- "victory-vendor": "^36.6.8"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
- "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- }
- },
- "node_modules/recharts-scale": {
- "version": "0.4.5",
- "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz",
- "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==",
- "license": "MIT",
- "dependencies": {
- "decimal.js-light": "^2.4.1"
- }
- },
- "node_modules/redux": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
- "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==",
- "license": "MIT"
- },
- "node_modules/redux-thunk": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz",
- "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==",
- "license": "MIT",
- "peerDependencies": {
- "redux": "^5.0.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/reselect": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
- "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==",
- "license": "MIT"
- },
- "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.1.0",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
- "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rollup": {
- "version": "4.37.0",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.37.0.tgz",
- "integrity": "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==",
- "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.37.0",
- "@rollup/rollup-android-arm64": "4.37.0",
- "@rollup/rollup-darwin-arm64": "4.37.0",
- "@rollup/rollup-darwin-x64": "4.37.0",
- "@rollup/rollup-freebsd-arm64": "4.37.0",
- "@rollup/rollup-freebsd-x64": "4.37.0",
- "@rollup/rollup-linux-arm-gnueabihf": "4.37.0",
- "@rollup/rollup-linux-arm-musleabihf": "4.37.0",
- "@rollup/rollup-linux-arm64-gnu": "4.37.0",
- "@rollup/rollup-linux-arm64-musl": "4.37.0",
- "@rollup/rollup-linux-loongarch64-gnu": "4.37.0",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0",
- "@rollup/rollup-linux-riscv64-gnu": "4.37.0",
- "@rollup/rollup-linux-riscv64-musl": "4.37.0",
- "@rollup/rollup-linux-s390x-gnu": "4.37.0",
- "@rollup/rollup-linux-x64-gnu": "4.37.0",
- "@rollup/rollup-linux-x64-musl": "4.37.0",
- "@rollup/rollup-win32-arm64-msvc": "4.37.0",
- "@rollup/rollup-win32-ia32-msvc": "4.37.0",
- "@rollup/rollup-win32-x64-msvc": "4.37.0",
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/rollup/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/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==",
- "dev": true,
- "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.25.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
- "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==",
- "license": "MIT"
- },
- "node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/set-cookie-parser": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz",
- "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==",
- "license": "MIT"
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
- "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/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/tailwind-merge": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.0.2.tgz",
- "integrity": "sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/dcastil"
- }
- },
- "node_modules/tailwindcss": {
- "version": "4.0.16",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.16.tgz",
- "integrity": "sha512-i/SbG7ThTIcLshcFJL+je7hCv9dPis4Xl4XNeel6iZNX42pp/BZ+la+SbZIPoYE+PN8zhKbnHblpQ/lhOWwIeQ==",
- "license": "MIT"
- },
- "node_modules/tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/tiny-invariant": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
- "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
- "license": "MIT"
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "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": "2.1.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
- "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18.12"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4"
- }
- },
- "node_modules/tslib": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "license": "0BSD"
- },
- "node_modules/turbo-stream": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz",
- "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==",
- "license": "ISC"
- },
- "node_modules/tw-animate-css": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.2.4.tgz",
- "integrity": "sha512-yt+HkJB41NAvOffe4NweJU6fLqAlVx/mBX6XmHRp15kq0JxTtOKaIw8pVSWM1Z+n2nXtyi7cW6C9f0WG/F/QAQ==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/Wombosvideo"
- }
- },
- "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.7.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
- "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
- "dev": true,
- "license": "Apache-2.0",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/typescript-eslint": {
- "version": "8.28.0",
- "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.28.0.tgz",
- "integrity": "sha512-jfZtxJoHm59bvoCMYCe2BM0/baMswRhMmYhy+w6VfcyHrjxZ0OJe0tGasydCpIpA+A/WIJhTyZfb3EtwNC/kHQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/eslint-plugin": "8.28.0",
- "@typescript-eslint/parser": "8.28.0",
- "@typescript-eslint/utils": "8.28.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/undici-types": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
- "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
- "license": "MIT"
- },
- "node_modules/update-browserslist-db": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
- "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "escalade": "^3.2.0",
- "picocolors": "^1.1.1"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/use-callback-ref": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
- "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/use-sidecar": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
- "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
- "license": "MIT",
- "dependencies": {
- "detect-node-es": "^1.1.0",
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/use-sync-external-store": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz",
- "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==",
- "license": "MIT",
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- }
- },
- "node_modules/victory-vendor": {
- "version": "36.9.2",
- "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz",
- "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==",
- "license": "MIT AND ISC",
- "dependencies": {
- "@types/d3-array": "^3.0.3",
- "@types/d3-ease": "^3.0.0",
- "@types/d3-interpolate": "^3.0.1",
- "@types/d3-scale": "^4.0.2",
- "@types/d3-shape": "^3.1.0",
- "@types/d3-time": "^3.0.0",
- "@types/d3-timer": "^3.0.0",
- "d3-array": "^3.1.6",
- "d3-ease": "^3.0.1",
- "d3-interpolate": "^3.0.1",
- "d3-scale": "^4.0.2",
- "d3-shape": "^3.1.0",
- "d3-time": "^3.0.0",
- "d3-timer": "^3.0.1"
- }
- },
- "node_modules/vite": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.3.tgz",
- "integrity": "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "esbuild": "^0.25.0",
- "postcss": "^8.5.3",
- "rollup": "^4.30.1"
- },
- "bin": {
- "vite": "bin/vite.js"
- },
- "engines": {
- "node": "^18.0.0 || ^20.0.0 || >=22.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 || >=22.0.0",
- "jiti": ">=1.21.0",
- "less": "*",
- "lightningcss": "^1.21.0",
- "sass": "*",
- "sass-embedded": "*",
- "stylus": "*",
- "sugarss": "*",
- "terser": "^5.16.0",
- "tsx": "^4.8.1",
- "yaml": "^2.4.2"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "jiti": {
- "optional": true
- },
- "less": {
- "optional": true
- },
- "lightningcss": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "sass-embedded": {
- "optional": true
- },
- "stylus": {
- "optional": true
- },
- "sugarss": {
- "optional": true
- },
- "terser": {
- "optional": true
- },
- "tsx": {
- "optional": true
- },
- "yaml": {
- "optional": true
- }
- }
- },
- "node_modules/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==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/word-wrap": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
- "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ws": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz",
- "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==",
- "license": "MIT",
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- }
- }
-}
diff --git a/Frontend/package.json b/Frontend/package.json
deleted file mode 100644
index 1f4ad6f..0000000
--- a/Frontend/package.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
- "name": "frontend",
- "private": true,
- "version": "0.0.0",
- "type": "module",
- "scripts": {
- "dev": "vite",
- "build": "tsc -b && vite build",
- "lint": "eslint .",
- "preview": "vite preview"
- },
- "dependencies": {
- "@radix-ui/react-avatar": "^1.1.3",
- "@radix-ui/react-dialog": "^1.1.6",
- "@radix-ui/react-dropdown-menu": "^2.1.6",
- "@radix-ui/react-label": "^2.1.2",
- "@radix-ui/react-popover": "^1.1.6",
- "@radix-ui/react-scroll-area": "^1.2.3",
- "@radix-ui/react-select": "^2.1.6",
- "@radix-ui/react-separator": "^1.1.2",
- "@radix-ui/react-slider": "^1.2.3",
- "@radix-ui/react-slot": "^1.1.2",
- "@radix-ui/react-switch": "^1.1.3",
- "@radix-ui/react-tabs": "^1.1.3",
- "@reduxjs/toolkit": "^2.6.1",
- "@supabase/supabase-js": "^2.49.4",
- "@tailwindcss/vite": "^4.0.16",
- "axios": "^1.8.4",
- "class-variance-authority": "^0.7.1",
- "clsx": "^2.1.1",
- "date-fns": "^4.1.0",
- "dotenv": "^16.4.7",
- "framer-motion": "^12.5.0",
- "lucide-react": "^0.477.0",
- "react": "^19.0.0",
- "react-day-picker": "^8.10.1",
- "react-dom": "^19.0.0",
- "react-redux": "^9.2.0",
- "react-router-dom": "^7.2.0",
- "recharts": "^2.15.1",
- "tailwind-merge": "^3.0.2",
- "tailwindcss": "^4.0.16",
- "tw-animate-css": "^1.2.4"
- },
- "devDependencies": {
- "@eslint/js": "^9.21.0",
- "@types/node": "^22.13.13",
- "@types/react": "^19.0.10",
- "@types/react-dom": "^19.0.4",
- "@vitejs/plugin-react": "^4.3.4",
- "eslint": "^9.21.0",
- "eslint-plugin-react-hooks": "^5.1.0",
- "eslint-plugin-react-refresh": "^0.4.19",
- "globals": "^15.15.0",
- "typescript": "~5.7.2",
- "typescript-eslint": "^8.24.1",
- "vite": "^6.2.0"
- }
-}
diff --git a/Frontend/public/Home.png b/Frontend/public/Home.png
deleted file mode 100644
index 8729305..0000000
Binary files a/Frontend/public/Home.png and /dev/null differ
diff --git a/Frontend/public/brand.png b/Frontend/public/brand.png
deleted file mode 100644
index bc29669..0000000
Binary files a/Frontend/public/brand.png and /dev/null differ
diff --git a/Frontend/public/contnetcreator.png b/Frontend/public/contnetcreator.png
deleted file mode 100644
index e527063..0000000
Binary files a/Frontend/public/contnetcreator.png and /dev/null differ
diff --git a/Frontend/public/facebook.png b/Frontend/public/facebook.png
deleted file mode 100644
index 0c37594..0000000
Binary files a/Frontend/public/facebook.png and /dev/null differ
diff --git a/Frontend/public/instagram.png b/Frontend/public/instagram.png
deleted file mode 100644
index 82216ba..0000000
Binary files a/Frontend/public/instagram.png and /dev/null differ
diff --git a/Frontend/public/tiktok.png b/Frontend/public/tiktok.png
deleted file mode 100644
index 4b6a8ae..0000000
Binary files a/Frontend/public/tiktok.png and /dev/null differ
diff --git a/Frontend/public/youtube.png b/Frontend/public/youtube.png
deleted file mode 100644
index 2db89d2..0000000
Binary files a/Frontend/public/youtube.png and /dev/null differ
diff --git a/Frontend/src/App.css b/Frontend/src/App.css
deleted file mode 100644
index e69de29..0000000
diff --git a/Frontend/src/App.tsx b/Frontend/src/App.tsx
deleted file mode 100644
index 60f7ecd..0000000
--- a/Frontend/src/App.tsx
+++ /dev/null
@@ -1,142 +0,0 @@
-import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
-import { useState, useEffect } from "react";
-import HomePage from "../src/pages/HomePage";
-import DashboardPage from "../src/pages/DashboardPage";
-import SponsorshipsPage from "../src/pages/Sponsorships";
-import CollaborationsPage from "../src/pages/Collaborations";
-import CollaborationDetails from "../src/pages/CollaborationDetails";
-import MessagesPage from "../src/pages/Messages";
-import LoginPage from "./pages/Login";
-import SignupPage from "./pages/Signup";
-import ForgotPasswordPage from "./pages/ForgotPassword";
-import ResetPasswordPage from "./pages/ResetPassword";
-import Contracts from "./pages/Contracts";
-import Analytics from "./pages/Analytics";
-import RoleSelection from "./pages/RoleSelection";
-
-import { AuthProvider } from "./context/AuthContext";
-import ProtectedRoute from "./components/ProtectedRoute";
-import PublicRoute from "./components/PublicRoute";
-import Dashboard from "./pages/Brand/Dashboard";
-import BasicDetails from "./pages/BasicDetails";
-import Onboarding from "./components/Onboarding";
-
-function App() {
- const [isLoading, setIsLoading] = useState(true);
-
- useEffect(() => {
- // Set a timeout to ensure the app loads
- const timer = setTimeout(() => {
- setIsLoading(false);
- }, 2000);
-
- return () => clearTimeout(timer);
- }, []);
-
- if (isLoading) {
- return (
-
-
Loading Inpact...
-
Connecting to the platform
-
- );
- }
-
- return (
-
-
-
- {/* Public Routes */}
- } />
-
-
-
- } />
-
-
-
- } />
- } />
- Brand Onboarding (Coming Soon)} />
- Creator Onboarding (Coming Soon)} />
- } />
- } />
-
-
-
- } />
- } />
- } />
-
-
-
- } />
-
- {/* Protected Routes*/}
-
-
-
- }
- />
-
-
-
- }
- />
-
-
-
- }
- />
-
-
-
- }
- />
-
-
-
- }
- />
-
-
-
- }
- />
-
-
-
- }
- />
-
-
-
- );
-}
-
-export default App;
diff --git a/Frontend/src/assets/react.svg b/Frontend/src/assets/react.svg
deleted file mode 100644
index 6c87de9..0000000
--- a/Frontend/src/assets/react.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Frontend/src/components/Onboarding.tsx b/Frontend/src/components/Onboarding.tsx
deleted file mode 100644
index 950b09e..0000000
--- a/Frontend/src/components/Onboarding.tsx
+++ /dev/null
@@ -1,1496 +0,0 @@
-import { useState, useEffect } from "react";
-import { useNavigate } from "react-router-dom";
-import { useAuth } from "../context/AuthContext";
-import { Info } from "lucide-react";
-import { supabase } from "../utils/supabase";
-
-const platforms = [
- { name: "YouTube", icon: "/youtube.png" },
- { name: "Instagram", icon: "/instagram.png" },
- { name: "Facebook", icon: "/facebook.png" },
- { name: "TikTok", icon: "/tiktok.png" },
-];
-
-const steps = [
- "Role Selection",
- "Personal Details",
- "Platform Selection",
- "Platform Details",
- "Pricing",
- "Profile Picture",
- "Review & Submit",
-];
-
-// const YOUTUBE_API_KEY = import.meta.env.VITE_YOUTUBE_API_KEY; // No longer needed in frontend
-
-type BrandData = {
- brand_name: string;
- logo: File | null;
- website_url: string;
- industry: string;
- company_size: string;
- location: string;
- description: string;
- contact_person: string;
- contact_email: string;
- contact_phone: string;
- role: string;
- platforms: string[];
- social_links: Record;
- collaboration_types: string[];
- preferred_creator_categories: string[];
- brand_values: string[];
- preferred_tone: string[];
-};
-
-const brandInitialState: BrandData = {
- brand_name: "",
- logo: null,
- website_url: "",
- industry: "",
- company_size: "",
- location: "",
- description: "",
- contact_person: "",
- contact_email: "",
- contact_phone: "",
- role: "",
- platforms: [],
- social_links: {},
- collaboration_types: [],
- preferred_creator_categories: [],
- brand_values: [],
- preferred_tone: [],
-};
-
-export default function Onboarding() {
- const navigate = useNavigate();
- const { user } = useAuth();
- const [step, setStep] = useState(0);
- const [role, setRole] = useState("");
- const [personal, setPersonal] = useState({ name: "", email: "", age: "", gender: "", country: "", category: "", otherCategory: "" });
- const [selectedPlatforms, setSelectedPlatforms] = useState([]);
- const [platformDetails, setPlatformDetails] = useState({});
- const [pricing, setPricing] = useState({});
- const [personalError, setPersonalError] = useState("");
- const [platformDetailsError, setPlatformDetailsError] = useState("");
- const [pricingError, setPricingError] = useState("");
- const [profilePic, setProfilePic] = useState(null);
- const [profilePicError, setProfilePicError] = useState("");
- const [submitError, setSubmitError] = useState("");
- const [submitSuccess, setSubmitSuccess] = useState("");
- const [submitting, setSubmitting] = useState(false);
- const [progress, setProgress] = useState(0);
- const [brandStep, setBrandStep] = useState(0);
- const [brandData, setBrandData] = useState(brandInitialState);
- const [brandLogoPreview, setBrandLogoPreview] = useState(null);
- const [brandError, setBrandError] = useState("");
-
- // Prefill name and email from Google user if available
- useEffect(() => {
- if (user) {
- setPersonal((prev) => ({
- ...prev,
- name: user.user_metadata?.name || prev.name,
- email: user.email || prev.email,
- }));
- }
- }, [user]);
-
- // Validation for personal details
- const validatePersonal = () => {
- if (!personal.name || personal.name.length < 2) return "Please enter a valid name.";
- if (!personal.email) return "Email is required.";
- if (!personal.age || isNaN(Number(personal.age)) || Number(personal.age) < 10 || Number(personal.age) > 99) return "Please enter a valid age (10-99).";
- if (!personal.gender) return "Please select a gender.";
- if (!personal.category) return "Please select a content category.";
- if (personal.category === "Other" && !personal.otherCategory) return "Please enter your content category.";
- if (!personal.country) return "Please enter a valid country.";
- return "";
- };
-
- // Validation for platform details
- const validatePlatformDetails = () => {
- for (const platform of selectedPlatforms) {
- const details = platformDetails[platform];
- if (!details) return `Please fill in all details for ${platform}.`;
- if (platform === "YouTube") {
- if (!details.channelUrl || !details.channelId || !details.channelName) return `Please provide a valid YouTube channel for ${platform}.`;
- } else {
- if (!details.profileUrl || !details.followers || !details.posts) return `Please fill in all details for ${platform}.`;
- if (isNaN(Number(details.followers)) || isNaN(Number(details.posts))) return `Followers and posts must be numbers for ${platform}.`;
- }
- }
- return "";
- };
-
- // Validation for pricing
- const validatePricing = () => {
- for (const platform of selectedPlatforms) {
- const p = pricing[platform];
- if (!p) return `Please fill in pricing for ${platform}.`;
- if (platform === "YouTube") {
- if (!p.per_video_cost || !p.per_short_cost || !p.per_community_post_cost || !p.currency) return `Please fill all YouTube pricing fields.`;
- if ([p.per_video_cost, p.per_short_cost, p.per_community_post_cost].some(v => isNaN(Number(v)))) return `YouTube pricing must be numbers.`;
- } else if (platform === "Instagram") {
- if (!p.per_post_cost || !p.per_story_cost || !p.per_reel_cost || !p.currency) return `Please fill all Instagram pricing fields.`;
- if ([p.per_post_cost, p.per_story_cost, p.per_reel_cost].some(v => isNaN(Number(v)))) return `Instagram pricing must be numbers.`;
- } else if (platform === "Facebook") {
- if (!p.per_post_cost || !p.currency) return `Please fill all Facebook pricing fields.`;
- if (isNaN(Number(p.per_post_cost))) return `Facebook pricing must be a number.`;
- } else if (platform === "TikTok") {
- if (!p.per_video_cost || !p.currency) return `Please fill all TikTok pricing fields.`;
- if (isNaN(Number(p.per_video_cost))) return `TikTok pricing must be a number.`;
- }
- }
- return "";
- };
-
- // Step 1: Role Selection
- const renderRoleStep = () => (
-
-
Are you a Brand or a Creator?
-
-
setRole("brand")}
- >
-
- Brand
-
-
setRole("creator")}
- >
-
- Content Creator
-
-
-
- );
-
- // Step 2: Personal Details
- const genderOptions = ["Male", "Female", "Non-binary", "Prefer not to say"];
- const categoryOptions = [
- "Tech",
- "Fashion",
- "Travel",
- "Food",
- "Fitness",
- "Beauty",
- "Gaming",
- "Education",
- "Music",
- "Finance",
- "Other",
- ];
- const renderPersonalStep = () => (
-
-
Personal Details
-
- {personalError &&
{personalError}
}
-
- );
-
- // Step 3: Platform Selection
- const renderPlatformStep = () => (
-
-
Which platforms do you use?
-
- {platforms.map((platform) => (
-
{
- setSelectedPlatforms((prev) =>
- prev.includes(platform.name)
- ? prev.filter((p) => p !== platform.name)
- : [...prev, platform.name]
- );
- }}
- className={`flex flex-col items-center px-6 py-4 rounded-xl border-2 transition-all duration-200 shadow-sm w-32 h-36 ${selectedPlatforms.includes(platform.name) ? "border-purple-600 bg-purple-50" : "border-gray-300 bg-white"}`}
- >
-
- {platform.name}
-
- ))}
-
-
- );
-
- // Step 4: Platform Details
- const renderPlatformDetailsStep = () => (
-
-
Platform Details
-
- {selectedPlatforms.map((platform) => (
-
-
-
p.name === platform)?.icon} alt={platform} className="h-8 w-8" />
-
{platform}
-
- {platform === "YouTube" && (
-
setPlatformDetails((prev: any) => ({ ...prev, [platform]: d }))}
- />
- )}
- {platform === "Instagram" && (
- setPlatformDetails((prev: any) => ({ ...prev, [platform]: d }))}
- />
- )}
- {platform === "Facebook" && (
- setPlatformDetails((prev: any) => ({ ...prev, [platform]: d }))}
- />
- )}
- {platform === "TikTok" && (
- setPlatformDetails((prev: any) => ({ ...prev, [platform]: d }))}
- />
- )}
-
- ))}
-
- {platformDetailsError &&
{platformDetailsError}
}
-
- );
-
- // Step 5: Pricing
- const renderPricingStep = () => (
-
-
Set Your Pricing
-
- {selectedPlatforms.map((platform) => (
-
-
-
p.name === platform)?.icon} alt={platform} className="h-8 w-8" />
-
{platform}
-
- {platform === "YouTube" && (
-
setPricing((prev: any) => ({ ...prev, [platform]: d }))}
- />
- )}
- {platform === "Instagram" && (
- setPricing((prev: any) => ({ ...prev, [platform]: d }))}
- />
- )}
- {platform === "Facebook" && (
- setPricing((prev: any) => ({ ...prev, [platform]: d }))}
- />
- )}
- {platform === "TikTok" && (
- setPricing((prev: any) => ({ ...prev, [platform]: d }))}
- />
- )}
-
- ))}
-
- {pricingError &&
{pricingError}
}
-
- );
-
- // Step 5: Profile Picture Upload (new step)
- const handleProfilePicChange = (e: React.ChangeEvent) => {
- setProfilePicError("");
- if (e.target.files && e.target.files[0]) {
- const file = e.target.files[0];
- if (file.size > 3 * 1024 * 1024) {
- setProfilePicError("File size must be less than 3MB.");
- setProfilePic(null);
- return;
- }
- setProfilePic(file);
- }
- };
-
- const renderProfilePicStep = () => (
-
-
Upload Profile Picture
-
-
- Choose File
-
-
-
- {(profilePic || user?.user_metadata?.avatar_url) ? (
-
- ) : (
-
No Image
- )}
- {profilePic &&
{profilePic.name}
}
-
- {profilePicError &&
{profilePicError}
}
-
Max file size: 3MB. You can skip this step if you want to use your Google/YouTube profile image.
-
-
- );
-
- // Step 6: Review & Submit
- const handleSubmit = async () => {
- setSubmitting(true);
- setSubmitError("");
- setSubmitSuccess("");
- setProgress(0);
- let profile_image_url = null;
- try {
- // 1. Upload profile picture if provided
- if (profilePic) {
- setProgress(20);
- const fileExt = profilePic.name.split('.').pop();
- const fileName = `${user?.id}_${Date.now()}.${fileExt}`;
- const { data, error } = await supabase.storage.from('profile-pictures').upload(fileName, profilePic);
- if (error) throw error;
- profile_image_url = `${supabase.storage.from('profile-pictures').getPublicUrl(fileName).data.publicUrl}`;
- } else if (user?.user_metadata?.avatar_url) {
- profile_image_url = user.user_metadata.avatar_url;
- }
- setProgress(40);
- // 2. Update users table
- const categoryToSave = personal.category === 'Other' ? personal.otherCategory : personal.category;
- const { error: userError } = await supabase.from('users').update({
- username: personal.name,
- age: personal.age,
- gender: personal.gender,
- country: personal.country,
- category: categoryToSave,
- profile_image: profile_image_url,
- role,
- }).eq('id', user?.id);
- if (userError) throw userError;
- setProgress(60);
- // 3. Insert social_profiles for each platform
- for (const platform of selectedPlatforms) {
- const details = platformDetails[platform];
- const p = pricing[platform];
- const profileData: any = {
- user_id: user?.id,
- platform,
- per_post_cost: p?.per_post_cost ? Number(p.per_post_cost) : null,
- per_story_cost: p?.per_story_cost ? Number(p.per_story_cost) : null,
- per_reel_cost: p?.per_reel_cost ? Number(p.per_reel_cost) : null,
- per_video_cost: p?.per_video_cost ? Number(p.per_video_cost) : null,
- per_short_cost: p?.per_short_cost ? Number(p.per_short_cost) : null,
- per_community_post_cost: p?.per_community_post_cost ? Number(p.per_community_post_cost) : null,
- per_post_cost_currency: p?.currency || null,
- per_story_cost_currency: p?.currency || null,
- per_reel_cost_currency: p?.currency || null,
- per_video_cost_currency: p?.currency || null,
- per_short_cost_currency: p?.currency || null,
- per_community_post_cost_currency: p?.currency || null,
- };
- if (platform === 'YouTube') {
- Object.assign(profileData, {
- channel_id: details.channelId,
- channel_name: details.channelName,
- profile_image: details.profile_image,
- subscriber_count: details.subscriber_count ? Number(details.subscriber_count) : null,
- total_views: details.total_views ? Number(details.total_views) : null,
- video_count: details.video_count ? Number(details.video_count) : null,
- channel_url: details.channelUrl,
- });
- } else {
- Object.assign(profileData, {
- username: details.profileUrl,
- followers: details.followers ? Number(details.followers) : null,
- posts: details.posts ? Number(details.posts) : null,
- profile_image: null,
- channel_url: details.profileUrl,
- });
- }
- // Upsert to avoid duplicates
- const { error: spError } = await supabase.from('social_profiles').upsert(profileData, { onConflict: 'user_id,platform' });
- if (spError) throw spError;
- }
- setProgress(90);
- setSubmitSuccess('Onboarding complete! Your details have been saved.');
- setProgress(100);
- // Route based on role
- if (role === "brand") {
- setTimeout(() => navigate('/brand/dashboard'), 1200);
- } else {
- setTimeout(() => navigate('/dashboard'), 1200);
- }
- } catch (err: any) {
- setSubmitError(err.message || 'Failed to submit onboarding data.');
- setProgress(0);
- } finally {
- setSubmitting(false);
- }
- };
-
- const renderReviewStep = () => (
-
-
Review & Submit
- {submitting && (
-
- )}
-
-
Profile Picture
-
- {(profilePic || user?.user_metadata?.avatar_url) ? (
-
- ) : (
-
No Image
- )}
- {profilePic &&
{profilePic.name}
}
-
-
-
-
Personal Details
-
- Name: {personal.name}
- Email: {personal.email}
- Age: {personal.age}
- Gender: {personal.gender}
- Country: {personal.country}
- Category: {personal.category === 'Other' ? personal.otherCategory : personal.category}
-
-
-
-
Platforms
- {selectedPlatforms.map(platform => (
-
-
{platform}
-
- {platform === 'YouTube' ? (
- <>
- Channel Name: {platformDetails[platform]?.channelName}
- Subscribers: {platformDetails[platform]?.subscriber_count}
- Videos: {platformDetails[platform]?.video_count}
- Views: {platformDetails[platform]?.total_views}
- Channel URL: {platformDetails[platform]?.channelUrl}
- Pricing: Video: {pricing[platform]?.per_video_cost}, Short: {pricing[platform]?.per_short_cost}, Community Post: {pricing[platform]?.per_community_post_cost} ({pricing[platform]?.currency})
- >
- ) : (
- <>
- Profile URL: {platformDetails[platform]?.profileUrl}
- Followers: {platformDetails[platform]?.followers}
- Posts: {platformDetails[platform]?.posts}
- Pricing: {platform === 'Instagram' ? `Post: ${pricing[platform]?.per_post_cost}, Story: ${pricing[platform]?.per_story_cost}, Reel: ${pricing[platform]?.per_reel_cost}` : `Post/Video: ${pricing[platform]?.per_post_cost || pricing[platform]?.per_video_cost}`} ({pricing[platform]?.currency})
- >
- )}
-
-
- ))}
-
- {submitError &&
{submitError}
}
- {submitSuccess &&
{submitSuccess}
}
-
- );
-
- const handleNext = () => {
- if (step === 1) {
- const err = validatePersonal();
- if (err) {
- setPersonalError(err);
- return;
- } else {
- setPersonalError("");
- }
- }
- if (step === 3) {
- const err = validatePlatformDetails();
- if (err) {
- setPlatformDetailsError(err);
- return;
- } else {
- setPlatformDetailsError("");
- }
- }
- if (step === 4) {
- const err = validatePricing();
- if (err) {
- setPricingError(err);
- return;
- } else {
- setPricingError("");
- }
- }
- if (step < steps.length - 1) setStep(step + 1);
- };
- const handleBack = () => {
- if (step > 0) setStep(step - 1);
- };
-
- // Brand onboarding steps
- const brandSteps = [
- "Brand Details",
- "Contact Information",
- "Platforms",
- "Social Links",
- "Collaboration Preferences",
- "Review & Submit",
- ];
-
- // Brand Step 1: Brand Details
- const companySizes = ["1-10", "11-50", "51-200", "201-1000", "1000+"];
- const industries = ["Tech", "Fashion", "Travel", "Food", "Fitness", "Beauty", "Gaming", "Education", "Music", "Finance", "Other"];
- const handleBrandLogoChange = (e: React.ChangeEvent) => {
- if (e.target.files && e.target.files[0]) {
- setBrandData({ ...brandData, logo: e.target.files[0] });
- setBrandLogoPreview(URL.createObjectURL(e.target.files[0]));
- }
- };
- const renderBrandDetailsStep = () => (
-
- );
-
- // Brand Step 2: Contact Information
- const renderBrandContactStep = () => (
-
-
Contact Information
- setBrandData({ ...brandData, contact_person: e.target.value })}
- className="w-full px-4 py-3 rounded-lg border border-gray-300 mb-2"
- />
- setBrandData({ ...brandData, contact_email: e.target.value })}
- className="w-full px-4 py-3 rounded-lg border border-gray-300 mb-2"
- />
- setBrandData({ ...brandData, contact_phone: e.target.value })}
- className="w-full px-4 py-3 rounded-lg border border-gray-300 mb-2"
- />
- setBrandData({ ...brandData, role: e.target.value })}
- className="w-full px-4 py-3 rounded-lg border border-gray-300 mb-2"
- />
-
- );
-
- // Brand Step 3: Platforms
- const allBrandPlatforms = [
- { name: "Instagram", key: "instagram_url" },
- { name: "YouTube", key: "youtube_url" },
- { name: "Facebook", key: "facebook_url" },
- { name: "Twitter", key: "twitter_url" },
- { name: "LinkedIn", key: "linkedin_url" },
- // Add TikTok if needed
- ];
- const renderBrandPlatformsStep = () => (
-
-
Which platforms is your brand on?
-
- {allBrandPlatforms.map(platform => (
- {
- setBrandData(prev => {
- const exists = prev.platforms.includes(platform.name);
- return {
- ...prev,
- platforms: exists
- ? prev.platforms.filter(p => p !== platform.name)
- : [...prev.platforms, platform.name],
- };
- });
- }}
- className={`px-6 py-3 rounded-lg border-2 font-semibold ${brandData.platforms.includes(platform.name) ? "border-purple-600 bg-purple-50" : "border-gray-300 bg-white"}`}
- >
- {platform.name}
-
- ))}
-
-
- );
-
- // Brand Step 4: Social Links (conditional)
- const socialLinkExamples: Record = {
- instagram_url: "https://instagram.com/yourbrand",
- youtube_url: "https://youtube.com/yourbrand",
- facebook_url: "https://facebook.com/yourbrand",
- twitter_url: "https://twitter.com/yourbrand",
- linkedin_url: "https://linkedin.com/company/yourbrand",
- };
- const renderBrandSocialLinksStep = () => (
-
-
Social Links
- {brandData.platforms.map(platform => {
- const key = allBrandPlatforms.find(p => p.name === platform)?.key;
- if (!key) return null;
- return (
-
- {platform} URL
- setBrandData({
- ...brandData,
- social_links: { ...brandData.social_links, [key]: e.target.value },
- })}
- className="w-full px-4 py-3 rounded-lg border border-gray-300"
- />
-
- );
- })}
-
- );
-
- // Brand Step 5: Collaboration Preferences
- const collabTypes = ["Sponsored Posts", "Giveaways", "Product Reviews", "Long-term Partnerships", "Affiliate Marketing", "Events", "Content Creation", "Brand Ambassadorship", "Social Media Takeover", "Other"];
- const creatorCategories = ["Tech", "Fashion", "Travel", "Food", "Fitness", "Beauty", "Gaming", "Education", "Music", "Finance", "Other"];
- const brandValues = ["Sustainability", "Innovation", "Diversity", "Quality", "Community", "Transparency", "Customer Focus", "Creativity", "Integrity", "Other"];
- const tones = ["Professional", "Friendly", "Humorous", "Inspirational", "Bold", "Casual", "Formal", "Playful", "Serious", "Other"];
- const toggleMultiSelect = (field: keyof BrandData, value: string) => {
- setBrandData(prev => {
- const arr = prev[field] as string[];
- return {
- ...prev,
- [field]: arr.includes(value) ? arr.filter(v => v !== value) : [...arr, value],
- };
- });
- };
- const renderBrandCollabPrefsStep = () => (
-
-
Collaboration Preferences
-
-
Collaboration Types
-
- {collabTypes.map(type => (
- toggleMultiSelect("collaboration_types", type)}
- className={`px-4 py-2 rounded-lg border-2 text-sm ${brandData.collaboration_types.includes(type) ? "border-purple-600 bg-purple-50" : "border-gray-300 bg-white"}`}
- >
- {type}
-
- ))}
-
-
-
-
Preferred Creator Categories
-
- {creatorCategories.map(cat => (
- toggleMultiSelect("preferred_creator_categories", cat)}
- className={`px-4 py-2 rounded-lg border-2 text-sm ${brandData.preferred_creator_categories.includes(cat) ? "border-purple-600 bg-purple-50" : "border-gray-300 bg-white"}`}
- >
- {cat}
-
- ))}
-
-
-
-
Brand Values
-
- {brandValues.map(val => (
- toggleMultiSelect("brand_values", val)}
- className={`px-4 py-2 rounded-lg border-2 text-sm ${brandData.brand_values.includes(val) ? "border-purple-600 bg-purple-50" : "border-gray-300 bg-white"}`}
- >
- {val}
-
- ))}
-
-
-
-
Preferred Tone
-
- {tones.map(tone => (
- toggleMultiSelect("preferred_tone", tone)}
- className={`px-4 py-2 rounded-lg border-2 text-sm ${brandData.preferred_tone.includes(tone) ? "border-purple-600 bg-purple-50" : "border-gray-300 bg-white"}`}
- >
- {tone}
-
- ))}
-
-
-
- );
-
- // Brand step validation
- const validateBrandStep = () => {
- if (brandStep === 0) {
- if (!brandData.brand_name) return "Brand name is required.";
- if (!brandData.website_url) return "Website URL is required.";
- if (!brandData.industry) return "Industry is required.";
- if (!brandData.company_size) return "Company size is required.";
- if (!brandData.location) return "Location is required.";
- if (!brandData.description) return "Description is required.";
- }
- if (brandStep === 1) {
- if (!brandData.contact_person) return "Contact person is required.";
- if (!brandData.contact_email || !/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(brandData.contact_email)) return "Valid contact email is required.";
- }
- if (brandStep === 2) {
- if (!brandData.platforms.length) return "Select at least one platform.";
- }
- if (brandStep === 3) {
- for (const platform of brandData.platforms) {
- const key = allBrandPlatforms.find(p => p.name === platform)?.key;
- if (key && !brandData.social_links[key]) return `Enter your ${platform} URL.`;
- if (key && brandData.social_links[key] && !/^https?:\/\//.test(brandData.social_links[key])) return `${platform} URL must start with http:// or https://`;
- }
- }
- if (brandStep === 4) {
- if (!brandData.collaboration_types.length) return "Select at least one collaboration type.";
- if (!brandData.preferred_creator_categories.length) return "Select at least one creator category.";
- if (!brandData.brand_values.length) return "Select at least one brand value.";
- if (!brandData.preferred_tone.length) return "Select at least one preferred tone.";
- }
- return "";
- };
- const handleBrandNext = () => {
- const err = validateBrandStep();
- if (err) {
- setBrandError(err);
- return;
- } else {
- setBrandError("");
- }
- if (brandStep < brandSteps.length - 1) setBrandStep(brandStep + 1);
- };
- const handleBrandBack = () => {
- if (brandStep > 0) setBrandStep(brandStep - 1);
- };
-
- // Brand Step 6: Review & Submit
- const [brandSubmitting, setBrandSubmitting] = useState(false);
- const [brandSubmitError, setBrandSubmitError] = useState("");
- const [brandSubmitSuccess, setBrandSubmitSuccess] = useState("");
- const handleBrandSubmit = async () => {
- setBrandSubmitting(true);
- setBrandSubmitError("");
- setBrandSubmitSuccess("");
- let logo_url = null;
- try {
- // 1. Upload logo if provided
- if (brandData.logo) {
- const fileExt = brandData.logo.name.split('.').pop();
- const fileName = `${user?.id}_${Date.now()}.${fileExt}`;
- const { data, error } = await supabase.storage.from('brand-logos').upload(fileName, brandData.logo);
- if (error) throw error;
- logo_url = supabase.storage.from('brand-logos').getPublicUrl(fileName).data.publicUrl;
- }
- // 2. Insert into brands table
- const { error: brandError } = await supabase.from('brands').insert({
- user_id: user?.id,
- brand_name: brandData.brand_name,
- logo_url,
- website_url: brandData.website_url,
- industry: brandData.industry,
- company_size: brandData.company_size,
- location: brandData.location,
- description: brandData.description,
- contact_person: brandData.contact_person,
- contact_email: brandData.contact_email,
- contact_phone: brandData.contact_phone,
- role: brandData.role,
- instagram_url: brandData.social_links.instagram_url || null,
- facebook_url: brandData.social_links.facebook_url || null,
- twitter_url: brandData.social_links.twitter_url || null,
- linkedin_url: brandData.social_links.linkedin_url || null,
- youtube_url: brandData.social_links.youtube_url || null,
- collaboration_types: brandData.collaboration_types,
- preferred_creator_categories: brandData.preferred_creator_categories,
- brand_values: brandData.brand_values,
- preferred_tone: brandData.preferred_tone,
- platforms: brandData.platforms,
- });
- if (brandError) throw brandError;
- setBrandSubmitSuccess("Brand onboarding complete! Redirecting to dashboard...");
- // Clear localStorage for brand onboarding
- localStorage.removeItem("brandStep");
- localStorage.removeItem("brandData");
- setTimeout(() => navigate("/brand/dashboard"), 1200);
- } catch (err: any) {
- setBrandSubmitError(err.message || "Failed to submit brand onboarding data.");
- } finally {
- setBrandSubmitting(false);
- }
- };
- const renderBrandReviewStep = () => (
-
-
Review & Submit
-
-
Logo
- {(brandLogoPreview || brandData.logo) ? (
-
- ) : (
-
No Logo
- )}
-
-
-
Brand Details
-
- Name: {brandData.brand_name}
- Website: {brandData.website_url}
- Industry: {brandData.industry}
- Company Size: {brandData.company_size}
- Location: {brandData.location}
- Description: {brandData.description}
-
-
-
-
Contact Information
-
- Contact Person: {brandData.contact_person}
- Email: {brandData.contact_email}
- Phone: {brandData.contact_phone}
- Role: {brandData.role}
-
-
-
-
Platforms & Social Links
-
- {brandData.platforms.map(platform => {
- const key = allBrandPlatforms.find(p => p.name === platform)?.key;
- return (
- {platform}: {key ? brandData.social_links[key] : ""}
- );
- })}
-
-
-
-
Collaboration Preferences
-
- Collaboration Types: {brandData.collaboration_types.join(", ")}
- Preferred Creator Categories: {brandData.preferred_creator_categories.join(", ")}
- Brand Values: {brandData.brand_values.join(", ")}
- Preferred Tone: {brandData.preferred_tone.join(", ")}
-
-
- {brandSubmitError &&
{brandSubmitError}
}
- {brandSubmitSuccess &&
{brandSubmitSuccess}
}
-
- {brandSubmitting ? 'Submitting...' : 'Submit'}
-
-
- );
-
- // Persist and restore brand onboarding state
- useEffect(() => {
- const savedStep = localStorage.getItem("brandStep");
- const savedData = localStorage.getItem("brandData");
- if (savedStep) setBrandStep(Number(savedStep));
- if (savedData) setBrandData(JSON.parse(savedData));
- }, []);
- useEffect(() => {
- localStorage.setItem("brandStep", String(brandStep));
- localStorage.setItem("brandData", JSON.stringify(brandData));
- }, [brandStep, brandData]);
-
- return (
-
-
- {/* Stepper UI */}
-
- {role === "brand"
- ? brandSteps.map((label, idx) => (
-
{label}
- ))
- : steps.map((label, idx) => (
-
{label}
- ))}
-
- {/* Step Content */}
-
- {role === "brand" ? (
- <>
- {brandStep === 0 && renderBrandDetailsStep()}
- {brandStep === 1 && renderBrandContactStep()}
- {brandStep === 2 && renderBrandPlatformsStep()}
- {brandStep === 3 && renderBrandSocialLinksStep()}
- {brandStep === 4 && renderBrandCollabPrefsStep()}
- {brandStep === 5 && renderBrandReviewStep()}
- >
- ) : (
- <>
- {step === 0 && renderRoleStep()}
- {step === 1 && renderPersonalStep()}
- {step === 2 && renderPlatformStep()}
- {step === 3 && renderPlatformDetailsStep()}
- {step === 4 && renderPricingStep()}
- {step === 5 && renderProfilePicStep()}
- {step === 6 && renderReviewStep()}
- >
- )}
-
- {/* Navigation */}
-
- {role === "brand" ? (
- <>
-
- Back
-
- {brandStep < brandSteps.length - 1 ? (
-
- Next
-
- ) : null}
- >
- ) : (
- <>
-
- Back
-
- {step < steps.length - 1 ? (
-
- Next
-
- ) : (
-
- {submitting ? 'Submitting...' : 'Submit'}
-
- )}
- >
- )}
-
- {brandError &&
{brandError}
}
-
-
- );
-}
-
-// Platform detail components
-function YouTubeDetails({ details, setDetails }: { details: any, setDetails: (d: any) => void }) {
- const [input, setInput] = useState(details.channelUrl || "");
- const [loading, setLoading] = useState(false);
- const [error, setError] = useState("");
- const [showInfo, setShowInfo] = useState(false);
-
- const fetchChannel = async () => {
- setLoading(true);
- setError("");
- let channelId = input;
- // Extract channel ID from URL if needed
- if (input.includes("youtube.com")) {
- const match = input.match(/(?:channel\/|user\/|c\/)?([\w-]{21,})/);
- if (match) channelId = match[1];
- }
- try {
- const res = await fetch(
- `/youtube/channel-info?channelId=${encodeURIComponent(channelId)}`
- );
- if (!res.ok) {
- let errMsg = `Error: ${res.status}`;
- try {
- const errData = await res.json();
- if (errData && errData.detail) errMsg = errData.detail;
- } catch {}
- setError(errMsg);
- return;
- }
- const data = await res.json();
- if (data.items && data.items.length > 0) {
- const ch = data.items[0];
- setDetails({
- channelUrl: input,
- channelId: ch.id,
- channelName: ch.snippet.title,
- profile_image: ch.snippet.thumbnails.default.url,
- subscriber_count: ch.statistics.subscriberCount,
- total_views: ch.statistics.viewCount,
- video_count: ch.statistics.videoCount,
- });
- } else {
- setError("Channel not found");
- }
- } catch (e) {
- setError("Failed to fetch channel. Please check your network connection or try again later.");
- } finally {
- setLoading(false);
- }
- };
-
- return (
-
-
- YouTube Channel URL or ID
- setShowInfo(true)}
- className="ml-1 text-purple-600 hover:text-purple-800 focus:outline-none"
- aria-label="How to find your YouTube channel URL or ID"
- >
-
-
-
-
setInput(e.target.value)}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="e.g. https://www.youtube.com/channel/UCxxxxxxxxxxxxxxxxxxx or channel ID"
- />
- {/* Info Dialog */}
- {showInfo && (
-
-
-
setShowInfo(false)}
- aria-label="Close"
- >
- ×
-
-
How to find your YouTube Channel URL or ID
-
- Go to youtube.com and sign in.
- Click your profile picture at the top right and select Your Channel .
- Click Customize Channel (top right).
- Go to the Basic info tab.
- Find the Channel URL section and copy the URL shown there.
- Paste the full Channel URL above (e.g. https://www.youtube.com/channel/UCxxxxxxxxxxxxxxxxxxx ).
-
-
-
- )}
-
- {loading ? "Fetching..." : "Fetch Channel"}
-
- {error &&
{error}
}
- {details.channelName && (
-
-
Name: {details.channelName}
-
Subscribers: {details.subscriber_count}
-
Videos: {details.video_count}
-
Views: {details.total_views}
-
- )}
-
- );
-}
-
-function InstagramDetails({ details, setDetails }: { details: any, setDetails: (d: any) => void }) {
- return (
-
- Instagram Profile URL
- setDetails({ ...details, profileUrl: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="Paste your Instagram profile URL"
- />
- Followers
- setDetails({ ...details, followers: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="Followers count"
- />
- Posts
- setDetails({ ...details, posts: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="Number of posts"
- />
-
- );
-}
-
-function FacebookDetails({ details, setDetails }: { details: any, setDetails: (d: any) => void }) {
- return (
-
- Facebook Profile URL
- setDetails({ ...details, profileUrl: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="Paste your Facebook profile URL"
- />
- Followers
- setDetails({ ...details, followers: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="Followers count"
- />
- Posts
- setDetails({ ...details, posts: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="Number of posts"
- />
-
- );
-}
-
-function TikTokDetails({ details, setDetails }: { details: any, setDetails: (d: any) => void }) {
- return (
-
- TikTok Profile URL
- setDetails({ ...details, profileUrl: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="Paste your TikTok profile URL"
- />
- Followers
- setDetails({ ...details, followers: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="Followers count"
- />
- Posts
- setDetails({ ...details, posts: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="Number of posts"
- />
-
- );
-}
-
-// Pricing components
-function YouTubePricing({ pricing, setPricing }: { pricing: any, setPricing: (d: any) => void }) {
- return (
-
- Per Video
- setPricing({ ...pricing, per_video_cost: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="Price per video"
- />
- Per Short
- setPricing({ ...pricing, per_short_cost: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="Price per short"
- />
- Per Community Post
- setPricing({ ...pricing, per_community_post_cost: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="Price per community post"
- />
- Currency
- setPricing({ ...pricing, currency: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="e.g. USD, INR"
- />
-
- );
-}
-
-function InstagramPricing({ pricing, setPricing }: { pricing: any, setPricing: (d: any) => void }) {
- return (
-
- Per Post
- setPricing({ ...pricing, per_post_cost: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="Price per post"
- />
- Per Story
- setPricing({ ...pricing, per_story_cost: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="Price per story"
- />
- Per Reel
- setPricing({ ...pricing, per_reel_cost: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="Price per reel"
- />
- Currency
- setPricing({ ...pricing, currency: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="e.g. USD, INR"
- />
-
- );
-}
-
-function FacebookPricing({ pricing, setPricing }: { pricing: any, setPricing: (d: any) => void }) {
- return (
-
- Per Post
- setPricing({ ...pricing, per_post_cost: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="Price per post"
- />
- Currency
- setPricing({ ...pricing, currency: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="e.g. USD, INR"
- />
-
- );
-}
-
-function TikTokPricing({ pricing, setPricing }: { pricing: any, setPricing: (d: any) => void }) {
- return (
-
- Per Video
- setPricing({ ...pricing, per_video_cost: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="Price per video"
- />
- Currency
- setPricing({ ...pricing, currency: e.target.value })}
- className="w-full px-4 py-2 rounded border border-gray-300"
- placeholder="e.g. USD, INR"
- />
-
- );
-}
diff --git a/Frontend/src/components/ProtectedRoute.tsx b/Frontend/src/components/ProtectedRoute.tsx
deleted file mode 100644
index 5f9564f..0000000
--- a/Frontend/src/components/ProtectedRoute.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Navigate } from "react-router-dom";
-import { useAuth } from "../context/AuthContext";
-
-const ProtectedRoute = ({ children }: { children: React.ReactNode }) => {
- const { isAuthenticated } = useAuth();
-
- return isAuthenticated ? children : ;
-};
-
-export default ProtectedRoute;
diff --git a/Frontend/src/components/PublicRoute.tsx b/Frontend/src/components/PublicRoute.tsx
deleted file mode 100644
index 7bb29a7..0000000
--- a/Frontend/src/components/PublicRoute.tsx
+++ /dev/null
@@ -1,69 +0,0 @@
-import { Navigate } from "react-router-dom";
-import { useAuth } from "../context/AuthContext";
-import { useState, useEffect } from "react";
-
-interface PublicRouteProps {
- children: React.ReactNode;
- redirectTo?: string;
-}
-
-const PublicRoute = ({ children, redirectTo = "/dashboard" }: PublicRouteProps) => {
- const { isAuthenticated, user, checkUserOnboarding } = useAuth();
- const [redirectPath, setRedirectPath] = useState(null);
- const [isChecking, setIsChecking] = useState(false);
-
- useEffect(() => {
- if (isAuthenticated && user && !isChecking) {
- // Add a simple cache to prevent repeated checks
- const cacheKey = `onboarding_check_${user.id}`;
- const cachedResult = sessionStorage.getItem(cacheKey);
-
- if (cachedResult) {
- const { hasOnboarding, role } = JSON.parse(cachedResult);
- if (hasOnboarding) {
- if (role === "brand") {
- setRedirectPath("/brand/dashboard");
- } else {
- setRedirectPath("/dashboard");
- }
- } else {
- setRedirectPath("/onboarding");
- }
- return;
- }
-
- setIsChecking(true);
- console.log("PublicRoute: Checking user onboarding status");
- checkUserOnboarding(user).then(({ hasOnboarding, role }) => {
- console.log("PublicRoute: Onboarding check result", { hasOnboarding, role });
-
- // Cache the result for 2 minutes
- sessionStorage.setItem(cacheKey, JSON.stringify({ hasOnboarding, role }));
- setTimeout(() => sessionStorage.removeItem(cacheKey), 2 * 60 * 1000);
-
- if (hasOnboarding) {
- if (role === "brand") {
- setRedirectPath("/brand/dashboard");
- } else {
- setRedirectPath("/dashboard");
- }
- } else {
- setRedirectPath("/onboarding");
- }
- setIsChecking(false);
- }).catch(error => {
- console.error("PublicRoute: Error checking onboarding", error);
- setIsChecking(false);
- });
- }
- }, [isAuthenticated, user, checkUserOnboarding, isChecking]);
-
- if (redirectPath) {
- console.log("PublicRoute: Redirecting to", redirectPath);
- return ;
- }
-
- return <>{children}>;
-};
-
-export default PublicRoute;
\ No newline at end of file
diff --git a/Frontend/src/components/analytics/audience-metrics.tsx b/Frontend/src/components/analytics/audience-metrics.tsx
deleted file mode 100644
index e69de29..0000000
diff --git a/Frontend/src/components/analytics/campaign-comparison.tsx b/Frontend/src/components/analytics/campaign-comparison.tsx
deleted file mode 100644
index e69de29..0000000
diff --git a/Frontend/src/components/analytics/performance-overview.tsx b/Frontend/src/components/analytics/performance-overview.tsx
deleted file mode 100644
index e69de29..0000000
diff --git a/Frontend/src/components/analytics/revenue-analytics.tsx b/Frontend/src/components/analytics/revenue-analytics.tsx
deleted file mode 100644
index e69de29..0000000
diff --git a/Frontend/src/components/chat/chat-item.tsx b/Frontend/src/components/chat/chat-item.tsx
deleted file mode 100644
index bd575a7..0000000
--- a/Frontend/src/components/chat/chat-item.tsx
+++ /dev/null
@@ -1,72 +0,0 @@
-import { Chat } from "@/redux/chatSlice";
-import React, { useEffect } from "react";
-import { Avatar, AvatarFallback, AvatarImage } from "../ui/avatar";
-import { cn } from "@/lib/utils";
-import { useSelector } from "react-redux";
-import { RootState } from "@/redux/store";
-import { useChat } from "@/lib/useChat";
-import { formatDistanceToNow } from "date-fns";
-
-function formatChatDate(lastSeen: string | null) {
- if (!lastSeen) return "";
- const date = new Date(lastSeen);
- return formatDistanceToNow(date, { addSuffix: true });
-}
-
-export default function ChatItem({
- chat,
- handleChatClick,
-}: {
- chat: Chat;
- handleChatClick: (chatId: string) => void;
-}) {
- const selectedChatId = useSelector(
- (state: RootState) => state.chat.selectedChatId
- );
-
- const lastMessage = useSelector((state: RootState) =>
- chat.messageIds.length
- ? state.chat.messages[chat.messageIds[chat.messageIds.length - 1]].message
- : null
- );
-
- const { fetchUserDetails } = useChat();
-
- useEffect(() => {
- if (!chat.receiver.username) {
- fetchUserDetails(chat.receiver.id, chat.id);
- }
- }, [chat.receiver.username]);
-
- if (!chat.receiver.username) return null;
-
- return (
- handleChatClick(chat.id)}
- >
-
-
-
- {chat.receiver.username?.[0] || "U"}
-
-
-
-
- {chat.receiver.username}
-
-
- {formatChatDate(chat.lastMessageTime)}
-
-
-
{lastMessage}
-
-
-
- );
-}
diff --git a/Frontend/src/components/chat/chat-list.tsx b/Frontend/src/components/chat/chat-list.tsx
deleted file mode 100644
index 19a1431..0000000
--- a/Frontend/src/components/chat/chat-list.tsx
+++ /dev/null
@@ -1,68 +0,0 @@
-"use client";
-import { useEffect, useState } from "react";
-import { Input } from "../ui/input";
-import { useDispatch, useSelector } from "react-redux";
-import { RootState } from "@/redux/store";
-import { Chat, setSelectedChat } from "@/redux/chatSlice";
-
-import { useChat } from "@/lib/useChat";
-import ChatItem from "./chat-item";
-import { CreateNewChat } from "./create-new-chat";
-import ChatSearch from "./chat-search";
-
-export default function ChatList() {
- const chats = useSelector((state: RootState) => state.chat.chats);
- const [sortedChatList, setSortedChatList] = useState([]);
- const dispatch = useDispatch();
- const { fetchChatList } = useChat();
- const [loading, setLoading] = useState(false);
-
- useEffect(() => {
- setLoading(true);
- fetchChatList().finally(() => {
- setLoading(false);
- });
- }, []);
-
- useEffect(() => {
- const sortedList = Object.values(chats).sort((a, b) => {
- return (
- new Date(b.lastMessageTime).getTime() -
- new Date(a.lastMessageTime).getTime()
- );
- });
- setSortedChatList(sortedList);
- }, [chats]);
-
- const handleChatClick = (chatId: string) => {
- dispatch(setSelectedChat(chatId));
- };
-
- return (
-
-
-
-
-
-
- {loading && (
-
- )}
- {!loading && sortedChatList.length === 0 && (
-
- )}
- {sortedChatList.map((chat) => (
-
- ))}
-
-
- );
-}
diff --git a/Frontend/src/components/chat/chat-search.tsx b/Frontend/src/components/chat/chat-search.tsx
deleted file mode 100644
index 7ef2366..0000000
--- a/Frontend/src/components/chat/chat-search.tsx
+++ /dev/null
@@ -1,140 +0,0 @@
-import React, { useState, useEffect } from "react";
-import { useDispatch, useSelector } from "react-redux";
-import { RootState } from "@/redux/store";
-import { setSelectedChat } from "@/redux/chatSlice";
-import { Input } from "@/components/ui/input";
-import { Search as SearchIcon } from "lucide-react";
-import {
- Popover,
- PopoverContent,
- PopoverTrigger,
-} from "@/components/ui/popover";
-import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
-import { Button } from "@/components/ui/button";
-
-const ChatSearch = () => {
- const dispatch = useDispatch();
- const chats = useSelector((state: RootState) => state.chat.chats);
- const messages = useSelector((state: RootState) => state.chat.messages);
-
- const [isOpen, setIsOpen] = useState(false);
- const [searchQuery, setSearchQuery] = useState("");
- const [searchResults, setSearchResults] = useState([]);
-
- useEffect(() => {
- if (searchQuery.trim() === "") {
- setSearchResults([]);
- return;
- }
-
- const results: any[] = [];
- const query = searchQuery.toLowerCase();
-
- // Search through chats for username matches
- Object.values(chats).forEach((chat) => {
- if (chat.receiver.username?.toLowerCase().includes(query)) {
- results.push({
- type: "chat",
- chatId: chat.id,
- username: chat.receiver.username,
- profileImage: chat.receiver.profileImage,
- });
- }
-
- // Search through messages in this chat
- const chatMessages = chat.messageIds
- .map((id) => messages[id])
- .filter((message) => message?.message.toLowerCase().includes(query));
-
- chatMessages.forEach((message) => {
- results.push({
- type: "message",
- chatId: chat.id,
- messageId: message.id,
- messagePreview: message.message,
- username: chat.receiver.username,
- profileImage: chat.receiver.profileImage,
- });
- });
- });
-
- setSearchResults(results);
- }, [searchQuery, chats, messages]);
-
- const handleResultClick = (chatId: string) => {
- dispatch(setSelectedChat(chatId));
- setIsOpen(false);
- setSearchQuery("");
- };
-
- const renderSearchResults = () => {
- if (searchResults.length === 0 && searchQuery.trim() !== "") {
- return (
-
- No results found
-
- );
- }
-
- return searchResults.map((result, index) => (
- handleResultClick(result.chatId)}
- >
-
-
-
-
- {result.username ? result.username.charAt(0).toUpperCase() : "?"}
-
-
-
- {result.username || "Unknown"}
- {result.type === "message" && (
-
- {result.messagePreview}
-
- )}
-
-
-
- ));
- };
-
- return (
-
-
-
-
- {
- setSearchQuery(e.target.value);
- if (e.target.value.trim() !== "") {
- setIsOpen(true);
- }
- }}
- onFocus={() => {
- if (searchQuery.trim() !== "") {
- setIsOpen(true);
- }
- }}
- />
-
-
- e.preventDefault()} // This prevents the auto focus
- >
- {renderSearchResults()}
-
-
- );
-};
-
-export default ChatSearch;
diff --git a/Frontend/src/components/chat/chat.tsx b/Frontend/src/components/chat/chat.tsx
deleted file mode 100644
index e177e68..0000000
--- a/Frontend/src/components/chat/chat.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import { ChatProvider } from "@/lib/useChat";
-import ChatList from "./chat-list";
-import MessagesView from "./messages-view";
-import { useState } from "react";
-import { Input } from "../ui/input";
-import { Button } from "../ui/button";
-
-export default function Chat() {
- const [inputUserId, setInputUserId] = useState(null);
- const [userId, setUserId] = useState(null);
- return (
- <>
-
- setInputUserId(e.target.value)}
- placeholder="Enter user ID"
- className="mb-4 max-w-xl ml-auto"
- disabled={!!userId}
- />
- {
- setUserId(inputUserId);
- }}
- className="absolute right-2 top-1"
- >
- {userId ? "Connected" : "Connect"}
-
-
- {userId && (
-
-
-
-
-
-
- )}
- >
- );
-}
diff --git a/Frontend/src/components/chat/create-new-chat.tsx b/Frontend/src/components/chat/create-new-chat.tsx
deleted file mode 100644
index 603b059..0000000
--- a/Frontend/src/components/chat/create-new-chat.tsx
+++ /dev/null
@@ -1,100 +0,0 @@
-"use client";
-import { useState } from "react";
-import { Button } from "@/components/ui/button";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogFooter,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
-} from "@/components/ui/dialog";
-import { Input } from "@/components/ui/input";
-import { Label } from "@/components/ui/label";
-import { Textarea } from "@/components/ui/textarea";
-import { CirclePlus } from "lucide-react";
-import { useChat } from "@/lib/useChat";
-
-export function CreateNewChat() {
- const [open, setOpen] = useState(false);
- const [loading, setLoading] = useState(false);
- const [username, setUsername] = useState("");
- const [message, setMessage] = useState("");
- const { createChatWithMessage } = useChat();
-
- const handleSubmit = async (e: React.FormEvent) => {
- e.preventDefault();
-
- if (!username.trim() || !message.trim()) {
- return;
- }
-
- setLoading(true);
-
- createChatWithMessage(username, message)
- .then((success) => {
- if (success) {
- setUsername("");
- setMessage("");
- } else {
- // Handle error
- console.error("Failed to create chat");
- }
- })
- .finally(() => {
- setOpen(false);
- setLoading(false);
- });
- };
-
- return (
-
-
-
-
-
-
-
-
- );
-}
diff --git a/Frontend/src/components/chat/message-input.tsx b/Frontend/src/components/chat/message-input.tsx
deleted file mode 100644
index e21d333..0000000
--- a/Frontend/src/components/chat/message-input.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import React, { useState } from "react";
-import { Input } from "../ui/input";
-import { Button } from "../ui/button";
-import { Send } from "lucide-react";
-import { useSelector } from "react-redux";
-import { RootState } from "@/redux/store";
-import { useChat } from "@/lib/useChat";
-
-export default function MessageInput({
- containerRef,
-}: {
- containerRef: React.RefObject;
-}) {
- const [message, setMessage] = useState("");
- const receiverId = useSelector(
- (state: RootState) =>
- state.chat.chats[state.chat.selectedChatId!].receiver.id
- );
- const { sendMessage } = useChat();
- const handleSendMessage = () => {
- if (message.trim() === "") return;
- sendMessage(receiverId, message);
- setMessage("");
- // Scroll to the bottom of the container
- setTimeout(() => {
- if (containerRef.current) {
- containerRef.current.scrollTop = containerRef.current.scrollHeight;
- }
- }, 1000);
- };
- const handleKeyDown = (event: React.KeyboardEvent) => {
- if (event.key === "Enter") {
- event.preventDefault();
- handleSendMessage();
- }
- };
- return (
-
-
- setMessage(e.target.value)}
- onKeyDown={handleKeyDown}
- />
-
-
-
-
-
- );
-}
diff --git a/Frontend/src/components/chat/message-item.tsx b/Frontend/src/components/chat/message-item.tsx
deleted file mode 100644
index 3082604..0000000
--- a/Frontend/src/components/chat/message-item.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import { type Message } from "@/redux/chatSlice";
-import { CheckCheckIcon, CheckIcon } from "lucide-react";
-
-import React from "react";
-
-export default function MessageItem({ message }: { message: Message }) {
- return (
- <>
- {message.isSent ? (
-
-
-
{message.message}
-
-
- {new Date(message.createdAt).toLocaleTimeString([], {
- hour: "2-digit",
- minute: "2-digit",
- })}
-
- {message.status === "sent" && (
-
-
-
- )}
- {message.status === "delivered" && (
-
-
-
- )}
- {message.status === "seen" && (
-
-
-
- )}
-
-
-
- ) : (
-
-
-
{message.message}
-
-
- {new Date(message.createdAt).toLocaleTimeString([], {
- hour: "2-digit",
- minute: "2-digit",
- })}
-
-
-
-
- )}
- >
- );
-}
diff --git a/Frontend/src/components/chat/messages-list.tsx b/Frontend/src/components/chat/messages-list.tsx
deleted file mode 100644
index 429b529..0000000
--- a/Frontend/src/components/chat/messages-list.tsx
+++ /dev/null
@@ -1,104 +0,0 @@
-import { Message } from "@/redux/chatSlice";
-import React, { JSX, useEffect } from "react";
-import { format, isEqual, parseISO } from "date-fns";
-import MessageItem from "./message-item";
-import { useChat } from "@/lib/useChat";
-import { useSelector } from "react-redux";
-import { RootState } from "@/redux/store";
-
-export default function MessagesList({ messages }: { messages: Message[] }) {
- const [lastMarkedAsSeen, setLastMarkedAsSeen] = React.useState(
- new Date().toISOString()
- );
- const selectedChatId = useSelector(
- (state: RootState) => state.chat.selectedChatId
- );
-
- useEffect(() => {
- setLastMarkedAsSeen(new Date().toISOString());
- }, [selectedChatId]);
-
- const { markMessageAsSeen } = useChat();
-
- useEffect(() => {
- const unseenMessages = messages.filter(
- (message) =>
- message.isSent === false &&
- new Date(message.createdAt).getTime() >
- new Date(lastMarkedAsSeen).getTime()
- );
- if (unseenMessages.length > 0) {
- unseenMessages.forEach((message) => {
- markMessageAsSeen(message.chatListId, message.id);
- });
- setLastMarkedAsSeen(new Date().toISOString());
- }
- }, [messages]);
-
- return (
- <>
- {messages.length > 0 ? (
- <>
- {messages.reduce((acc: JSX.Element[], message, index, array) => {
- // Add date separator for first message
- if (index === 0) {
- const firstDate = parseISO(message.createdAt);
- acc.push(
-
-
- {format(firstDate, "PPP")}
-
-
- );
- }
-
- // Add the message component
- acc.push( );
-
- // Check if the next message is from a different date
- if (index < array.length - 1) {
- const currentDate = parseISO(message.createdAt);
- const nextDate = parseISO(array[index + 1].createdAt);
-
- // Check if dates are different
- if (
- !isEqual(
- new Date(
- currentDate.getFullYear(),
- currentDate.getMonth(),
- currentDate.getDate()
- ),
- new Date(
- nextDate.getFullYear(),
- nextDate.getMonth(),
- nextDate.getDate()
- )
- )
- ) {
- acc.push(
-
-
- {format(nextDate, "PPP")}
-
-
- );
- }
- }
-
- return acc;
- }, [])}
- >
- ) : (
-
- )}
- >
- );
-}
diff --git a/Frontend/src/components/chat/messages-view.tsx b/Frontend/src/components/chat/messages-view.tsx
deleted file mode 100644
index 13167e1..0000000
--- a/Frontend/src/components/chat/messages-view.tsx
+++ /dev/null
@@ -1,161 +0,0 @@
-import React, { useEffect, useRef, useState } from "react";
-import { useDispatch, useSelector } from "react-redux";
-import { RootState } from "@/redux/store";
-import SelectedUserCard from "./selected-user-card";
-import MessageInput from "./message-input";
-import MessagesList from "./messages-list";
-import { useChat } from "@/lib/useChat";
-import { Loader2 } from "lucide-react";
-
-export default function MessagesView() {
- const selectedChatId = useSelector(
- (state: RootState) => state.chat.selectedChatId
- );
- const dispatch = useDispatch();
- const [lastFetchedTime, setLastFetchedTime] = useState(
- new Date().getTime()
- );
- const [loading, setLoading] = useState(false);
- const [hasMore, setHasMore] = useState(true);
- const messagesContainerRef = useRef(null);
- const initialLoadPerformedRef = useRef(false);
-
- const chatMessageIds = useSelector((state: RootState) =>
- selectedChatId ? state.chat.chats[selectedChatId]?.messageIds || [] : []
- );
-
- const { fetchChatMessages, markChatAsSeen } = useChat();
-
- const messages = useSelector((state: RootState) =>
- chatMessageIds.map((messageId) => state.chat.messages[messageId])
- );
-
- // Load messages function (used for both initial and scroll-based loading)
- const loadMessages = (timestamp: number = 0) => {
- if (!selectedChatId || loading || (!hasMore && timestamp !== 0)) return;
-
- setLoading(true);
-
- fetchChatMessages(selectedChatId, timestamp)
- .then((fetchedMessages) => {
- // If no messages or empty array, we've reached the end
- if (!fetchedMessages) {
- setHasMore(false);
- }
-
- // Mark messages as seen on initial load
- if (timestamp === 0) {
- markChatAsSeen(selectedChatId);
- // Scroll to bottom after loading old messages
- setTimeout(() => {
- if (messagesContainerRef.current) {
- messagesContainerRef.current.scrollTop =
- messagesContainerRef.current.scrollHeight;
- }
- }, 1000);
- }
- })
- .finally(() => {
- setLoading(false);
- });
- };
-
- // Reset state when chat changes
- useEffect(() => {
- if (selectedChatId) {
- setHasMore(true);
- setLastFetchedTime(new Date().getTime());
- initialLoadPerformedRef.current = false;
- setTimeout(() => {
- if (messagesContainerRef.current) {
- messagesContainerRef.current.scrollTop =
- messagesContainerRef.current.scrollHeight;
- }
- }, 10);
- }
- }, [selectedChatId]);
-
- // Perform initial load if needed
- useEffect(() => {
- if (
- selectedChatId &&
- chatMessageIds.length === 0 &&
- !initialLoadPerformedRef.current
- ) {
- initialLoadPerformedRef.current = true;
- loadMessages(0);
- }
- }, [selectedChatId, chatMessageIds.length]);
-
- // Update lastFetchedTime when messages change
- useEffect(() => {
- if (messages.length > 0) {
- const oldestMessageTime = new Date(messages[0].createdAt).getTime();
- // Only update if we have a new oldest message
- if (oldestMessageTime < lastFetchedTime) {
- setLastFetchedTime(oldestMessageTime);
- }
- }
- }, [messages, lastFetchedTime]);
-
- // Handle scroll to load more messages
- const handleScroll = () => {
- if (!messagesContainerRef.current) return;
-
- const { scrollTop } = messagesContainerRef.current;
-
- // Check if scrolled to top (with a small threshold)
- if (scrollTop < 10 && !loading && hasMore && selectedChatId) {
- loadMessages(lastFetchedTime);
- }
- };
-
- // Maintain scroll position when adding old messages
- useEffect(() => {
- if (loading && messagesContainerRef.current) {
- const container = messagesContainerRef.current;
- const oldScrollHeight = container.scrollHeight;
-
- setTimeout(() => {
- const newScrollHeight = container.scrollHeight;
- container.scrollTop = newScrollHeight - oldScrollHeight;
- }, 0);
- }
- }, [messages, loading]);
-
- if (!selectedChatId) {
- return (
-
-
Select a chat to view messages
-
- );
- }
-
- return (
-
-
-
-
-
-
- {loading && (
-
-
-
- )}
- {!hasMore && messages.length > 0 && (
-
- No more messages
-
- )}
-
-
-
-
-
- );
-}
diff --git a/Frontend/src/components/chat/selected-user-card.tsx b/Frontend/src/components/chat/selected-user-card.tsx
deleted file mode 100644
index 7c283ad..0000000
--- a/Frontend/src/components/chat/selected-user-card.tsx
+++ /dev/null
@@ -1,97 +0,0 @@
-import React, { use, useEffect } from "react";
-import { Avatar, AvatarFallback, AvatarImage } from "../ui/avatar";
-import { useDispatch, useSelector } from "react-redux";
-import { RootState } from "@/redux/store";
-import { API_URL } from "@/lib/utils";
-import axios from "axios";
-import {
- markChatAsDelivered,
- setSelectedChat,
- updateReceiverStatus,
-} from "@/redux/chatSlice";
-import { formatDistanceToNow } from "date-fns";
-import { Button } from "../ui/button";
-
-interface UserStatusResponse {
- isOnline: boolean;
- lastSeen?: string;
-}
-
-function formatLastSeen(lastSeen: string | null) {
- if (!lastSeen) return "";
- const date = new Date(lastSeen);
- return `Last seen: ${formatDistanceToNow(date, { addSuffix: true })}`;
-}
-
-export default function SelectedUserCard() {
- const selectedChatId = useSelector(
- (state: RootState) => state.chat.selectedChatId
- );
- const receiver = useSelector(
- (state: RootState) => state.chat.chats[state.chat.selectedChatId!].receiver
- );
- const dispatch = useDispatch();
-
- useEffect(() => {
- if (!selectedChatId) return;
-
- const fetchUserStatus = async () => {
- try {
- const response = await axios.get(
- `${API_URL}/chat/user_status/${receiver.id}`
- );
- dispatch(
- updateReceiverStatus({
- chatListId: selectedChatId,
- isOnline: response.data.isOnline,
- lastSeen: response.data.lastSeen,
- })
- );
- } catch (error) {
- console.error("Error fetching user status:", error);
- }
- };
- const interval = setInterval(() => {
- fetchUserStatus();
- }, 20000);
- fetchUserStatus();
- return () => {
- clearInterval(interval);
- };
- }, [selectedChatId, dispatch, receiver.id]);
-
- useEffect(() => {
- if (receiver.isOnline && selectedChatId) {
- dispatch(
- markChatAsDelivered({
- chatListId: selectedChatId,
- })
- );
- }
- }, [receiver.isOnline, selectedChatId]);
-
- return (
-
-
-
- {receiver.username!.charAt(0)}
-
-
-
{receiver.username}
-
- {receiver.isOnline ? "Online" : formatLastSeen(receiver.lastSeen)}
-
-
-
{
- dispatch(setSelectedChat(null));
- }}
- >
- X
-
-
- );
-}
diff --git a/Frontend/src/components/collaboration-hub/ActiveCollabCard.tsx b/Frontend/src/components/collaboration-hub/ActiveCollabCard.tsx
deleted file mode 100644
index 8ee2872..0000000
--- a/Frontend/src/components/collaboration-hub/ActiveCollabCard.tsx
+++ /dev/null
@@ -1,146 +0,0 @@
-import React from "react";
-import { useNavigate } from "react-router-dom";
-import { Button } from "../ui/button";
-import { Avatar, AvatarFallback, AvatarImage } from "../ui/avatar";
-
-export interface ActiveCollabCardProps {
- id: number;
- collaborator: {
- name: string;
- avatar: string;
- contentType: string;
- };
- collabTitle: string;
- status: string;
- startDate: string;
- dueDate: string;
- messages: number;
- deliverables: { completed: number; total: number };
- lastActivity: string;
- latestUpdate: string;
-}
-
-const statusColors: Record = {
- "In Progress": "bg-blue-100 text-blue-700",
- "Awaiting Response": "bg-yellow-100 text-yellow-700",
- "Completed": "bg-green-100 text-green-700"
-};
-
-function getDaysBetween(start: string, end: string) {
- const s = new Date(start);
- const e = new Date(end);
- if (isNaN(s.getTime()) || isNaN(e.getTime())) return 0;
- const diff = e.getTime() - s.getTime();
- if (diff < 0) return 0;
- return Math.ceil(diff / (1000 * 60 * 60 * 24));
-}
-
-function getDaysLeft(due: string) {
- const now = new Date();
- const d = new Date(due);
- if (isNaN(d.getTime())) return 0;
- const diff = d.getTime() - now.getTime();
- // Allow negative for overdue, but if invalid, return 0
- return Math.ceil(diff / (1000 * 60 * 60 * 24));
-}
-
-function getTimelineProgress(start: string, due: string) {
- const total = getDaysBetween(start, due);
- if (total === 0) return 0;
- const elapsed = getDaysBetween(start, new Date().toISOString().slice(0, 10));
- return Math.min(100, Math.max(0, Math.round((elapsed / total) * 100)));
-}
-
-const ActiveCollabCard: React.FC = ({
- id,
- collaborator,
- collabTitle,
- status,
- startDate,
- dueDate,
- messages,
- deliverables,
- lastActivity,
- latestUpdate
-}) => {
- const navigate = useNavigate();
- const deliverableProgress = Math.round((deliverables.completed / deliverables.total) * 100);
- const timelineProgress = getTimelineProgress(startDate, dueDate);
- const daysLeft = getDaysLeft(dueDate);
- const overdue = daysLeft < 0 && status !== "Completed";
-
- return (
-
-
-
-
- {collaborator.name.slice(0,2).toUpperCase()}
-
-
-
{collaborator.name}
-
{collaborator.contentType}
-
-
{status}
-
-
- Collab: {collabTitle}
- Start: {startDate}
- Due: {dueDate}
- {overdue ? `Overdue by ${Math.abs(daysLeft)} days` : daysLeft === 0 ? "Due today" : `${daysLeft} days left`}
-
- {/* Timeline Progress Bar */}
-
-
- Timeline
- {timelineProgress}%
-
-
-
- {/* Deliverables Progress Bar */}
-
-
- Deliverables
- {deliverables.completed}/{deliverables.total} ({deliverableProgress}%)
-
-
-
-
- Messages: {messages}
- Last activity: {lastActivity}
-
-
- Latest update: {latestUpdate}
-
-
- navigate(`/dashboard/collaborations/${id}`)}
- aria-label="View collaboration details"
- >
- View Details
-
-
- Message
-
- {status !== "Completed" && (
-
- Mark Complete
-
- )}
-
-
- );
-};
-
-export default ActiveCollabCard;
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/ActiveCollabsGrid.tsx b/Frontend/src/components/collaboration-hub/ActiveCollabsGrid.tsx
deleted file mode 100644
index bbad3e4..0000000
--- a/Frontend/src/components/collaboration-hub/ActiveCollabsGrid.tsx
+++ /dev/null
@@ -1,73 +0,0 @@
-import React, { useState } from "react";
-import { activeCollabsMock } from "./activeCollabsMockData";
-import ActiveCollabCard from "./ActiveCollabCard";
-
-const statusOptions = ["All", "In Progress", "Completed"];
-const sortOptions = ["Start Date", "Due Date", "Name"];
-
-const ActiveCollabsGrid: React.FC = () => {
- const [statusFilter, setStatusFilter] = useState("All");
- const [sortBy, setSortBy] = useState("Start Date");
-
- // Only show In Progress and Completed
- let filtered = activeCollabsMock.filter(c => c.status !== "Awaiting Response");
- if (statusFilter !== "All") {
- filtered = filtered.filter(c => c.status === statusFilter);
- }
- if (sortBy === "Start Date") {
- filtered = [...filtered].sort((a, b) => a.startDate.localeCompare(b.startDate));
- } else if (sortBy === "Due Date") {
- filtered = [...filtered].sort((a, b) => a.dueDate.localeCompare(b.dueDate));
- } else if (sortBy === "Name") {
- filtered = [...filtered].sort((a, b) => a.collaborator.name.localeCompare(b.collaborator.name));
- }
-
- return (
-
-
-
- Status:
- setStatusFilter(e.target.value)}
- aria-label="Filter collaborations by status"
- >
- {statusOptions.map(opt => (
- {opt}
- ))}
-
-
-
- Sort by:
- setSortBy(e.target.value)}
- aria-label="Sort collaborations by criteria"
- >
- {sortOptions.map(opt => (
- {opt}
- ))}
-
-
-
- {filtered.length === 0 ? (
-
-
No active collaborations
-
Start a new collaboration to see it here!
-
- ) : (
-
- {filtered.map(collab => (
-
- ))}
-
- )}
-
- );
-};
-
-export default ActiveCollabsGrid;
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/CollabRequests.tsx b/Frontend/src/components/collaboration-hub/CollabRequests.tsx
deleted file mode 100644
index 57cfb2c..0000000
--- a/Frontend/src/components/collaboration-hub/CollabRequests.tsx
+++ /dev/null
@@ -1,207 +0,0 @@
-import React, { useState } from "react";
-import { Card, CardHeader, CardTitle, CardContent, CardDescription } from "../ui/card";
-import { Button } from "../ui/button";
-import { Avatar, AvatarFallback, AvatarImage } from "../ui/avatar";
-import { Badge } from "../ui/badge";
-import { Separator } from "../ui/separator";
-import { MessageSquare, CheckCircle, XCircle, Lightbulb, TrendingUp, Users, Star, Mail } from "lucide-react";
-
-// Mock data for incoming requests
-const mockRequests = [
- {
- id: 1,
- sender: {
- name: "TechSavvy",
- avatar: "https://randomuser.me/api/portraits/men/32.jpg",
- contentNiche: "Tech Reviews",
- audienceSize: "250K",
- followers: 250000,
- engagement: "4.2%",
- rating: 4.7,
- },
- summary: "Collaboration for a new smartphone launch campaign.",
- proposal: {
- contentLength: "5-7 min video",
- paymentSchedule: "50% upfront, 50% after delivery",
- numberOfPosts: "2 Instagram posts, 1 YouTube video",
- timeline: "Within 3 weeks of product launch",
- notes: "Open to creative input and additional deliverables."
- },
- stats: {
- posts: 120,
- completionRate: "98%",
- avgViews: "80K"
- },
- ai: {
- advantages: [
- "Access to a highly engaged tech audience.",
- "Boosts brand credibility through trusted reviews.",
- "Potential for long-term partnership."
- ],
- ideas: [
- "Unboxing and first impressions video.",
- "Live Q&A session with audience.",
- "Social media giveaway collaboration."
- ],
- recommendations: [
- "Highlight unique features in the first 60 seconds.",
- "Leverage Instagram Stories for behind-the-scenes content.",
- "Schedule a follow-up review after 1 month."
- ]
- }
- },
- {
- id: 2,
- sender: {
- name: "EcoChic",
- avatar: "https://randomuser.me/api/portraits/women/44.jpg",
- contentNiche: "Sustainable Fashion",
- audienceSize: "180K",
- followers: 180000,
- engagement: "5.1%",
- rating: 4.9,
- },
- summary: "Proposal for a sustainable clothing line promotion.",
- proposal: {
- contentLength: "3-5 min Instagram Reel",
- paymentSchedule: "Full payment after campaign",
- numberOfPosts: "1 Reel, 2 Stories",
- timeline: "Next month",
- notes: "Would love to brainstorm eco-friendly angles together."
- },
- stats: {
- posts: 95,
- completionRate: "96%",
- avgViews: "60K"
- },
- ai: {
- advantages: [
- "Tap into eco-conscious audience.",
- "Enhance brand's sustainability image.",
- "Opportunity for co-branded content."
- ],
- ideas: [
- "Instagram Reels styling challenge.",
- "Joint blog post on sustainable fashion tips.",
- "Giveaway of eco-friendly products."
- ],
- recommendations: [
- "Feature behind-the-scenes of production.",
- "Encourage user-generated content with a hashtag.",
- "Host a live styling session."
- ]
- }
- }
-];
-
-const CollabRequests: React.FC = () => {
- const [requests, setRequests] = useState(mockRequests);
-
- const handleAccept = (id: number) => {
- setRequests(prev => prev.filter(req => req.id !== id));
- // TODO: Integrate with backend to accept request
- };
-
- const handleDeny = (id: number) => {
- setRequests(prev => prev.filter(req => req.id !== id));
- // TODO: Integrate with backend to deny request
- };
-
- const handleMessage = (id: number) => {
- // TODO: Open message modal or redirect to chat
- alert("Open chat with sender (not implemented)");
- };
-
- return (
-
- {requests.length === 0 ? (
-
No collaboration requests at this time.
- ) : (
- requests.map((req) => (
-
-
-
-
-
- {req.sender.name.slice(0,2).toUpperCase()}
-
-
-
{req.sender.name}
-
{req.sender.contentNiche} • {req.sender.audienceSize} audience
-
- {req.sender.followers.toLocaleString()} followers
- {req.sender.engagement} engagement
- {req.sender.rating}/5
-
-
-
-
-
-
- Request: {req.summary}
-
- {/* Initial Collaboration Proposal Section */}
-
-
- 📝 Initial Collaboration Proposal
-
-
- Content Length: {req.proposal.contentLength}
- Payment Schedule: {req.proposal.paymentSchedule}
- Number of Posts: {req.proposal.numberOfPosts}
- Timeline: {req.proposal.timeline}
- Notes: {req.proposal.notes}
-
-
-
- {/* AI Advantages */}
-
-
Advantages
-
- {req.ai.advantages.map((adv, i) => {adv} )}
-
-
- {/* AI Ideas */}
-
-
Collaboration Ideas
-
- {req.ai.ideas.map((idea, i) => {idea} )}
-
-
- {/* AI Recommendations */}
-
-
Recommendations
-
- {req.ai.recommendations.map((rec, i) => {rec} )}
-
-
-
-
-
- Posts: {req.stats.posts}
- Completion Rate: {req.stats.completionRate}
- Avg Views: {req.stats.avgViews}
-
-
- handleAccept(req.id)} aria-label="Accept collaboration request">
- Accept
-
- handleDeny(req.id)} aria-label="Deny collaboration request">
- Deny
-
- handleMessage(req.id)} aria-label="Message sender">
- Message
-
-
- Email
-
-
-
-
- ))
- )}
-
- );
-};
-
-export default CollabRequests;
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/CollaborationDeliverables.tsx b/Frontend/src/components/collaboration-hub/CollaborationDeliverables.tsx
deleted file mode 100644
index c2e2291..0000000
--- a/Frontend/src/components/collaboration-hub/CollaborationDeliverables.tsx
+++ /dev/null
@@ -1,76 +0,0 @@
-import React from "react";
-import { Card, CardHeader, CardTitle, CardContent } from "../ui/card";
-import { Button } from "../ui/button";
-import { Badge } from "../ui/badge";
-import { FileText, Download, Eye, Edit } from "lucide-react";
-
-const CollaborationDeliverables = ({
- mockDeliverables,
- getDeliverableStatusColor,
- handleViewDeliverable,
-}) => (
-
-
-
-
- Deliverables
-
-
-
-
- {mockDeliverables.map((deliverable) => (
-
-
-
-
{deliverable.title}
-
{deliverable.description}
-
-
- {deliverable.status.replace('-', ' ')}
-
-
-
-
- Due Date:
- {deliverable.dueDate}
-
-
- Assigned To:
- {deliverable.assignedTo}
-
-
- {deliverable.files && deliverable.files.length > 0 && (
-
-
Files:
-
- {deliverable.files.map((file, index) => (
-
-
- {file}
-
- ))}
-
-
- )}
-
- handleViewDeliverable(deliverable)}
- >
-
- View
-
-
-
- Edit
-
-
-
- ))}
-
-
-
-);
-
-export default CollaborationDeliverables;
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/CollaborationMessages.tsx b/Frontend/src/components/collaboration-hub/CollaborationMessages.tsx
deleted file mode 100644
index 27633f3..0000000
--- a/Frontend/src/components/collaboration-hub/CollaborationMessages.tsx
+++ /dev/null
@@ -1,102 +0,0 @@
-import React from "react";
-import { Card, CardHeader, CardTitle, CardContent } from "../ui/card";
-import { Button } from "../ui/button";
-import { Separator } from "../ui/separator";
-import { MessageSquare, Send } from "lucide-react";
-import { Input } from "../ui/input";
-import { Textarea } from "../ui/textarea";
-
-const CollaborationMessages = ({
- mockMessages,
- messageStyles,
- messageStyle,
- showStyleOptions,
- setShowStyleOptions,
- newMessage,
- setNewMessage,
- handleSendMessage,
- handleStyleChange,
- customStyle,
- setCustomStyle,
- handleCustomStyle,
-}) => (
-
-
-
-
- Messages
-
-
-
-
- {mockMessages.map((message) => (
-
-
-
{message.sender}
-
{message.content}
-
{message.timestamp}
-
-
- ))}
-
-
- {/* AI Message Style Enhancement */}
-
-
-
Message Style
- setShowStyleOptions(!showStyleOptions)}
- className="text-xs"
- >
- {messageStyles.find(s => s.value === messageStyle)?.label || "Professional"}
-
-
- {showStyleOptions && (
-
-
- {messageStyles.map((style) => (
- handleStyleChange(style.value)}
- className="text-xs justify-start"
- >
- {style.label}
-
- ))}
-
-
- setCustomStyle(e.target.value)}
- className="flex-1 text-xs"
- onKeyPress={(e) => e.key === 'Enter' && handleCustomStyle()}
- />
-
- Apply
-
-
-
- )}
-
-
- setNewMessage(e.target.value)}
- className="flex-1"
- rows={2}
- />
-
-
-
-
-
-
-);
-
-export default CollaborationMessages;
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/CollaborationMessagesTab.tsx b/Frontend/src/components/collaboration-hub/CollaborationMessagesTab.tsx
deleted file mode 100644
index 9258e7f..0000000
--- a/Frontend/src/components/collaboration-hub/CollaborationMessagesTab.tsx
+++ /dev/null
@@ -1,113 +0,0 @@
-import React from "react";
-import { Card, CardHeader, CardTitle, CardContent } from "../ui/card";
-import { Button } from "../ui/button";
-import { Separator } from "../ui/separator";
-import { Textarea } from "../ui/textarea";
-import { Input } from "../ui/input";
-import { MessageSquare, Send } from "lucide-react";
-
-export default function CollaborationMessagesTab({
- mockMessages,
- messageStyles,
- messageStyle,
- showStyleOptions,
- newMessage,
- setNewMessage,
- handleSendMessage,
- setShowStyleOptions,
- handleStyleChange,
- customStyle,
- setCustomStyle,
- handleCustomStyle
-}: {
- mockMessages: any[];
- messageStyles: any[];
- messageStyle: string;
- showStyleOptions: boolean;
- newMessage: string;
- setNewMessage: (v: string) => void;
- handleSendMessage: () => void;
- setShowStyleOptions: (v: boolean) => void;
- handleStyleChange: (v: string) => void;
- customStyle: string;
- setCustomStyle: (v: string) => void;
- handleCustomStyle: () => void;
-}) {
- return (
-
-
-
-
- Messages
-
-
-
-
- {mockMessages.map((message) => (
-
-
-
{message.sender}
-
{message.content}
-
{message.timestamp}
-
-
- ))}
-
-
- {/* AI Message Style Enhancement */}
-
-
-
Message Style
- setShowStyleOptions(!showStyleOptions)}
- className="text-xs"
- >
- {messageStyles.find(s => s.value === messageStyle)?.label || "Professional"}
-
-
- {showStyleOptions && (
-
-
- {messageStyles.map((style) => (
- handleStyleChange(style.value)}
- className="text-xs justify-start"
- >
- {style.label}
-
- ))}
-
-
- setCustomStyle(e.target.value)}
- className="flex-1 text-xs"
- onKeyPress={e => e.key === 'Enter' && handleCustomStyle()}
- />
- Apply
-
-
- )}
-
-
- setNewMessage(e.target.value)}
- className="flex-1"
- rows={2}
- />
-
-
-
-
-
-
- );
-}
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/CollaborationOverview.tsx b/Frontend/src/components/collaboration-hub/CollaborationOverview.tsx
deleted file mode 100644
index 9ce5cb0..0000000
--- a/Frontend/src/components/collaboration-hub/CollaborationOverview.tsx
+++ /dev/null
@@ -1,207 +0,0 @@
-import React from "react";
-import { Card, CardHeader, CardTitle, CardContent } from "../ui/card";
-import { Button } from "../ui/button";
-import { Separator } from "../ui/separator";
-import { BarChart3, Users, Edit } from "lucide-react";
-import { Textarea } from "../ui/textarea";
-
-const CollaborationOverview = ({
- collaboration,
- isEditingUpdate,
- editedUpdate,
- handleEditUpdate,
- handleSaveUpdate,
- handleCancelEdit,
- setEditedUpdate,
- getStatusColor,
- getDeliverableStatusColor,
-}) => (
- <>
- {/* Collaboration Summary */}
-
-
-
-
- Collaboration Summary
-
-
-
-
-
-
Project Details
-
-
- Start Date:
- {collaboration.startDate}
-
-
- Due Date:
- {collaboration.dueDate}
-
-
- Content Type:
- {collaboration.collaborator.contentType}
-
-
-
-
-
Progress
-
-
- Deliverables:
- {collaboration.deliverables.completed}/{collaboration.deliverables.total}
-
-
- Messages:
- {collaboration.messages}
-
-
- Last Activity:
- {collaboration.lastActivity}
-
-
-
-
-
-
-
-
Latest Update
- {!isEditingUpdate && (
-
-
- Edit
-
- )}
-
- {isEditingUpdate ? (
-
-
setEditedUpdate(e.target.value)}
- className="min-h-[80px]"
- placeholder="Enter the latest update..."
- />
-
-
- Save
-
-
- Cancel
-
-
-
- ) : (
-
- {collaboration.latestUpdate}
-
- )}
-
-
-
- {/* Progress Tracking */}
-
-
-
-
- Progress Tracking
-
-
-
-
-
- Timeline Progress
- 65%
-
-
-
-
-
- Deliverables Progress
- {Math.round((collaboration.deliverables.completed / collaboration.deliverables.total) * 100)}%
-
-
-
-
-
- {/* AI Project Overview & Recommendations */}
-
-
-
-
- AI Project Overview & Recommendations
-
-
-
-
-
Project Health Analysis
-
-
- This collaboration is progressing well with 65% timeline completion.
- The content creation phase is active and on track.
- Communication frequency is optimal for this stage of the project.
-
-
-
-
-
Current Timeline Recommendations
-
-
-
-
- Content Creation Phase: Consider scheduling a review meeting
- within the next 2 days to ensure alignment on video direction and style.
-
-
-
-
-
- Quality Check: Request a preview of the thumbnail design
- to provide early feedback and avoid last-minute revisions.
-
-
-
-
-
- Risk Mitigation: Prepare backup content ideas in case
- the current direction needs adjustment.
-
-
-
-
-
-
Communication Tips
-
-
- Pro Tip: Use specific feedback when reviewing content.
- Instead of "make it better," try "increase the energy in the first 30 seconds"
- or "add more close-up shots of the product features."
-
-
-
-
-
- >
-);
-
-export default CollaborationOverview;
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/CollaborationOverviewTab.tsx b/Frontend/src/components/collaboration-hub/CollaborationOverviewTab.tsx
deleted file mode 100644
index 5f3b35e..0000000
--- a/Frontend/src/components/collaboration-hub/CollaborationOverviewTab.tsx
+++ /dev/null
@@ -1,138 +0,0 @@
-import React from "react";
-import { Card, CardContent, CardHeader, CardTitle } from "../ui/card";
-import { Button } from "../ui/button";
-import { Separator } from "../ui/separator";
-import { Textarea } from "../ui/textarea";
-import { Edit, BarChart3, Users } from "lucide-react";
-
-export default function CollaborationOverviewTab({
- collaboration,
- isEditingUpdate,
- editedUpdate,
- handleEditUpdate,
- handleSaveUpdate,
- handleCancelEdit,
- setEditedUpdate
-}: {
- collaboration: any;
- isEditingUpdate: boolean;
- editedUpdate: string;
- handleEditUpdate: () => void;
- handleSaveUpdate: () => void;
- handleCancelEdit: () => void;
- setEditedUpdate: (v: string) => void;
-}) {
- return (
- <>
- {/* Collaboration Summary */}
-
-
-
-
- Collaboration Summary
-
-
-
-
-
-
Project Details
-
-
- Start Date:
- {collaboration.startDate}
-
-
- Due Date:
- {collaboration.dueDate}
-
-
- Content Type:
- {collaboration.collaborator.contentType}
-
-
-
-
-
Progress
-
-
- Deliverables:
- {collaboration.deliverables.completed}/{collaboration.deliverables.total}
-
-
- Messages:
- {collaboration.messages}
-
-
- Last Activity:
- {collaboration.lastActivity}
-
-
-
-
-
-
-
-
Latest Update
- {!isEditingUpdate && (
-
-
- Edit
-
- )}
-
- {isEditingUpdate ? (
-
-
setEditedUpdate(e.target.value)}
- className="min-h-[80px]"
- placeholder="Enter the latest update..."
- />
-
- Save
- Cancel
-
-
- ) : (
-
{collaboration.latestUpdate}
- )}
-
-
-
- {/* Progress Tracking */}
-
-
-
-
- Progress Tracking
-
-
-
-
-
- Timeline Progress
- 65%
-
-
-
-
-
- Deliverables Progress
- {Math.round((collaboration.deliverables.completed / collaboration.deliverables.total) * 100)}%
-
-
-
-
-
- >
- );
-}
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/CollaborationProjectStats.tsx b/Frontend/src/components/collaboration-hub/CollaborationProjectStats.tsx
deleted file mode 100644
index 8906941..0000000
--- a/Frontend/src/components/collaboration-hub/CollaborationProjectStats.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import React from "react";
-import { Card, CardHeader, CardTitle, CardContent } from "../ui/card";
-import { Separator } from "../ui/separator";
-
-export default function CollaborationProjectStats({ collaboration }: { collaboration: any }) {
- return (
-
-
- Project Stats
-
-
-
-
-
-
- {Math.round((collaboration.deliverables.completed / collaboration.deliverables.total) * 100)}%
-
-
Deliverables
-
-
-
-
-
- Days Remaining:
- 3 days
-
-
- Files Shared:
- 5
-
-
-
-
- );
-}
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/CollaborationQuickActions.tsx b/Frontend/src/components/collaboration-hub/CollaborationQuickActions.tsx
deleted file mode 100644
index a0b9f85..0000000
--- a/Frontend/src/components/collaboration-hub/CollaborationQuickActions.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import React from "react";
-import { Card, CardHeader, CardTitle, CardContent } from "../ui/card";
-import { Button } from "../ui/button";
-import { Edit, FileText, Download, ExternalLink } from "lucide-react";
-
-export default function CollaborationQuickActions({ handleViewContract }: { handleViewContract: () => void }) {
- return (
-
-
- Quick Actions
-
-
-
-
- Edit Collaboration
-
-
-
- View Contract
-
-
-
- Export Details
-
-
-
- View Profile
-
-
-
- );
-}
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/CollaborationTimelineTab.tsx b/Frontend/src/components/collaboration-hub/CollaborationTimelineTab.tsx
deleted file mode 100644
index e970aaf..0000000
--- a/Frontend/src/components/collaboration-hub/CollaborationTimelineTab.tsx
+++ /dev/null
@@ -1,80 +0,0 @@
-import React from "react";
-import { Card, CardHeader, CardTitle, CardContent } from "../ui/card";
-import { Button } from "../ui/button";
-import { Calendar, FileText, Eye, Badge } from "lucide-react";
-
-export default function CollaborationTimelineTab({
- mockMilestones,
- handleViewContract,
- contractUrl,
- collaboration,
- getMilestoneStatusColor
-}: {
- mockMilestones: any[];
- handleViewContract: () => void;
- contractUrl: string;
- collaboration: any;
- getMilestoneStatusColor: (status: string) => string;
-}) {
- return (
-
-
-
-
-
- Project Timeline
-
-
-
- View Contract
-
-
-
-
-
- {mockMilestones.map((milestone, index) => (
-
-
-
- {index < mockMilestones.length - 1 && (
-
- )}
-
-
-
-
{milestone.title}
-
- {milestone.status.replace('-', ' ')}
-
-
-
{milestone.description}
-
- Due: {milestone.dueDate}
- {milestone.status === 'in-progress' && (
- {milestone.progress}% complete
- )}
-
- {milestone.status === 'in-progress' && (
-
- )}
-
-
- ))}
-
-
-
- );
-}
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/CollaboratorSidebar.tsx b/Frontend/src/components/collaboration-hub/CollaboratorSidebar.tsx
deleted file mode 100644
index a6323cc..0000000
--- a/Frontend/src/components/collaboration-hub/CollaboratorSidebar.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import React from "react";
-import { Card, CardHeader, CardTitle, CardContent } from "../ui/card";
-import { Avatar, AvatarFallback, AvatarImage } from "../ui/avatar";
-import { Separator } from "../ui/separator";
-import { Button } from "../ui/button";
-import { MessageSquare, Mail, Star, TrendingUp, Activity } from "lucide-react";
-
-export default function CollaboratorSidebar({ collaboration }: { collaboration: any }) {
- return (
-
-
- Collaborator
-
-
-
-
-
-
- {collaboration.collaborator.name.slice(0, 2).toUpperCase()}
-
-
-
-
{collaboration.collaborator.name}
-
{collaboration.collaborator.contentType}
-
-
-
-
-
- 4.8/5 rating
-
-
-
- 500K+ followers
-
-
-
-
95% completion rate
-
-
-
-
-
-
- Send Message
-
-
-
- Email
-
-
-
-
- );
-}
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/ConnectModal.tsx b/Frontend/src/components/collaboration-hub/ConnectModal.tsx
deleted file mode 100644
index 007b30d..0000000
--- a/Frontend/src/components/collaboration-hub/ConnectModal.tsx
+++ /dev/null
@@ -1,146 +0,0 @@
-import React, { useState } from "react";
-import { mockProfileDetails, mockCollabIdeas, mockRequestTexts, mockWhyMatch } from "./mockProfileData";
-import { Button } from "../ui/button";
-import { Avatar, AvatarFallback, AvatarImage } from "../ui/avatar";
-import { Badge } from "../ui/badge";
-
-interface WhyMatchReason {
- point: string;
- description: string;
-}
-
-interface ConnectModalProps {
- open: boolean;
- onClose: () => void;
- onSend: (selectedText: string) => void;
- matchPercentage?: number;
- whyMatch?: WhyMatchReason[];
-}
-
-const defaultMatch = 98;
-const IDEAS_PER_PAGE = 3;
-
-const ConnectModal: React.FC = ({ open, onClose, onSend, matchPercentage = defaultMatch, whyMatch = mockWhyMatch }) => {
- const [ideasPage, setIdeasPage] = useState(0);
- const [selectedText, setSelectedText] = useState(mockRequestTexts[0]);
- if (!open) return null;
- const profile = mockProfileDetails;
- const totalIdeas = mockCollabIdeas.length;
- if (totalIdeas === 0) {
- return (
-
-
-
×
-
-
No Collaboration Ideas
-
There are currently no AI-generated collaboration ideas available.
-
Close
-
-
-
- );
- }
- const startIdx = (ideasPage * IDEAS_PER_PAGE) % totalIdeas;
- const ideasToShow = Array.from({ length: Math.min(totalIdeas, IDEAS_PER_PAGE) }, (_, i) => mockCollabIdeas[(startIdx + i) % totalIdeas]);
-
- const handleNextIdeas = () => {
- setIdeasPage((prev) => prev + 1);
- };
-
- return (
-
-
-
- ×
-
- {/* Left: Profile Info */}
-
-
- {matchPercentage}% Match
-
-
-
- {profile.name.slice(0,2).toUpperCase()}
-
-
Connect with {profile.name}
-
{profile.contentType}
-
-
Why you match
-
- {whyMatch.map((reason, idx) => (
-
- {reason.point}
- {reason.description}
-
- ))}
-
-
-
- {/* Right: Ideas and Messages */}
-
-
-
AI-Generated Collaboration Ideas
-
- {ideasToShow.length === 0 ? (
- No collaboration ideas available.
- ) : (
- ideasToShow.map((idea, idx) => (
-
- {idea.title}
- {idea.description}
-
- ))
- )}
-
- {totalIdeas > IDEAS_PER_PAGE && (
-
-
- See More Ideas
-
-
- )}
-
-
-
Select a message to send
-
- Select a message to send
- {mockRequestTexts.map((text, idx) => {
- const radioId = `requestText-${idx}`;
- return (
-
- setSelectedText(text)}
- className="mt-1 accent-yellow-400"
- />
-
- {text}
-
-
- );
- })}
-
-
-
- Cancel
- onSend(selectedText)}>Send Request
-
-
-
-
- );
-};
-
-export default ConnectModal;
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/CreatorMatchCard.tsx b/Frontend/src/components/collaboration-hub/CreatorMatchCard.tsx
deleted file mode 100644
index e50317b..0000000
--- a/Frontend/src/components/collaboration-hub/CreatorMatchCard.tsx
+++ /dev/null
@@ -1,132 +0,0 @@
-import React, { useState } from "react";
-import { Button } from "../ui/button";
-import { Badge } from "../ui/badge";
-import { Avatar, AvatarFallback, AvatarImage } from "../ui/avatar";
-import ViewProfileModal from "./ViewProfileModal";
-import ConnectModal from "./ConnectModal";
-
-export interface CreatorMatchCardProps {
- name: string;
- avatar: string;
- contentType: string;
- matchPercentage: number;
- audienceMatch: string;
- followers: string;
- engagement: string;
- content: string;
- collabs: number;
- whyMatch: string[];
-}
-
-const getAudienceMatchColor = (level: string) => {
- switch (level) {
- case "Very High":
- return "bg-green-500";
- case "High":
- return "bg-yellow-400";
- case "Good":
- return "bg-blue-400";
- default:
- return "bg-gray-300";
- }
-};
-
-// New subcomponents for readability and maintainability
-const CreatorStats: React.FC<{followers: string, engagement: string, content: string, collabs: number}> = ({ followers, engagement, content, collabs }) => (
-
-
Followers {followers}
-
Engagement {engagement}
-
Content {content}
-
Collabs {collabs} completed
-
-);
-
-const AudienceMatchBar: React.FC<{audienceMatch: string}> = ({ audienceMatch }) => (
-
-
Audience Match
-
{audienceMatch}
-
-
-);
-
-const MatchReasons: React.FC<{whyMatch: string[]}> = ({ whyMatch }) => (
-
-
Why you match
-
- {whyMatch.map((reason, idx) => (
- {reason}
- ))}
-
-
-);
-
-export const CreatorMatchCard: React.FC = ({
- name,
- avatar,
- contentType,
- matchPercentage,
- audienceMatch,
- followers,
- engagement,
- content,
- collabs,
- whyMatch,
-}) => {
- const [showProfile, setShowProfile] = useState(false);
- const [showConnect, setShowConnect] = useState(false);
- const [requestSent, setRequestSent] = useState(false);
-
- const handleSendRequest = () => {
- setShowConnect(false);
- setRequestSent(true);
- setTimeout(() => setRequestSent(false), 2000);
- };
-
- return (
- <>
-
-
- {matchPercentage}% Match
-
-
-
-
- {typeof name === 'string' && name.length > 0 ? name.slice(0,2).toUpperCase() : '--'}
-
-
{name}
-
{contentType}
-
-
-
-
-
- setShowProfile(true)}>View Profile
- setShowConnect(true)}>Connect
-
- {requestSent && (
-
Request Sent!
- )}
-
- setShowProfile(false)}
- onConnect={() => {
- setShowProfile(false);
- setTimeout(() => setShowConnect(true), 200);
- }}
- />
- setShowConnect(false)}
- onSend={handleSendRequest}
- />
- >
- );
-};
-
-export default CreatorMatchCard;
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/CreatorMatchGrid.tsx b/Frontend/src/components/collaboration-hub/CreatorMatchGrid.tsx
deleted file mode 100644
index 57c1f01..0000000
--- a/Frontend/src/components/collaboration-hub/CreatorMatchGrid.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import React, { useState } from "react";
-import CreatorMatchCard, { CreatorMatchCardProps } from "./CreatorMatchCard";
-
-interface CreatorMatchGridProps {
- creators: CreatorMatchCardProps[];
-}
-
-const PAGE_SIZE = 4;
-
-const CreatorMatchGrid: React.FC = ({ creators }) => {
- const [page, setPage] = useState(0);
- const totalPages = Math.ceil(creators.length / PAGE_SIZE);
-
- const startIdx = page * PAGE_SIZE;
- const endIdx = startIdx + PAGE_SIZE;
- const currentCreators = creators.slice(startIdx, endIdx);
-
- return (
-
-
- {currentCreators.map((creator) => (
-
- ))}
-
-
- setPage((p) => Math.max(p - 1, 0))}
- disabled={page === 0}
- >
- Previous
-
- Page {page + 1} of {totalPages}
- setPage((p) => Math.min(p + 1, totalPages - 1))}
- disabled={page >= totalPages - 1}
- >
- Next
-
-
-
- );
-};
-
-export default CreatorMatchGrid;
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/CreatorSearchModal.tsx b/Frontend/src/components/collaboration-hub/CreatorSearchModal.tsx
deleted file mode 100644
index c2623e3..0000000
--- a/Frontend/src/components/collaboration-hub/CreatorSearchModal.tsx
+++ /dev/null
@@ -1,115 +0,0 @@
-import React, { useState } from "react";
-import { Dialog, DialogContent, DialogHeader, DialogTitle } from "../ui/dialog";
-import { Button } from "../ui/button";
-import { Textarea } from "../ui/textarea";
-import { Card, CardContent } from "../ui/card";
-import ViewProfileModal from "./ViewProfileModal";
-import { mockProfileDetails } from "./mockProfileData";
-
-interface CreatorSearchModalProps {
- open: boolean;
- onClose: () => void;
- onConnect?: (creator: any) => void;
-}
-
-export default function CreatorSearchModal({ open, onClose, onConnect }: CreatorSearchModalProps) {
- const [aiSearchDesc, setAiSearchDesc] = useState("");
- const [aiSearchResults, setAiSearchResults] = useState([]);
- const [aiSearchSubmitted, setAiSearchSubmitted] = useState(false);
- const [showProfile, setShowProfile] = useState(false);
-
- // Mock AI search handler
- const handleAiSearch = () => {
- setAiSearchResults([
- mockProfileDetails, // You can add more mock creators if desired
- ]);
- setAiSearchSubmitted(true);
- };
-
- const handleResetAiSearch = () => {
- setAiSearchDesc("");
- setAiSearchResults([]);
- setAiSearchSubmitted(false);
- onClose();
- };
-
- const handleConnect = (creator: any) => {
- if (onConnect) {
- onConnect(creator);
- }
- };
-
- return (
- <>
- { if (!v) handleResetAiSearch(); }}>
-
-
- Find Creators with AI
-
-
- Describe your project or collaboration needs
- ) => setAiSearchDesc(e.target.value)}
- rows={3}
- />
-
-
- Cancel
-
- Find Creators
-
-
-
- {aiSearchSubmitted && (
-
-
Top AI-Suggested Creators
-
- {aiSearchResults.map((creator, idx) => (
-
-
-
-
{creator.name}
-
{creator.contentType} • {creator.location}
-
- setShowProfile(true)}
- >
- View Profile
-
- handleConnect(creator)}
- >
- Connect
-
-
-
- ))}
-
-
- )}
-
-
-
- setShowProfile(false)}
- onConnect={() => {
- setShowProfile(false);
- if (aiSearchResults.length > 0) {
- handleConnect(aiSearchResults[0]);
- }
- }}
- />
- >
- );
-}
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/NewCollaborationModal.tsx b/Frontend/src/components/collaboration-hub/NewCollaborationModal.tsx
deleted file mode 100644
index d3a3585..0000000
--- a/Frontend/src/components/collaboration-hub/NewCollaborationModal.tsx
+++ /dev/null
@@ -1,292 +0,0 @@
-import React, { useState } from "react";
-import { Dialog, DialogContent, DialogHeader, DialogTitle } from "../ui/dialog";
-import { Button } from "../ui/button";
-import { Input } from "../ui/input";
-import { Textarea } from "../ui/textarea";
-import { Card, CardContent, CardHeader, CardTitle } from "../ui/card";
-import ViewProfileModal from "./ViewProfileModal";
-import { mockProfileDetails } from "./mockProfileData";
-
-interface NewCollaborationModalProps {
- open: boolean;
- onClose: () => void;
- onSubmit?: (data: any) => void;
-}
-
-interface ProposalData {
- contentLength: string;
- paymentSchedule: string;
- numberOfPosts: string;
- timeline: string;
- notes: string;
-}
-
-export default function NewCollaborationModal({ open, onClose, onSubmit }: NewCollaborationModalProps) {
- const [modalStep, setModalStep] = useState(1);
- const [searchTerm, setSearchTerm] = useState("");
- const [selectedCreator, setSelectedCreator] = useState(null);
- const [showProfile, setShowProfile] = useState(false);
- const [collabDesc, setCollabDesc] = useState("");
- const [aiDesc, setAiDesc] = useState("");
- const [proposal, setProposal] = useState({
- contentLength: "",
- paymentSchedule: "",
- numberOfPosts: "",
- timeline: "",
- notes: ""
- });
- const [aiProposal, setAiProposal] = useState(null);
- const [reviewed, setReviewed] = useState(false);
-
- // Mock creator search (returns mockProfileDetails for any search)
- const searchResults = searchTerm ? [mockProfileDetails] : [];
-
- // Mock AI suggestions
- const handleAiDesc = () => {
- setAiDesc("AI Suggestion: Collaborate on a tech review series with cross-promotion and audience Q&A.");
- };
-
- const handleAiProposal = () => {
- setAiProposal({
- contentLength: "5-7 min video",
- paymentSchedule: "50% upfront, 50% after delivery",
- numberOfPosts: "2 Instagram posts, 1 YouTube video",
- timeline: "Within 3 weeks of product launch",
- notes: "Open to creative input and additional deliverables."
- });
- };
-
- const handleResetModal = () => {
- setModalStep(1);
- setSearchTerm("");
- setSelectedCreator(null);
- setShowProfile(false);
- setCollabDesc("");
- setAiDesc("");
- setProposal({ contentLength: "", paymentSchedule: "", numberOfPosts: "", timeline: "", notes: "" });
- setAiProposal(null);
- setReviewed(false);
- onClose();
- };
-
- const handleSubmit = () => {
- setReviewed(true);
- setTimeout(() => {
- if (onSubmit) {
- onSubmit({
- creator: selectedCreator,
- description: collabDesc || aiDesc,
- proposal,
- reviewed: true
- });
- }
- handleResetModal();
- }, 1500);
- };
-
- return (
- <>
- { if (!v) handleResetModal(); }}>
-
-
- New Collaboration Request
-
-
- {/* Stepper */}
-
-
1. Search Creator
-
2. Describe Collab
-
3. Proposal Details
-
4. Review & Send
-
-
- {/* Step 1: Search Creator */}
- {modalStep === 1 && (
-
-
setSearchTerm(e.target.value)}
- className="mb-4"
- />
- {searchResults.length > 0 ? (
-
- {searchResults.map((creator, idx) => (
-
-
-
-
{creator.name}
-
{creator.contentType} • {creator.location}
-
- { setSelectedCreator(creator); setShowProfile(true); }}
- >
- View Profile
-
- setSelectedCreator(creator)}
- >
- Select
-
-
-
- ))}
-
- ) : (
-
Type a name to search for creators.
- )}
-
- Cancel
- setModalStep(2)}
- >
- Next
-
-
-
- )}
-
- {/* Step 2: Describe Collab */}
- {modalStep === 2 && (
-
-
Describe the collaboration you're looking for
-
) => setCollabDesc(e.target.value)}
- rows={3}
- />
-
-
AI Suggest
- {aiDesc && (
-
- {aiDesc}
-
- )}
-
-
- Cancel
- setModalStep(1)}>Back
- setModalStep(3)}
- disabled={!collabDesc && !aiDesc}
- >
- Next
-
-
-
- )}
-
- {/* Step 3: Proposal Details */}
- {modalStep === 3 && (
-
-
Proposal Details
-
- setProposal({ ...proposal, contentLength: e.target.value })}
- />
- setProposal({ ...proposal, paymentSchedule: e.target.value })}
- />
- setProposal({ ...proposal, numberOfPosts: e.target.value })}
- />
- setProposal({ ...proposal, timeline: e.target.value })}
- />
-
-
) => setProposal({ ...proposal, notes: e.target.value })}
- className="mt-2"
- />
-
-
AI Draft Proposal
- {aiProposal && (
-
-
AI Proposal:
-
Content Length: {aiProposal.contentLength}
-
Payment: {aiProposal.paymentSchedule}
-
Posts: {aiProposal.numberOfPosts}
-
Timeline: {aiProposal.timeline}
-
Notes: {aiProposal.notes}
-
setProposal(aiProposal)}
- >
- Use This
-
-
- )}
-
-
- Cancel
- setModalStep(2)}>Back
- setModalStep(4)}
- disabled={!proposal.contentLength || !proposal.paymentSchedule || !proposal.numberOfPosts || !proposal.timeline}
- >
- Next
-
-
-
- )}
-
- {/* Step 4: Review & Send */}
- {modalStep === 4 && (
-
-
Review & Send
-
-
- To: {selectedCreator?.name}
-
-
- Description: {collabDesc || aiDesc}
- Content Length: {proposal.contentLength}
- Payment Schedule: {proposal.paymentSchedule}
- Number of Posts: {proposal.numberOfPosts}
- Timeline: {proposal.timeline}
- Notes: {proposal.notes}
-
-
-
- Cancel
- setModalStep(3)}>Back
-
- Send Request
-
-
- {reviewed && (
-
Request Sent!
- )}
-
- )}
-
-
-
- setShowProfile(false)}
- onConnect={() => { setShowProfile(false); setSelectedCreator(searchResults[0]); }}
- />
- >
- );
-}
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/ViewProfileModal.tsx b/Frontend/src/components/collaboration-hub/ViewProfileModal.tsx
deleted file mode 100644
index 138b242..0000000
--- a/Frontend/src/components/collaboration-hub/ViewProfileModal.tsx
+++ /dev/null
@@ -1,84 +0,0 @@
-import React from "react";
-import { mockProfileDetails, mockWhyMatch } from "./mockProfileData";
-import { Button } from "../ui/button";
-import { Avatar, AvatarFallback, AvatarImage } from "../ui/avatar";
-import { Badge } from "../ui/badge";
-
-interface WhyMatchReason {
- point: string;
- description: string;
-}
-
-const defaultMatch = 98;
-
-interface ViewProfileModalProps {
- open: boolean;
- onClose: () => void;
- onConnect: () => void;
- matchPercentage?: number;
- whyMatch?: WhyMatchReason[];
-}
-
-const ViewProfileModal: React.FC = ({ open, onClose, onConnect, matchPercentage = defaultMatch, whyMatch = mockWhyMatch }) => {
- if (!open) return null;
- const profile = mockProfileDetails;
- return (
-
-
-
- ×
-
-
-
- {matchPercentage}% Match
-
-
-
- {profile.name.slice(0,2).toUpperCase()}
-
-
{profile.name}
-
{profile.contentType} • {profile.location}
-
-
{profile.bio}
-
-
-
Followers {profile.followers}
-
Engagement {profile.engagement}
-
Content {profile.content}
-
Collabs {profile.collabs} completed
-
-
-
Why you match
-
- {whyMatch.map((reason, idx) => (
-
- {reason.point}
- {reason.description}
-
- ))}
-
-
-
- Connect
-
-
-
- );
-};
-
-export default ViewProfileModal;
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/activeCollabsMockData.ts b/Frontend/src/components/collaboration-hub/activeCollabsMockData.ts
deleted file mode 100644
index 95d1b06..0000000
--- a/Frontend/src/components/collaboration-hub/activeCollabsMockData.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-// MOCK DATA: This will be replaced by functioning backend logic later on
-
-export const activeCollabsMock = [
- {
- id: 1,
- collaborator: {
- name: "GadgetGuru",
- avatar: "/placeholder.svg?height=96&width=96",
- contentType: "Unboxing & First Impressions"
- },
- collabTitle: "Unboxing Marathon",
- status: "In Progress",
- startDate: "2024-06-01",
- dueDate: "2024-06-15",
- messages: 12,
- deliverables: { completed: 2, total: 3 },
- lastActivity: "2 days ago",
- latestUpdate: "Finalizing thumbnail for the main video."
- },
- {
- id: 2,
- collaborator: {
- name: "TechTalker",
- avatar: "/placeholder.svg?height=96&width=96",
- contentType: "Tech News & Commentary"
- },
- collabTitle: "Tech for Good",
- status: "Awaiting Response",
- startDate: "2024-06-05",
- dueDate: "2024-06-20",
- messages: 5,
- deliverables: { completed: 0, total: 2 },
- lastActivity: "5 days ago",
- latestUpdate: "Waiting for approval on the script."
- },
- {
- id: 3,
- collaborator: {
- name: "StyleStar",
- avatar: "/placeholder.svg?height=96&width=96",
- contentType: "Fashion & Lifestyle"
- },
- collabTitle: "Style Swap Challenge",
- status: "Completed",
- startDate: "2024-05-10",
- dueDate: "2024-05-25",
- messages: 18,
- deliverables: { completed: 2, total: 2 },
- lastActivity: "1 day ago",
- latestUpdate: "Collab video published and shared on socials."
- }
-];
\ No newline at end of file
diff --git a/Frontend/src/components/collaboration-hub/mockProfileData.ts b/Frontend/src/components/collaboration-hub/mockProfileData.ts
deleted file mode 100644
index 47212dd..0000000
--- a/Frontend/src/components/collaboration-hub/mockProfileData.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-// MOCK DATA: This will be replaced by functioning backend/AI logic later on
-
-export const mockProfileDetails = {
- id: 1,
- name: "TechReviewer",
- avatar: "/placeholder.svg?height=96&width=96",
- contentType: "Tech Reviews & Tutorials",
- location: "San Francisco, CA",
- bio: "Passionate about the latest in tech. I review gadgets, apps, and everything in between. Always looking for new collab opportunities!",
- followers: "1.2M",
- engagement: "4.8%",
- content: "Tech Reviews",
- collabs: 12,
- socialLinks: [
- { platform: "Instagram", url: "https://instagram.com/techreviewer", icon: "instagram" },
- { platform: "YouTube", url: "https://youtube.com/techreviewer", icon: "youtube" },
- { platform: "Twitter", url: "https://twitter.com/techreviewer", icon: "twitter" }
- ]
-};
-
-export const mockCollabIdeas = [
- {
- title: "Gadget Showdown",
- description: "Compare the latest gadgets in a head-to-head review with unique perspectives from both creators."
- },
- {
- title: "Tech for Good",
- description: "Collaborate on a series highlighting technology that makes a positive impact on society."
- },
- {
- title: "Unboxing Marathon",
- description: "Host a live unboxing event featuring products from both creators' favorite brands."
- },
- {
- title: "Ask the Experts",
- description: "A Q&A session where both creators answer audience tech questions together."
- }
-];
-
-export const mockRequestTexts = [
- "Hi! I love your content. Would you be interested in collaborating on a tech review series?",
- "Hey! I think our audiences would both enjoy a joint unboxing event. Let me know if you're interested!",
- "Hello! I have some ideas for a tech-for-good collaboration. Would you like to connect and discuss?"
-];
-
-export const mockWhyMatch = [
- {
- point: "Complementary content styles",
- description: "Your focus on in-depth reviews complements their quick unboxing and first impressions, offering audiences a full spectrum of tech insights."
- },
- {
- point: "85% audience demographic overlap",
- description: "Both of your audiences are primarily tech enthusiasts aged 18-35, ensuring high engagement and relevance for collaborative content."
- },
- {
- point: "Similar engagement patterns",
- description: "Both channels see peak engagement during product launch weeks, making joint campaigns more impactful."
- }
-];
\ No newline at end of file
diff --git a/Frontend/src/components/contracts/contract-generator.tsx b/Frontend/src/components/contracts/contract-generator.tsx
deleted file mode 100644
index 8fe1b2f..0000000
--- a/Frontend/src/components/contracts/contract-generator.tsx
+++ /dev/null
@@ -1,166 +0,0 @@
-import { useState } from "react"
-import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"
-import { Button } from "@/components/ui/button"
-import { Input } from "@/components/ui/input"
-import { Label } from "@/components/ui/label"
-import { Textarea } from "@/components/ui/textarea"
-import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
-import { Slider } from "@/components/ui/slider"
-import { Switch } from "@/components/ui/switch"
-import { Download, FileText, Loader2, Sparkles } from "lucide-react"
-
-export function ContractGenerator() {
- const [isGenerating, setIsGenerating] = useState(false)
- const [isGenerated, setIsGenerated] = useState(false)
-
- const handleGenerate = () => {
- setIsGenerating(true)
- // Simulate AI generation
- setTimeout(() => {
- setIsGenerating(false)
- setIsGenerated(true)
- }, 2000)
- }
-
- return (
-
-
-
- AI Contract Generator
- Generate a customized contract based on your specific needs
-
-
-
- Contract Name
-
-
-
-
- Contract Type
-
-
-
-
-
- Brand Sponsorship
- Creator Collaboration
- Affiliate Partnership
- Content Licensing
-
-
-
-
-
- Other Party Name
-
-
-
-
- Contract Value
-
-
-
-
-
Contract Duration
-
-
-
-
- 1 day
- 30 days
- 180 days
-
-
-
-
- Deliverables
-
-
-
-
-
- Include exclusivity clause
-
-
-
-
- Include revision terms
-
-
-
-
- {isGenerating ? (
- <>
-
- Generating Contract...
- >
- ) : (
- <>
-
- Generate AI Contract
- >
- )}
-
-
-
-
-
-
- Generated Contract
-
- {isGenerated
- ? "Your AI-generated contract is ready for review"
- : "Your contract will appear here after generation"}
-
-
-
- {isGenerated ? (
-
-
-
EcoStyle Sponsorship Agreement
-
-
This Agreement is entered into as of [Date] by and between:
-
- Creator: [Your Name]
-
-
- Brand: EcoStyle
-
-
1. SCOPE OF SERVICES
-
Creator agrees to create and publish the following content:
-
- 1 dedicated Instagram post featuring EcoStyle products
- 2 Instagram stories with swipe-up links
-
-
2. COMPENSATION
-
Brand agrees to pay Creator the sum of $3,000 USD for the Services.
-
Payment Schedule: 50% upon signing, 50% upon completion.
-
3. TERM
-
This Agreement shall commence on the Effective Date and continue for 30 days.
-
[...additional contract sections...]
-
-
-
- ) : (
-
-
-
- Fill out the form and click "Generate AI Contract" to create your customized agreement
-
-
- )}
-
- {isGenerated && (
-
- Edit Contract
-
-
- Download Contract
-
-
- )}
-
-
- )
-}
-
diff --git a/Frontend/src/components/contracts/contract-templates.tsx b/Frontend/src/components/contracts/contract-templates.tsx
deleted file mode 100644
index e760c2f..0000000
--- a/Frontend/src/components/contracts/contract-templates.tsx
+++ /dev/null
@@ -1,145 +0,0 @@
-import React from "react";
-import {
- Card,
- CardContent,
- CardDescription,
- CardFooter,
- CardHeader,
- CardTitle,
-} from "@/components/ui/card";
-import { Button } from "@/components/ui/button";
-import { FileText, Copy, ArrowRight } from "lucide-react";
-import { useState } from "react";
-import { useNavigate } from "react-router-dom";
-// import { useRouter } from "next/navigation"
-
-const templates = [
- {
- id: "sponsorship",
- title: "Brand Sponsorship",
- description: "Standard agreement for sponsored content with brands",
- features: [
- "Payment terms",
- "Content requirements",
- "Approval process",
- "Usage rights",
- "Exclusivity clauses",
- ],
- },
- {
- id: "collaboration",
- title: "Creator Collaboration",
- description: "Agreement for collaborating with other creators",
- features: [
- "Revenue sharing",
- "Content ownership",
- "Cross-promotion",
- "Creative control",
- "Termination clauses",
- ],
- },
- {
- id: "affiliate",
- title: "Affiliate Partnership",
- description: "Agreement for affiliate marketing relationships",
- features: [
- "Commission structure",
- "Tracking methods",
- "Payment schedule",
- "Promotional guidelines",
- "Term length",
- ],
- },
- {
- id: "licensing",
- title: "Content Licensing",
- description: "License your content to brands or platforms",
- features: [
- "Usage rights",
- "Licensing fees",
- "Term limitations",
- "Attribution requirements",
- "Territorial rights",
- ],
- },
- {
- id: "longterm",
- title: "Long-term Partnership",
- description: "Extended partnership with brands or creators",
- features: [
- "Multi-phase deliverables",
- "Performance metrics",
- "Renewal terms",
- "Escalating compensation",
- "Exit clauses",
- ],
- },
- {
- id: "oneoff",
- title: "One-off Project",
- description: "Simple agreement for a single content piece",
- features: [
- "Single payment",
- "Limited deliverables",
- "Quick turnaround",
- "Minimal obligations",
- "Simple terms",
- ],
- },
-];
-
-export function ContractTemplates() {
- const [selectedTemplate, setSelectedTemplate] = useState(null);
- const navigate = useNavigate();
-
- const handleUseTemplate = (templateId: string) => {
- setSelectedTemplate(templateId);
- // In a real app, this would navigate to a contract creation page with the template pre-loaded
- navigate(`/dashboard/contracts/create?template=${templateId}`);
- };
-
- return (
-
-
- {templates.map((template) => (
-
-
-
-
- {template.title}
-
- {template.description}
-
-
-
- {template.features.map((feature, index) => (
-
-
- {feature}
-
- ))}
-
-
-
- console.log(`Duplicating ${template.id}`)}
- >
-
- Duplicate
-
- handleUseTemplate(template.id)}>
- Use Template
-
-
-
-
- ))}
-
-
- );
-}
diff --git a/Frontend/src/components/dashboard/creator-collaborations.tsx b/Frontend/src/components/dashboard/creator-collaborations.tsx
deleted file mode 100644
index 41832c6..0000000
--- a/Frontend/src/components/dashboard/creator-collaborations.tsx
+++ /dev/null
@@ -1,64 +0,0 @@
-import React from 'react'
-
-// MOCK DATA: This will be replaced by functioning backend logic later on
-export const mockCreatorMatches = [
- {
- id: 1,
- name: "TechReviewer",
- avatar: "https://via.placeholder.com/96",
- contentType: "Tech Reviews & Tutorials",
- matchPercentage: 98,
- audienceMatch: "Very High",
- followers: "1.2M",
- engagement: "4.8%",
- content: "Tech Reviews",
- collabs: 12,
- whyMatch: [
- "Complementary content styles",
- "85% audience demographic overlap",
- "Similar engagement patterns"
- ]
- },
- {
- id: 2,
- name: "GadgetGuru",
- avatar: "https://via.placeholder.com/96",
- contentType: "Unboxing & First Impressions",
- matchPercentage: 92,
- audienceMatch: "High",
- followers: "850K",
- engagement: "5.2%",
- content: "Unboxing",
- collabs: 8,
- whyMatch: [
- "Your reviews + their unboxings = perfect combo",
- "78% audience demographic overlap",
- "Different posting schedules (opportunity)"
- ]
- },
- {
- id: 3,
- name: "TechTalker",
- avatar: "https://via.placeholder.com/96",
- contentType: "Tech News & Commentary",
- matchPercentage: 87,
- audienceMatch: "Good",
- followers: "1.5M",
- engagement: "3.9%",
- content: "Tech News",
- collabs: 15,
- whyMatch: [
- "Their news + your reviews = full coverage",
- "65% audience demographic overlap",
- "Complementary content calendars"
- ]
- }
-];
-
-function CreatorCollaborations() {
- return (
- creator-collaborations
- )
-}
-
-export default CreatorCollaborations
\ No newline at end of file
diff --git a/Frontend/src/components/dashboard/creator-matches.tsx b/Frontend/src/components/dashboard/creator-matches.tsx
deleted file mode 100644
index 2252819..0000000
--- a/Frontend/src/components/dashboard/creator-matches.tsx
+++ /dev/null
@@ -1,85 +0,0 @@
-import { useEffect, useState } from "react";
-import { Avatar, AvatarFallback, AvatarImage } from "../ui/avatar";
-import { Button } from "../ui/button";
-import { Card, CardContent } from "../ui/card";
-import { Badge } from "../ui/badge";
-
-interface CreatorMatch {
- user_id: string;
- match_score: number;
- audience_age_group?: Record;
- audience_location?: Record;
- engagement_rate?: number;
- average_views?: number;
- price_expectation?: number;
- // Add more fields as needed
-}
-
-interface CreatorMatchesProps {
- sponsorshipId: string;
-}
-
-export function CreatorMatches({ sponsorshipId }: CreatorMatchesProps) {
- const [matches, setMatches] = useState([]);
- const [loading, setLoading] = useState(false);
- const [error, setError] = useState(null);
-
- useEffect(() => {
- if (!sponsorshipId) return;
- setLoading(true);
- setError(null);
- fetch(`/api/match/creators-for-brand/${sponsorshipId}`)
- .then((res) => {
- if (!res.ok) throw new Error("Failed to fetch matches");
- return res.json();
- })
- .then((data) => {
- setMatches(data.matches || []);
- setLoading(false);
- })
- .catch((err) => {
- setError(err.message);
- setLoading(false);
- });
- }, [sponsorshipId]);
-
- if (!sponsorshipId) return Select a campaign to see matches.
;
- if (loading) return Loading matches...
;
- if (error) return {error}
;
- if (matches.length === 0) return No matching creators found.
;
-
- return (
-
- {matches.map((creator) => (
-
-
-
-
-
- {creator.user_id.slice(0, 2).toUpperCase()}
-
-
-
-
Creator {creator.user_id.slice(0, 6)}
- {Math.round((creator.match_score / 4) * 100)}% Match
-
-
- Engagement: {creator.engagement_rate ?? "-"}% | Avg Views: {creator.average_views ?? "-"}
-
-
- ${creator.price_expectation ?? "-"}
-
-
- View Profile
-
- Contact
-
-
-
-
-
-
- ))}
-
- );
-}
\ No newline at end of file
diff --git a/Frontend/src/components/dashboard/performance-metrics.tsx b/Frontend/src/components/dashboard/performance-metrics.tsx
deleted file mode 100644
index 057e779..0000000
--- a/Frontend/src/components/dashboard/performance-metrics.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import { Bar, BarChart, CartesianGrid, Legend, ResponsiveContainer, Tooltip, XAxis, YAxis } from "recharts"
-
-const data = [
- {
- name: "Jan",
- revenue: 4000,
- engagement: 2400,
- },
- {
- name: "Feb",
- revenue: 3000,
- engagement: 1398,
- },
- {
- name: "Mar",
- revenue: 2000,
- engagement: 9800,
- },
- {
- name: "Apr",
- revenue: 2780,
- engagement: 3908,
- },
- {
- name: "May",
- revenue: 5890,
- engagement: 4800,
- },
- {
- name: "Jun",
- revenue: 4390,
- engagement: 3800,
- },
-]
-
-export function PerformanceMetrics() {
- return (
-
-
-
-
-
-
-
-
-
-
-
- )
-}
-
diff --git a/Frontend/src/components/dashboard/recent-activity.tsx b/Frontend/src/components/dashboard/recent-activity.tsx
deleted file mode 100644
index 2f70eb3..0000000
--- a/Frontend/src/components/dashboard/recent-activity.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import { Avatar, AvatarFallback, AvatarImage } from "../ui/avatar"
-
-export function RecentActivity() {
- return (
-
-
-
-
- BF
-
-
-
Beauty Fusion
-
Sent you a sponsorship proposal
-
2 hours ago
-
-
-
-
-
- JD
-
-
-
Jane Doe
-
Accepted your collaboration request
-
5 hours ago
-
-
-
-
-
- TS
-
-
-
TechStart
-
Contract signed and finalized
-
Yesterday
-
-
-
-
-
- AI
-
-
-
Inpact AI
-
New sponsorship matches available
-
2 days ago
-
-
-
- )
-}
-
diff --git a/Frontend/src/components/dashboard/sponsorship-matches.tsx b/Frontend/src/components/dashboard/sponsorship-matches.tsx
deleted file mode 100644
index daf6ee8..0000000
--- a/Frontend/src/components/dashboard/sponsorship-matches.tsx
+++ /dev/null
@@ -1,84 +0,0 @@
-import { useEffect, useState } from "react";
-import { Avatar, AvatarFallback, AvatarImage } from "../ui/avatar"
-import { Button } from "../ui/button"
-import { Card, CardContent } from "../ui/card"
-import { Badge } from "../ui/badge"
-
-interface SponsorshipMatch {
- sponsorship_id: string;
- match_score: number;
- title?: string;
- description?: string;
- budget?: number;
- // Add more fields as needed
-}
-
-interface SponsorshipMatchesProps {
- creatorId: string;
-}
-
-export function SponsorshipMatches({ creatorId }: SponsorshipMatchesProps) {
- const [matches, setMatches] = useState([]);
- const [loading, setLoading] = useState(false);
- const [error, setError] = useState(null);
-
- useEffect(() => {
- if (!creatorId) return;
- setLoading(true);
- setError(null);
- fetch(`/api/match/brands-for-creator/${creatorId}`)
- .then((res) => {
- if (!res.ok) throw new Error("Failed to fetch matches");
- return res.json();
- })
- .then((data) => {
- setMatches(data.matches || []);
- setLoading(false);
- })
- .catch((err) => {
- setError(err.message);
- setLoading(false);
- });
- }, [creatorId]);
-
- if (!creatorId) return Login to see your matches.
;
- if (loading) return Loading matches...
;
- if (error) return {error}
;
- if (matches.length === 0) return No matching brand campaigns found.
;
-
- return (
-
- {matches.map((sponsorship) => (
-
-
-
-
-
- {(sponsorship.title || "BR").slice(0, 2).toUpperCase()}
-
-
-
-
{sponsorship.title || "Brand Campaign"}
- {Math.round((sponsorship.match_score / 4) * 100)}% Match
-
-
- {sponsorship.description || "No description provided."}
-
-
- ${sponsorship.budget ?? "-"}
-
-
- View Details
-
- Contact
-
-
-
-
-
-
- ))}
-
- )
-}
-
diff --git a/Frontend/src/components/date-range-picker.tsx b/Frontend/src/components/date-range-picker.tsx
deleted file mode 100644
index 0eccd2b..0000000
--- a/Frontend/src/components/date-range-picker.tsx
+++ /dev/null
@@ -1,65 +0,0 @@
-"use client";
-
-import * as React from "react";
-import { CalendarIcon } from "lucide-react";
-import { format } from "date-fns";
-import type { DateRange } from "react-day-picker";
-
-import { cn } from "@/lib/utils";
-import { Button } from "@/components/ui/button";
-import { Calendar } from "@/components/ui/calendar";
-import {
- Popover,
- PopoverContent,
- PopoverTrigger,
-} from "@/components/ui/popover";
-
-export function DateRangePicker({
- className,
-}: React.HTMLAttributes) {
- const [date, setDate] = React.useState({
- from: new Date(2024, 0, 1),
- to: new Date(),
- });
-
- return (
-
-
-
-
-
- {date?.from ? (
- date.to ? (
- <>
- {format(date.from, "LLL dd, y")} -{" "}
- {format(date.to, "LLL dd, y")}
- >
- ) : (
- format(date.from, "LLL dd, y")
- )
- ) : (
- Pick a date
- )}
-
-
-
-
-
-
-
- );
-}
diff --git a/Frontend/src/components/loading.tsx b/Frontend/src/components/loading.tsx
deleted file mode 100644
index d644a79..0000000
--- a/Frontend/src/components/loading.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-export default function Loading() {
- return null
- }
-
-
\ No newline at end of file
diff --git a/Frontend/src/components/main-nav.tsx b/Frontend/src/components/main-nav.tsx
deleted file mode 100644
index 9aa97aa..0000000
--- a/Frontend/src/components/main-nav.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Link } from "react-router-dom"
-
-export function MainNav() {
- return (
-
- {/* Navigation items removed - keeping component for future use */}
- {/* TODO: Under construction - menu items coming soon */}
- Menu coming soon
-
- )
-}
-
diff --git a/Frontend/src/components/mode-toggle.tsx b/Frontend/src/components/mode-toggle.tsx
deleted file mode 100644
index ff4a8c4..0000000
--- a/Frontend/src/components/mode-toggle.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { Moon, Sun } from "lucide-react";
-import { useTheme } from "./theme-provider";
-import { Button } from "./ui/button";
-import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuTrigger,
-} from "./ui/dropdown-menu";
-
-export function ModeToggle() {
- const { setTheme } = useTheme();
-
- return (
-
-
-
-
-
- Toggle theme
-
-
-
- setTheme("light")}>
- Light
-
- setTheme("dark")}>
- Dark
-
- setTheme("system")}>
- System
-
-
-
- );
-}
diff --git a/Frontend/src/components/theme-provider.tsx b/Frontend/src/components/theme-provider.tsx
deleted file mode 100644
index cbcd77d..0000000
--- a/Frontend/src/components/theme-provider.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import React from "react";
-
-import { createContext, useContext, useEffect, useState } from "react";
-
-const ThemeProviderContext = createContext({
- theme: "system",
- setTheme: (_: string) => null,
-});
-
-export function ThemeProvider({
- children,
- defaultTheme = "system",
- storageKey = "vite-ui-theme",
- ...props
-}: any) {
- const [theme, setTheme] = useState(
- () => localStorage.getItem(storageKey) || defaultTheme
- );
-
- useEffect(() => {
- const root = window.document.documentElement;
-
- root.classList.remove("light", "dark");
-
- if (theme === "system") {
- const systemTheme = window.matchMedia("(prefers-color-scheme: dark)")
- .matches
- ? "dark"
- : "light";
-
- root.classList.add(systemTheme);
- return;
- }
-
- root.classList.add(theme);
- }, [theme]);
-
- const value = {
- theme,
- setTheme: (theme: string) => {
- localStorage.setItem(storageKey, theme);
- setTheme(theme);
- },
- };
-
- return (
-
- {children}
-
- );
-}
-
-export const useTheme = () => {
- const context = useContext(ThemeProviderContext);
-
- if (context === undefined)
- throw new Error("useTheme must be used within a ThemeProvider");
-
- return context;
-};
diff --git a/Frontend/src/components/ui/avatar.tsx b/Frontend/src/components/ui/avatar.tsx
deleted file mode 100644
index d260623..0000000
--- a/Frontend/src/components/ui/avatar.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-"use client";
-
-import * as React from "react";
-import * as AvatarPrimitive from "@radix-ui/react-avatar";
-
-import { cn } from "@/lib/utils";
-
-const Avatar = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-));
-Avatar.displayName = AvatarPrimitive.Root.displayName;
-
-const AvatarImage = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-));
-AvatarImage.displayName = AvatarPrimitive.Image.displayName;
-
-const AvatarFallback = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-));
-AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
-
-export { Avatar, AvatarImage, AvatarFallback };
diff --git a/Frontend/src/components/ui/badge.tsx b/Frontend/src/components/ui/badge.tsx
deleted file mode 100644
index 9ec9a1a..0000000
--- a/Frontend/src/components/ui/badge.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import * as React from "react";
-import { cva, type VariantProps } from "class-variance-authority";
-
-import { cn } from "@/lib/utils";
-
-const badgeVariants = cva(
- "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
- {
- variants: {
- variant: {
- default:
- "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
- secondary:
- "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
- destructive:
- "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
- outline: "text-foreground",
- },
- },
- defaultVariants: {
- variant: "default",
- },
- }
-);
-
-export interface BadgeProps
- extends React.HTMLAttributes,
- VariantProps {}
-
-function Badge({ className, variant, ...props }: BadgeProps) {
- return (
-
- );
-}
-
-export { Badge, badgeVariants };
diff --git a/Frontend/src/components/ui/button.tsx b/Frontend/src/components/ui/button.tsx
deleted file mode 100644
index edf4421..0000000
--- a/Frontend/src/components/ui/button.tsx
+++ /dev/null
@@ -1,54 +0,0 @@
-import * as React from "react";
-import { cn } from "../../lib/utils";
-import { Slot } from "@radix-ui/react-slot";
-import { cva, type VariantProps } from "class-variance-authority";
-
-const buttonVariants = cva(
- "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
- {
- variants: {
- variant: {
- default: "bg-gray-50 text-gray-600 hover:bg-gray-300",
- destructive: "bg-destructive text-gray-600 hover:bg-gray-50",
- outline:
- "border border-gray-200 bg-white hover:bg-gray-50 hover:text-gray-600",
- secondary: "bg-gray-50 text-gray-900 hover:bg-gray-50",
- ghost: "hover:text-gray-900 hover:text-gray-900",
- link: "text-primary underline-offset-4 hover:underline",
- },
- size: {
- default: "h-10 px-4 py-2",
- sm: "px-3 py-1 text-sm",
- md: "px-4 py-2 text-base",
- lg: "px-6 py-3 text-lg",
- icon: "h-10 w-10",
- },
- },
- 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/Frontend/src/components/ui/calendar.tsx b/Frontend/src/components/ui/calendar.tsx
deleted file mode 100644
index 962e816..0000000
--- a/Frontend/src/components/ui/calendar.tsx
+++ /dev/null
@@ -1,73 +0,0 @@
-import * as React from "react";
-import { ChevronLeft, ChevronRight } from "lucide-react";
-import { DayPicker } from "react-day-picker";
-
-import { cn } from "@/lib/utils";
-import { buttonVariants } from "@/components/ui/button";
-
-function Calendar({
- className,
- classNames,
- showOutsideDays = true,
- ...props
-}: React.ComponentProps) {
- return (
- .day-range-end)]:rounded-r-md [&:has(>.day-range-start)]:rounded-l-md first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md"
- : "[&:has([aria-selected])]:rounded-md"
- ),
- day: cn(
- buttonVariants({ variant: "ghost" }),
- "size-8 p-0 font-normal aria-selected:opacity-100"
- ),
- day_range_start:
- "day-range-start aria-selected:bg-primary aria-selected:text-primary-foreground",
- day_range_end:
- "day-range-end aria-selected:bg-primary aria-selected:text-primary-foreground",
- day_selected:
- "bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground",
- day_today: "bg-accent text-accent-foreground",
- day_outside:
- "day-outside text-muted-foreground aria-selected:text-muted-foreground",
- day_disabled: "text-muted-foreground opacity-50",
- day_range_middle:
- "aria-selected:bg-accent aria-selected:text-accent-foreground",
- day_hidden: "invisible",
- ...classNames,
- }}
- components={{
- IconLeft: ({ className, ...props }) => (
-
- ),
- IconRight: ({ className, ...props }) => (
-
- ),
- }}
- {...props}
- />
- );
-}
-
-export { Calendar };
diff --git a/Frontend/src/components/ui/card.tsx b/Frontend/src/components/ui/card.tsx
deleted file mode 100644
index 7727845..0000000
--- a/Frontend/src/components/ui/card.tsx
+++ /dev/null
@@ -1,86 +0,0 @@
-import * as React from "react";
-
-import { cn } from "@/lib/utils";
-
-const Card = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-));
-Card.displayName = "Card";
-
-const CardHeader = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-));
-CardHeader.displayName = "CardHeader";
-
-const CardTitle = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-));
-CardTitle.displayName = "CardTitle";
-
-const CardDescription = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-));
-CardDescription.displayName = "CardDescription";
-
-const CardContent = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-));
-CardContent.displayName = "CardContent";
-
-const CardFooter = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-));
-CardFooter.displayName = "CardFooter";
-
-export {
- Card,
- CardHeader,
- CardFooter,
- CardTitle,
- CardDescription,
- CardContent,
-};
diff --git a/Frontend/src/components/ui/dialog.tsx b/Frontend/src/components/ui/dialog.tsx
deleted file mode 100644
index b6cb28c..0000000
--- a/Frontend/src/components/ui/dialog.tsx
+++ /dev/null
@@ -1,246 +0,0 @@
-import * as React from "react"
-import * as DialogPrimitive from "@radix-ui/react-dialog"
-import { XIcon } from "lucide-react"
-
-import { cn } from "@/lib/utils"
-
-// Focus trap hook for managing focus within the dialog
-function useFocusTrap(enabled: boolean) {
- const containerRef = React.useRef(null)
- const previousFocusRef = React.useRef(null)
-
- React.useEffect(() => {
- if (!enabled || !containerRef.current) return
-
- const container = containerRef.current
- const focusableElements = container.querySelectorAll(
- 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
- )
- const firstElement = focusableElements[0] as HTMLElement
- const lastElement = focusableElements[focusableElements.length - 1] as HTMLElement
-
- // Store the previously focused element
- previousFocusRef.current = document.activeElement as HTMLElement
-
- // Focus the first focusable element
- if (firstElement) {
- firstElement.focus()
- }
-
- const handleKeyDown = (event: KeyboardEvent) => {
- if (event.key === 'Tab') {
- if (event.shiftKey) {
- if (document.activeElement === firstElement) {
- event.preventDefault()
- lastElement.focus()
- }
- } else {
- if (document.activeElement === lastElement) {
- event.preventDefault()
- firstElement.focus()
- }
- }
- }
- }
-
- container.addEventListener('keydown', handleKeyDown)
-
- return () => {
- container.removeEventListener('keydown', handleKeyDown)
- // Restore focus to the previously focused element
- if (previousFocusRef.current) {
- previousFocusRef.current.focus()
- }
- }
- }, [enabled])
-
- return containerRef
-}
-
-function Dialog({
- ...props
-}: React.ComponentProps) {
- return
-}
-
-function DialogTrigger({
- ...props
-}: React.ComponentProps) {
- return
-}
-
-function DialogPortal({
- ...props
-}: React.ComponentProps) {
- return
-}
-
-function DialogClose({
- ...props
-}: React.ComponentProps) {
- return
-}
-
-function DialogOverlay({
- className,
- ...props
-}: React.ComponentProps) {
- return (
-
- )
-}
-
-function DialogContent({
- className,
- children,
- ...props
-}: React.ComponentProps) {
- const [isOpen, setIsOpen] = React.useState(false)
- const contentRef = useFocusTrap(isOpen)
- const [titleId, setTitleId] = React.useState()
- const [descriptionId, setDescriptionId] = React.useState()
-
- // Handle Escape key to close dialog
- const handleKeyDown = React.useCallback((event: React.KeyboardEvent) => {
- if (event.key === 'Escape') {
- event.preventDefault()
- // The close functionality is handled by Radix UI automatically
- }
- }, [])
-
- // Update open state when dialog state changes
- React.useEffect(() => {
- const content = contentRef.current
- if (!content) return
-
- const observer = new MutationObserver((mutations) => {
- mutations.forEach((mutation) => {
- if (mutation.type === 'attributes' && mutation.attributeName === 'data-state') {
- const state = content.getAttribute('data-state')
- setIsOpen(state === 'open')
- }
- })
- })
-
- observer.observe(content, { attributes: true })
- return () => observer.disconnect()
- }, [contentRef])
-
- // Find title and description IDs from children
- React.useEffect(() => {
- const content = contentRef.current
- if (!content) return
-
- const title = content.querySelector('[data-slot="dialog-title"]')
- const description = content.querySelector('[data-slot="dialog-description"]')
-
- setTitleId(title?.id || undefined)
- setDescriptionId(description?.id || undefined)
- }, [children, contentRef])
-
- return (
-
-
-
- {children}
-
-
- Close
-
-
-
- )
-}
-
-function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- )
-}
-
-function DialogFooter({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- )
-}
-
-function DialogTitle({
- className,
- ...props
-}: React.ComponentProps) {
- const titleId = React.useId()
-
- return (
- (null)}
- id={titleId}
- data-slot="dialog-title"
- className={cn("text-lg leading-none font-semibold", className)}
- {...props}
- />
- )
-}
-
-function DialogDescription({
- className,
- ...props
-}: React.ComponentProps) {
- const descriptionId = React.useId()
-
- return (
- (null)}
- id={descriptionId}
- data-slot="dialog-description"
- className={cn("text-muted-foreground text-sm", className)}
- {...props}
- />
- )
-}
-
-export {
- Dialog,
- DialogClose,
- DialogContent,
- DialogDescription,
- DialogFooter,
- DialogHeader,
- DialogOverlay,
- DialogPortal,
- DialogTitle,
- DialogTrigger,
-}
diff --git a/Frontend/src/components/ui/dropdown-menu.tsx b/Frontend/src/components/ui/dropdown-menu.tsx
deleted file mode 100644
index 7c5d05d..0000000
--- a/Frontend/src/components/ui/dropdown-menu.tsx
+++ /dev/null
@@ -1,192 +0,0 @@
-import React from "react";
-import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
-import { Check, ChevronRight, Circle } from "lucide-react";
-import { cn } from "../../lib/utils";
-
-const DropdownMenu = DropdownMenuPrimitive.Root;
-const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
-const DropdownMenuGroup = DropdownMenuPrimitive.Group;
-const DropdownMenuPortal = DropdownMenuPrimitive.Portal;
-const DropdownMenuSub = DropdownMenuPrimitive.Sub;
-const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
-
-const DropdownMenuSubTrigger = React.forwardRef<
- React.ElementRef,
- 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/Frontend/src/components/ui/input.tsx b/Frontend/src/components/ui/input.tsx
deleted file mode 100644
index 6ed9422..0000000
--- a/Frontend/src/components/ui/input.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import React from "react";
-import { cn } from "../../lib/utils";
-
-const Input = React.forwardRef>(
- ({ className, type, ...props }, ref) => {
- return (
-
- );
- }
-);
-Input.displayName = "Input";
-
-export { Input };
diff --git a/Frontend/src/components/ui/label.tsx b/Frontend/src/components/ui/label.tsx
deleted file mode 100644
index f5e1d2c..0000000
--- a/Frontend/src/components/ui/label.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-"use client";
-
-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) => (
-
-));
-
-export { Label };
diff --git a/Frontend/src/components/ui/popover.tsx b/Frontend/src/components/ui/popover.tsx
deleted file mode 100644
index 6d51b6c..0000000
--- a/Frontend/src/components/ui/popover.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import * as React from "react"
-import * as PopoverPrimitive from "@radix-ui/react-popover"
-
-import { cn } from "@/lib/utils"
-
-function Popover({
- ...props
-}: React.ComponentProps) {
- return
-}
-
-function PopoverTrigger({
- ...props
-}: React.ComponentProps) {
- return
-}
-
-function PopoverContent({
- className,
- align = "center",
- sideOffset = 4,
- ...props
-}: React.ComponentProps) {
- return (
-
-
-
- )
-}
-
-function PopoverAnchor({
- ...props
-}: React.ComponentProps) {
- return
-}
-
-export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }
diff --git a/Frontend/src/components/ui/scroll-area.tsx b/Frontend/src/components/ui/scroll-area.tsx
deleted file mode 100644
index 2cb3f46..0000000
--- a/Frontend/src/components/ui/scroll-area.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-"use client";
-
-import * as React from "react";
-import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
-import { cn } from "../../lib/utils";
-
-const ScrollArea = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, children, ...props }, ref) => (
-
-
- {children}
-
-
-
-
-
-));
-
-ScrollArea.displayName = "ScrollArea";
-
-export { ScrollArea };
diff --git a/Frontend/src/components/ui/select.tsx b/Frontend/src/components/ui/select.tsx
deleted file mode 100644
index f01b78d..0000000
--- a/Frontend/src/components/ui/select.tsx
+++ /dev/null
@@ -1,160 +0,0 @@
-"use client";
-
-import * as React from "react";
-import * as SelectPrimitive from "@radix-ui/react-select";
-import { Check, ChevronDown, ChevronUp } from "lucide-react";
-
-import { cn } from "@/lib/utils";
-
-const Select = SelectPrimitive.Root;
-
-const SelectGroup = SelectPrimitive.Group;
-
-const SelectValue = SelectPrimitive.Value;
-
-const SelectTrigger = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, children, ...props }, ref) => (
- span]:line-clamp-1",
- className
- )}
- {...props}
- >
- {children}
-
-
-
-
-));
-SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
-
-const SelectScrollUpButton = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-
-
-));
-SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
-
-const SelectScrollDownButton = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-
-
-));
-SelectScrollDownButton.displayName =
- SelectPrimitive.ScrollDownButton.displayName;
-
-const SelectContent = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, children, position = "popper", ...props }, ref) => (
-
-
-
-
- {children}
-
-
-
-
-));
-SelectContent.displayName = SelectPrimitive.Content.displayName;
-
-const SelectLabel = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-));
-SelectLabel.displayName = SelectPrimitive.Label.displayName;
-
-const SelectItem = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, children, ...props }, ref) => (
-
-
-
-
-
-
-
- {children}
-
-));
-SelectItem.displayName = SelectPrimitive.Item.displayName;
-
-const SelectSeparator = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-));
-SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
-
-export {
- Select,
- SelectGroup,
- SelectValue,
- SelectTrigger,
- SelectContent,
- SelectLabel,
- SelectItem,
- SelectSeparator,
- SelectScrollUpButton,
- SelectScrollDownButton,
-};
diff --git a/Frontend/src/components/ui/separator.tsx b/Frontend/src/components/ui/separator.tsx
deleted file mode 100644
index 5b6774d..0000000
--- a/Frontend/src/components/ui/separator.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-"use client";
-
-import * as React from "react";
-import * as SeparatorPrimitive from "@radix-ui/react-separator";
-
-import { cn } from "@/lib/utils";
-
-const Separator = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(
- (
- { className, orientation = "horizontal", decorative = true, ...props },
- ref
- ) => (
-
- )
-);
-Separator.displayName = SeparatorPrimitive.Root.displayName;
-
-export { Separator };
diff --git a/Frontend/src/components/ui/slider.tsx b/Frontend/src/components/ui/slider.tsx
deleted file mode 100644
index 3b528d2..0000000
--- a/Frontend/src/components/ui/slider.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import * as React from "react";
-import * as SliderPrimitive from "@radix-ui/react-slider";
-import { cn } from "../../lib/utils";
-
-const Slider = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-
-
-
-
-
-));
-
-export { Slider };
diff --git a/Frontend/src/components/ui/switch.tsx b/Frontend/src/components/ui/switch.tsx
deleted file mode 100644
index d19165c..0000000
--- a/Frontend/src/components/ui/switch.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-"use client";
-
-import * as React from "react";
-import * as SwitchPrimitives from "@radix-ui/react-switch";
-
-import { cn } from "@/lib/utils";
-
-const Switch = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-
-
-));
-Switch.displayName = SwitchPrimitives.Root.displayName;
-
-export { Switch };
diff --git a/Frontend/src/components/ui/tabs.tsx b/Frontend/src/components/ui/tabs.tsx
deleted file mode 100644
index 4859b71..0000000
--- a/Frontend/src/components/ui/tabs.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-import React from "react";
-import * as TabsPrimitive from "@radix-ui/react-tabs";
-import { cn } from "../../lib/utils";
-
-const Tabs = TabsPrimitive.Root;
-
-const TabsList = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-));
-TabsList.displayName = TabsPrimitive.List.displayName;
-
-const TabsTrigger = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-));
-TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
-
-const TabsContent = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-));
-TabsContent.displayName = TabsPrimitive.Content.displayName;
-
-export { Tabs, TabsList, TabsTrigger, TabsContent };
diff --git a/Frontend/src/components/ui/textarea.tsx b/Frontend/src/components/ui/textarea.tsx
deleted file mode 100644
index 7f21b5e..0000000
--- a/Frontend/src/components/ui/textarea.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import * as React from "react"
-
-import { cn } from "@/lib/utils"
-
-function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
- return (
-
- )
-}
-
-export { Textarea }
diff --git a/Frontend/src/components/user-nav.tsx b/Frontend/src/components/user-nav.tsx
deleted file mode 100644
index 9c4939f..0000000
--- a/Frontend/src/components/user-nav.tsx
+++ /dev/null
@@ -1,74 +0,0 @@
-import React from "react";
-import { useState } from "react";
-import { Avatar, AvatarFallback, AvatarImage } from "./ui/avatar";
-import { Button } from "./ui/button";
-import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuGroup,
- DropdownMenuItem,
- DropdownMenuLabel,
- DropdownMenuSeparator,
- DropdownMenuTrigger,
-} from "./ui/dropdown-menu";
-import { useAuth } from "../context/AuthContext";
-import { Link } from "react-router-dom";
-
-export function UserNav() {
- const { user, isAuthenticated, logout } = useAuth();
- const [avatarError, setAvatarError] = useState(false);
-
- if (!isAuthenticated || !user) {
- return (
-
-
- Login
-
-
- Sign Up
-
-
- );
- }
-
- const handleAvatarError = () => {
- setAvatarError(true);
- };
-
- return (
-
-
-
-
-
- {user.user_metadata?.name?.charAt(0) || user.email?.charAt(0) || "U"}
-
-
-
-
-
-
-
{user.user_metadata?.name || "User"}
-
- {user.email}
-
-
-
-
-
-
- Dashboard
-
- Profile
- Settings
-
-
- Log out
-
-
- );
-}
diff --git a/Frontend/src/context/AuthContext.tsx b/Frontend/src/context/AuthContext.tsx
deleted file mode 100644
index 8588c41..0000000
--- a/Frontend/src/context/AuthContext.tsx
+++ /dev/null
@@ -1,222 +0,0 @@
-import {
- createContext,
- useContext,
- useState,
- ReactNode,
- useEffect,
-} from "react";
-import { useNavigate } from "react-router-dom";
-import { supabase, User } from "../utils/supabase";
-
-interface AuthContextType {
- isAuthenticated: boolean;
- user: User | null;
- login: () => void;
- logout: () => void;
- checkUserOnboarding: (userToCheck?: User | null) => Promise<{ hasOnboarding: boolean; role: string | null }>;
-}
-
-const AuthContext = createContext(undefined);
-
-interface AuthProviderProps {
- children: ReactNode;
-}
-
-async function ensureUserInTable(user: any) {
- if (!user) return;
-
- // Add a simple cache to prevent repeated requests for the same user
- const cacheKey = `user_${user.id}`;
- if (sessionStorage.getItem(cacheKey)) {
- console.log("User already checked, skipping...");
- return;
- }
-
- try {
- console.log("Testing user table access for user:", user.id);
-
- // Just test if we can access the users table
- const { data, error } = await supabase
- .from("users")
- .select("id")
- .eq("id", user.id)
- .limit(1);
-
- if (error) {
- console.error("Error accessing users table:", error);
- return;
- }
-
- console.log("User table access successful, found:", data?.length || 0, "records");
-
- // Cache the result for 5 minutes to prevent repeated requests
- sessionStorage.setItem(cacheKey, "true");
- setTimeout(() => sessionStorage.removeItem(cacheKey), 5 * 60 * 1000);
-
- // For now, skip the insert to avoid 400 errors
- // We'll handle user creation during onboarding instead
-
- } catch (error) {
- console.error("Error in ensureUserInTable:", error);
- }
-}
-
-export const AuthProvider = ({ children }: AuthProviderProps) => {
- const [user, setUser] = useState(null);
- const [isAuthenticated, setIsAuthenticated] = useState(false);
- const [loading, setLoading] = useState(true);
- const [lastRequest, setLastRequest] = useState(0);
- const navigate = useNavigate();
-
- // Function to check if user has completed onboarding
- const checkUserOnboarding = async (userToCheck?: User | null) => {
- const userToUse = userToCheck || user;
- if (!userToUse) return { hasOnboarding: false, role: null };
-
- // Add rate limiting - only allow one request per 2 seconds
- const now = Date.now();
- if (now - lastRequest < 2000) {
- console.log("Rate limiting: skipping request");
- return { hasOnboarding: false, role: null };
- }
- setLastRequest(now);
-
- // Check if user has completed onboarding by looking for social profiles or brand data
- const { data: socialProfiles } = await supabase
- .from("social_profiles")
- .select("id")
- .eq("user_id", userToUse.id)
- .limit(1);
-
- const { data: brandData } = await supabase
- .from("brands")
- .select("id")
- .eq("user_id", userToUse.id)
- .limit(1);
-
- const hasOnboarding = (socialProfiles && socialProfiles.length > 0) || (brandData && brandData.length > 0);
-
- // Get user role
- const { data: userData } = await supabase
- .from("users")
- .select("role")
- .eq("id", userToUse.id)
- .single();
-
- return { hasOnboarding, role: userData?.role || null };
- };
-
- useEffect(() => {
- let mounted = true;
- console.log("AuthContext: Starting authentication check");
-
- // Add a timeout to prevent infinite loading
- const timeoutId = setTimeout(() => {
- if (mounted && loading) {
- console.log("AuthContext: Loading timeout reached, forcing completion");
- setLoading(false);
- }
- }, 3000); // 3 second timeout
-
- supabase.auth.getSession().then(async ({ data, error }) => {
- if (!mounted) return;
-
- if (error) {
- console.error("AuthContext: Error getting session", error);
- setLoading(false);
- return;
- }
-
- console.log("AuthContext: Session check result", { user: data.session?.user?.email, hasSession: !!data.session });
-
- setUser(data.session?.user || null);
- setIsAuthenticated(!!data.session?.user);
- if (data.session?.user) {
- console.log("AuthContext: Ensuring user in table");
- try {
- await ensureUserInTable(data.session.user);
- } catch (error) {
- console.error("AuthContext: Error ensuring user in table", error);
- }
- }
- setLoading(false);
- console.log("AuthContext: Initial loading complete");
- }).catch(error => {
- console.error("AuthContext: Error getting session", error);
- if (mounted) {
- setLoading(false);
- }
- });
-
- const { data: listener } = supabase.auth.onAuthStateChange(
- async (event, session) => {
- if (!mounted) return;
-
- console.log("AuthContext: Auth state change", { event, user: session?.user?.email });
-
- setUser(session?.user || null);
- setIsAuthenticated(!!session?.user);
-
- if (session?.user) {
- console.log("AuthContext: User authenticated");
- try {
- await ensureUserInTable(session.user);
- } catch (error) {
- console.error("AuthContext: Error ensuring user in table", error);
- }
- setLoading(false);
- } else {
- // User logged out
- console.log("AuthContext: User logged out");
- setLoading(false);
- }
- }
- );
-
- return () => {
- mounted = false;
- clearTimeout(timeoutId);
- listener.subscription.unsubscribe();
- };
- }, []);
-
- const login = () => {
- setIsAuthenticated(true);
- navigate("/dashboard");
- };
-
- const logout = async () => {
- await supabase.auth.signOut();
- setUser(null);
- setIsAuthenticated(false);
- navigate("/");
- };
-
- if (loading) {
- return (
-
-
Loading...
-
(If this is taking too long, try refreshing the page.)
-
setLoading(false)}
- className="mt-4 px-4 py-2 bg-purple-600 text-white rounded-lg hover:bg-purple-700"
- >
- Continue Anyway
-
-
- );
- }
-
- return (
-
- {children}
-
- );
-};
-export const useAuth = () => {
- const context = useContext(AuthContext);
- if (!context) {
- throw new Error("useAuth must be used within an AuthProvider");
- }
- return context;
-};
\ No newline at end of file
diff --git a/Frontend/src/hooks/useCollaborationState.ts b/Frontend/src/hooks/useCollaborationState.ts
deleted file mode 100644
index 174a6e6..0000000
--- a/Frontend/src/hooks/useCollaborationState.ts
+++ /dev/null
@@ -1,159 +0,0 @@
-import { useReducer, useCallback } from 'react';
-
-// Types
-export interface FilterState {
- niche: string;
- audienceSize: string;
- collaborationType: string;
- location: string;
-}
-
-export interface ModalState {
- newCollaboration: boolean;
- aiSearch: boolean;
-}
-
-export interface CollaborationState {
- modals: ModalState;
- filters: FilterState;
-}
-
-// Action Types
-export type CollaborationAction =
- | { type: 'OPEN_MODAL'; modal: keyof ModalState }
- | { type: 'CLOSE_MODAL'; modal: keyof ModalState }
- | { type: 'UPDATE_FILTER'; filter: keyof FilterState; value: string }
- | { type: 'RESET_FILTERS' }
- | { type: 'RESET_ALL' };
-
-// Initial State
-const initialState: CollaborationState = {
- modals: {
- newCollaboration: false,
- aiSearch: false,
- },
- filters: {
- niche: 'all',
- audienceSize: 'all',
- collaborationType: 'all',
- location: 'all',
- },
-};
-
-// Reducer Function
-function collaborationReducer(
- state: CollaborationState,
- action: CollaborationAction
-): CollaborationState {
- switch (action.type) {
- case 'OPEN_MODAL':
- return {
- ...state,
- modals: {
- ...state.modals,
- [action.modal]: true,
- },
- };
-
- case 'CLOSE_MODAL':
- return {
- ...state,
- modals: {
- ...state.modals,
- [action.modal]: false,
- },
- };
-
- case 'UPDATE_FILTER':
- return {
- ...state,
- filters: {
- ...state.filters,
- [action.filter]: action.value,
- },
- };
-
- case 'RESET_FILTERS':
- return {
- ...state,
- filters: initialState.filters,
- };
-
- case 'RESET_ALL':
- return initialState;
-
- default:
- return state;
- }
-}
-
-// Custom Hook
-export function useCollaborationState() {
- const [state, dispatch] = useReducer(collaborationReducer, initialState);
-
- // Modal Actions
- const openModal = useCallback((modal: keyof ModalState) => {
- dispatch({ type: 'OPEN_MODAL', modal });
- }, []);
-
- const closeModal = useCallback((modal: keyof ModalState) => {
- dispatch({ type: 'CLOSE_MODAL', modal });
- }, []);
-
- const openNewCollaborationModal = useCallback(() => {
- openModal('newCollaboration');
- }, [openModal]);
-
- const closeNewCollaborationModal = useCallback(() => {
- closeModal('newCollaboration');
- }, [closeModal]);
-
- const openAiSearchModal = useCallback(() => {
- openModal('aiSearch');
- }, [openModal]);
-
- const closeAiSearchModal = useCallback(() => {
- closeModal('aiSearch');
- }, [closeModal]);
-
- // Filter Actions
- const updateFilter = useCallback((filter: keyof FilterState, value: string) => {
- dispatch({ type: 'UPDATE_FILTER', filter, value });
- }, []);
-
- const resetFilters = useCallback(() => {
- dispatch({ type: 'RESET_FILTERS' });
- }, []);
-
- const resetAll = useCallback(() => {
- dispatch({ type: 'RESET_ALL' });
- }, []);
-
- // Computed Values
- const hasActiveFilters = Object.values(state.filters).some(value => value !== 'all');
- const activeFiltersCount = Object.values(state.filters).filter(value => value !== 'all').length;
-
- return {
- // State
- state,
- modals: state.modals,
- filters: state.filters,
-
- // Modal Actions
- openModal,
- closeModal,
- openNewCollaborationModal,
- closeNewCollaborationModal,
- openAiSearchModal,
- closeAiSearchModal,
-
- // Filter Actions
- updateFilter,
- resetFilters,
- resetAll,
-
- // Computed Values
- hasActiveFilters,
- activeFiltersCount,
- };
-}
\ No newline at end of file
diff --git a/Frontend/src/index.css b/Frontend/src/index.css
deleted file mode 100644
index f2a93bb..0000000
--- a/Frontend/src/index.css
+++ /dev/null
@@ -1,181 +0,0 @@
-@import "tailwindcss";
-@import "tw-animate-css";
-
-@custom-variant dark (&:is(.dark *));
-
-:root {
- --radius: 0.625rem;
- --background: oklch(1 0 0);
- --foreground: oklch(0.145 0 0);
- --card: oklch(1 0 0);
- --card-foreground: oklch(0.145 0 0);
- --popover: oklch(1 0 0);
- --popover-foreground: oklch(0.145 0 0);
- --primary: oklch(0.205 0 0);
- --primary-foreground: oklch(0.985 0 0);
- --secondary: oklch(0.97 0 0);
- --secondary-foreground: oklch(0.205 0 0);
- --muted: oklch(0.97 0 0);
- --muted-foreground: oklch(0.556 0 0);
- --accent: oklch(0.97 0 0);
- --accent-foreground: oklch(0.205 0 0);
- --destructive: oklch(0.577 0.245 27.325);
- --border: oklch(0.922 0 0);
- --input: oklch(0.922 0 0);
- --ring: oklch(0.708 0 0);
- --chart-1: oklch(0.646 0.222 41.116);
- --chart-2: oklch(0.6 0.118 184.704);
- --chart-3: oklch(0.398 0.07 227.392);
- --chart-4: oklch(0.828 0.189 84.429);
- --chart-5: oklch(0.769 0.188 70.08);
- --sidebar: oklch(0.985 0 0);
- --sidebar-foreground: oklch(0.145 0 0);
- --sidebar-primary: oklch(0.205 0 0);
- --sidebar-primary-foreground: oklch(0.985 0 0);
- --sidebar-accent: oklch(0.97 0 0);
- --sidebar-accent-foreground: oklch(0.205 0 0);
- --sidebar-border: oklch(0.922 0 0);
- --sidebar-ring: oklch(0.708 0 0);
-}
-
-.dark {
- --background: oklch(0.145 0 0);
- --foreground: oklch(0.985 0 0);
- --card: oklch(0.205 0 0);
- --card-foreground: oklch(0.985 0 0);
- --popover: oklch(0.205 0 0);
- --popover-foreground: oklch(0.985 0 0);
- --primary: oklch(0.922 0 0);
- --primary-foreground: oklch(0.205 0 0);
- --secondary: oklch(0.269 0 0);
- --secondary-foreground: oklch(0.985 0 0);
- --muted: oklch(0.269 0 0);
- --muted-foreground: oklch(0.708 0 0);
- --accent: oklch(0.269 0 0);
- --accent-foreground: oklch(0.985 0 0);
- --destructive: oklch(0.704 0.191 22.216);
- --border: oklch(1 0 0 / 10%);
- --input: oklch(1 0 0 / 15%);
- --ring: oklch(0.556 0 0);
- --chart-1: oklch(0.488 0.243 264.376);
- --chart-2: oklch(0.696 0.17 162.48);
- --chart-3: oklch(0.769 0.188 70.08);
- --chart-4: oklch(0.627 0.265 303.9);
- --chart-5: oklch(0.645 0.246 16.439);
- --sidebar: oklch(0.205 0 0);
- --sidebar-foreground: oklch(0.985 0 0);
- --sidebar-primary: oklch(0.488 0.243 264.376);
- --sidebar-primary-foreground: oklch(0.985 0 0);
- --sidebar-accent: oklch(0.269 0 0);
- --sidebar-accent-foreground: oklch(0.985 0 0);
- --sidebar-border: oklch(1 0 0 / 10%);
- --sidebar-ring: oklch(0.556 0 0);
-}
-
-@theme inline {
- --radius-sm: calc(var(--radius) - 4px);
- --radius-md: calc(var(--radius) - 2px);
- --radius-lg: var(--radius);
- --radius-xl: calc(var(--radius) + 4px);
- --color-background: var(--background);
- --color-foreground: var(--foreground);
- --color-card: var(--card);
- --color-card-foreground: var(--card-foreground);
- --color-popover: var(--popover);
- --color-popover-foreground: var(--popover-foreground);
- --color-primary: var(--primary);
- --color-primary-foreground: var(--primary-foreground);
- --color-secondary: var(--secondary);
- --color-secondary-foreground: var(--secondary-foreground);
- --color-muted: var(--muted);
- --color-muted-foreground: var(--muted-foreground);
- --color-accent: var(--accent);
- --color-accent-foreground: var(--accent-foreground);
- --color-destructive: var(--destructive);
- --color-border: var(--border);
- --color-input: var(--input);
- --color-ring: var(--ring);
- --color-chart-1: var(--chart-1);
- --color-chart-2: var(--chart-2);
- --color-chart-3: var(--chart-3);
- --color-chart-4: var(--chart-4);
- --color-chart-5: var(--chart-5);
- --color-sidebar: var(--sidebar);
- --color-sidebar-foreground: var(--sidebar-foreground);
- --color-sidebar-primary: var(--sidebar-primary);
- --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
- --color-sidebar-accent: var(--sidebar-accent);
- --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
- --color-sidebar-border: var(--sidebar-border);
- --color-sidebar-ring: var(--sidebar-ring);
-}
-
-@layer base {
- * {
- @apply border-border outline-ring/50;
- }
- body {
- @apply bg-background text-foreground;
- }
-}
-
-/* Custom Animations */
-@keyframes gradient {
- 0% {
- background-position: 0% 50%;
- }
- 50% {
- background-position: 100% 50%;
- }
- 100% {
- background-position: 0% 50%;
- }
-}
-
-@keyframes float {
- 0%, 100% {
- transform: translateY(0px);
- }
- 50% {
- transform: translateY(-10px);
- }
-}
-
-@keyframes glow {
- 0%, 100% {
- box-shadow: 0 0 20px rgba(147, 51, 234, 0.3);
- }
- 50% {
- box-shadow: 0 0 40px rgba(147, 51, 234, 0.6);
- }
-}
-
-.animate-gradient {
- background-size: 200% 200%;
- animation: gradient 3s ease infinite;
-}
-
-.animate-float {
- animation: float 3s ease-in-out infinite;
-}
-
-.animate-glow {
- animation: glow 2s ease-in-out infinite;
-}
-
-/* 3D Text Effect */
-.text-3d {
- text-shadow:
- 0 1px 0 #ccc,
- 0 2px 0 #c9c9c9,
- 0 3px 0 #bbb,
- 0 4px 0 #b9b9b9,
- 0 5px 0 #aaa,
- 0 6px 1px rgba(0,0,0,.1),
- 0 0 5px rgba(0,0,0,.1),
- 0 1px 3px rgba(0,0,0,.3),
- 0 3px 5px rgba(0,0,0,.2),
- 0 5px 10px rgba(0,0,0,.25),
- 0 10px 10px rgba(0,0,0,.2),
- 0 20px 20px rgba(0,0,0,.15);
-}
diff --git a/Frontend/src/lib/useChat.tsx b/Frontend/src/lib/useChat.tsx
deleted file mode 100644
index 771c562..0000000
--- a/Frontend/src/lib/useChat.tsx
+++ /dev/null
@@ -1,229 +0,0 @@
-import React, {
- createContext,
- useContext,
- useEffect,
- useRef,
- useState,
-} from "react";
-import { useDispatch } from "react-redux";
-import {
- addChats,
- addMessage,
- addOldMessages,
- Message,
- markChatAsSeen as reduxMarkChatAsSeen,
- updateUserDetails,
- markMessageAsSeen as reduxMarkMessageAsSeen,
- setSelectedChat,
-} from "@/redux/chatSlice";
-import { API_URL } from "@/lib/utils";
-import axios from "axios";
-
-interface ChatContextType {
- sendMessage: (receiverId: string, message: string) => void;
- isConnected: boolean;
- fetchChatList: () => Promise;
- fetchChatMessages: (
- chatListId: string,
- lastFetched: number
- ) => Promise;
- markChatAsSeen: (chatListId: string) => Promise;
- fetchUserDetails: (targetUserId: string, chatListId: string) => Promise;
- markMessageAsSeen: (chatListId: string, messageId: string) => Promise;
- createChatWithMessage: (
- username: string,
- message: string
- ) => Promise;
-}
-
-const ChatContext = createContext(undefined);
-
-export const ChatProvider: React.FC<{
- userId: string;
- children: React.ReactNode;
-}> = ({ userId, children }) => {
- const ws = useRef(null);
- const [isConnected, setIsConnected] = useState(false);
- const dispatch = useDispatch();
-
- useEffect(() => {
- if (!userId) return;
-
- const websocket = new WebSocket(
- `ws://${API_URL.replace(/^https?:\/\//, "")}/chat/ws/${userId}`
- );
-
- websocket.onopen = () => {
- console.log("WebSocket Connected");
- setIsConnected(true);
- };
-
- websocket.onmessage = (event) => {
- const data = JSON.parse(event.data);
- console.log("Message received:", data);
-
- if (
- data.eventType === "NEW_MESSAGE_RECEIVED" ||
- data.eventType === "NEW_MESSAGE_DELIVERED" ||
- data.eventType === "NEW_MESSAGE_SENT"
- ) {
- dispatch(
- addMessage({
- chatListId: data.chatListId,
- message: data,
- })
- );
- } else if (data.eventType === "CHAT_MESSAGES_READ") {
- dispatch(
- reduxMarkChatAsSeen({
- chatListId: data.chatListId,
- })
- );
- } else if (data.eventType === "MESSAGE_READ") {
- dispatch(
- reduxMarkMessageAsSeen({
- chatListId: data.chatListId,
- messageId: data.messageId,
- })
- );
- }
- };
-
- websocket.onclose = () => {
- console.log("WebSocket Disconnected");
- setIsConnected(false);
- };
-
- ws.current = websocket;
-
- return () => {
- if (ws.current) ws.current.close();
- };
- }, [userId, dispatch]);
-
- const sendMessage = (receiverId: string, message: string) => {
- if (ws.current && isConnected) {
- ws.current.send(
- JSON.stringify({
- event_type: "SEND_MESSAGE",
- receiver_id: receiverId,
- message: message,
- })
- );
- }
- };
-
- const fetchChatList = async () => {
- try {
- const response = await axios.get(`${API_URL}/chat/chat_list/${userId}`);
- dispatch(addChats(response.data));
- } catch (error) {
- console.error("Error fetching chat list:", error);
- }
- };
-
- const fetchChatMessages = async (chatListId: string, lastFetched: number) => {
- try {
- const response = await axios.get(
- `${API_URL}/chat/messages/${userId}/${chatListId}`,
- {
- params: {
- last_fetched: lastFetched,
- },
- }
- );
- dispatch(
- addOldMessages({
- chatListId: chatListId,
- messages: response.data,
- })
- );
- if (response.data.length === 0) return false;
- return true;
- } catch (error) {
- console.error("Error fetching chat messages:", error);
- return false;
- }
- };
-
- const markChatAsSeen = async (chatListId: string) => {
- try {
- await axios.put(API_URL + `/chat/read/${userId}/${chatListId}`);
- } catch (error) {
- console.error("Error marking chat as seen:", error);
- }
- };
-
- const fetchUserDetails = async (targetUserId: string, chatListId: string) => {
- try {
- const response = await axios.get(
- `${API_URL}/chat/user_name/${targetUserId}`
- );
- dispatch(
- updateUserDetails({
- chatListId: chatListId,
- username: response.data.username,
- profileImage: response.data.profileImage,
- })
- );
- } catch (error) {
- console.error("Error fetching username:", error);
- }
- };
-
- const markMessageAsSeen = async (chatListId: string, messageId: string) => {
- try {
- await axios.put(
- `${API_URL}/chat/read/${userId}/${chatListId}/${messageId}`
- );
- } catch (error) {
- console.error("Error marking message as seen:", error);
- }
- };
-
- const createChatWithMessage = async (username: string, message: string) => {
- try {
- const response = await axios.post(
- `${API_URL}/chat/new_chat/${userId}/${username}`,
- {
- message,
- }
- );
- const chatListId = response.data.chatListId;
- dispatch(setSelectedChat(chatListId));
- if (response.data.isChatListExists) {
- return false;
- }
- return true;
- } catch (error) {
- console.error("Error creating chat with message:", error);
-
- return false;
- }
- };
-
- return (
-
- {isConnected ? children : null}
-
- );
-};
-
-export const useChat = (): ChatContextType => {
- const context = useContext(ChatContext);
- if (!context) {
- throw new Error("useChat must be used within a ChatProvider");
- }
- return context;
-};
diff --git a/Frontend/src/lib/utils.ts b/Frontend/src/lib/utils.ts
deleted file mode 100644
index 43fc355..0000000
--- a/Frontend/src/lib/utils.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { clsx, type ClassValue } from "clsx";
-import { twMerge } from "tailwind-merge";
-
-export function cn(...inputs: ClassValue[]) {
- return twMerge(clsx(inputs));
-}
-
-export const API_URL = import.meta.env.VITE_API_URL || "http://localhost:8000";
diff --git a/Frontend/src/main.tsx b/Frontend/src/main.tsx
deleted file mode 100644
index 18b97e0..0000000
--- a/Frontend/src/main.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { StrictMode } from "react";
-import { createRoot } from "react-dom/client";
-import "./index.css";
-import { Provider } from "react-redux";
-import App from "./App.tsx";
-import store from "./redux/store.ts";
-
-createRoot(document.getElementById("root")!).render(
- //
-
-
-
- // ,
-);
diff --git a/Frontend/src/pages/Analytics.tsx b/Frontend/src/pages/Analytics.tsx
deleted file mode 100644
index 8ae90fe..0000000
--- a/Frontend/src/pages/Analytics.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import React from 'react'
-
-function Analytics() {
- return (
- Analytics
- )
-}
-
-export default Analytics
\ No newline at end of file
diff --git a/Frontend/src/pages/BasicDetails.tsx b/Frontend/src/pages/BasicDetails.tsx
deleted file mode 100644
index d72e0ef..0000000
--- a/Frontend/src/pages/BasicDetails.tsx
+++ /dev/null
@@ -1,577 +0,0 @@
-import { Button } from "../components/ui/button";
-import {
- Card,
- CardContent,
- CardDescription,
- CardHeader,
- CardTitle,
-} from "../components/ui/card";
-import { Input } from "../components/ui/input";
-import { Label } from "../components/ui/label";
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "../components/ui/select";
-import {
- Instagram,
- Youtube,
- Twitter,
- BookText as TikTok,
- Globe,
- ChevronRight,
- ChevronLeft,
- Rocket,
- Check,
-} from "lucide-react";
-import { motion, AnimatePresence } from "framer-motion";
-import { useState, useEffect } from "react";
-import { useParams } from "react-router-dom";
-import { UserNav } from "../components/user-nav";
-import { Link } from "react-router-dom";
-import { ModeToggle } from "../components/mode-toggle";
-
-export default function BasicDetails() {
- const { user } = useParams();
- const [step, setStep] = useState(0);
- const [animationDirection, setAnimationDirection] = useState(0);
-
- const totalSteps = user === "influencer" ? 3 : 2;
- const nextStep = () => {
- if ((user === "influencer" && step < 2) || (user === "brand" && step < 1)) {
- setAnimationDirection(1);
- setTimeout(() => {
- setStep((prev) => prev + 1);
- }, 50);
- }
- };
-
- const prevStep = () => {
- if (step > 0) {
- setAnimationDirection(-1);
- setTimeout(() => {
- setStep((prev) => prev - 1);
- }, 50);
- }
- };
-
- useEffect(() => {
- // Reset animation direction after animation completes
- const timer = setTimeout(() => {
- setAnimationDirection(0);
- }, 500);
- return () => clearTimeout(timer);
- }, [step]);
-
- const InfluencerBasicDetails = () => (
-
-
-
- Email
-
-
-
- Phone Number
-
-
-
- Content Category
-
-
-
-
-
- Lifestyle
- Technology
- Fashion
- Gaming
- Food
- Travel
- Fitness
- Education
-
-
-
-
- );
-
- const InfluencerSocialMedia = () => (
-
- );
-
- const InfluencerAudience = () => (
-
-
- Total Audience Size
-
-
-
- Average Engagement Rate (%)
-
-
-
- Primary Platform
-
-
-
-
-
- Instagram
- YouTube
- TikTok
- Twitter
-
-
-
-
- Primary Audience Age Range
-
-
-
-
-
- 13-17
- 18-24
- 25-34
- 35-44
- 45+
-
-
-
-
- );
-
- const BrandBasicDetails = () => (
-
-
-
- Brand Information
-
- Company Name
-
-
-
- Company Website
-
-
-
-
- Industry
-
-
-
-
-
- Fashion
- Technology
- Food & Beverage
- Health & Wellness
- Beauty
- Entertainment
-
-
-
-
- Company Size
-
-
-
-
-
- 1-10 employees
- 11-50 employees
- 51-200 employees
- 201-500 employees
- 501+ employees
-
-
-
-
-
- Monthly Marketing Budget
-
-
-
-
-
- $0 - $5,000
- $5,001 - $10,000
- $10,001 - $50,000
- $50,001+
-
-
-
-
- );
-
- const BrandCampaignPreferences = () => (
-
-
-
- Campaign Settings
-
- Target Audience Age Range
-
-
-
-
-
- 13-17
- 18-24
- 25-34
- 35-44
- 45+
-
-
-
-
- Preferred Platforms
-
-
-
-
-
- Instagram
- YouTube
- TikTok
- Twitter
-
-
-
-
- Primary Campaign Goals
-
-
-
-
-
- Brand Awareness
- Direct Sales
- Community Engagement
- Brand Loyalty
-
-
-
-
- );
-
- const getStepContent = () => {
- if (user === "influencer") {
- switch (step) {
- case 0:
- return {
- title: "Basic Details",
- description: "Let's start with your personal information",
- content: ,
- };
- case 1:
- return {
- title: "Social Media Profiles",
- description: "Connect your social media accounts",
- content: ,
- };
- case 2:
- return {
- title: "Audience Information",
- description: "Tell us about your audience and engagement",
- content: ,
- };
- }
- } else {
- switch (step) {
- case 0:
- return {
- title: "Company Information",
- description: "Tell us about your brand",
- content: ,
- };
- case 1:
- return {
- title: "Campaign Preferences",
- description: "Define your target audience and campaign goals",
- content: ,
- };
- }
- }
- };
-
- const currentStep = getStepContent();
- const variants = {
- enter: (direction: number) => {
- return {
- x: direction > 0 ? 300 : -300,
- opacity: 0,
- };
- },
- center: {
- x: 0,
- opacity: 1,
- },
- exit: (direction: number) => {
- return {
- x: direction < 0 ? 300 : -300,
- opacity: 0,
- };
- },
- };
-
- const resetForm = () => {
- setStep(0);
- setAnimationDirection(0);
-
- document.querySelectorAll("input").forEach((input) => (input.value = ""));
- document
- .querySelectorAll("select")
- .forEach((select) => (select.value = ""));
- };
-
- return (
- <>
-
-
-
-
-
- Inpact
-
-
-
- Need help?
-
- Contact support
-
-
-
-
-
-
-
-
- {/* Progress indicator */}
-
-
-
- Step {step + 1} of {totalSteps}
-
-
- {Math.round(((step + 1) / totalSteps) * 100)}% Complete
-
-
-
-
-
-
- {Array.from({ length: totalSteps }).map((_, index) => (
-
-
- {index < step ? (
-
- ) : (
-
- {index + 1}
-
- )}
-
-
- ))}
-
-
-
-
-
-
- {currentStep?.title}
-
-
- {currentStep?.description}
-
-
-
-
-
- {currentStep?.content}
-
-
-
-
-
-
- Back
-
-
-
-
- {Array.from({ length: totalSteps }).map(
- (_, index) => (
-
- )
- )}
-
-
-
-
- {step === totalSteps - 1 ? "Complete" : "Next"}
-
-
-
-
-
-
-
-
- Need to start over?{" "}
-
- Reset form
-
-
-
-
-
-
-
-
- >
- );
-}
diff --git a/Frontend/src/pages/Brand/Dashboard.tsx b/Frontend/src/pages/Brand/Dashboard.tsx
deleted file mode 100644
index 023c77b..0000000
--- a/Frontend/src/pages/Brand/Dashboard.tsx
+++ /dev/null
@@ -1,380 +0,0 @@
-import Chat from "@/components/chat/chat";
-import { Button } from "../../components/ui/button";
-import {
- Card,
- CardContent,
- CardHeader,
- CardTitle,
-} from "../../components/ui/card";
-import { Input } from "../../components/ui/input";
-import {
- Tabs,
- TabsContent,
- TabsList,
- TabsTrigger,
-} from "../../components/ui/tabs";
-import {
- BarChart3,
- Users,
- MessageSquareMore,
- TrendingUp,
- Search,
- Bell,
- UserCircle,
- FileText,
- Send,
- Clock,
- CheckCircle2,
- XCircle,
- BarChart,
- ChevronRight,
- FileSignature,
- LineChart,
- Activity,
- Rocket,
-} from "lucide-react";
-import { CreatorMatches } from "../../components/dashboard/creator-matches";
-import { useState } from "react";
-
-const Dashboard = () => {
- // Mock sponsorships for selection (replace with real API call if needed)
- const sponsorships = [
- { id: "1", title: "Summer Collection" },
- { id: "2", title: "Tech Launch" },
- { id: "3", title: "Fitness Drive" },
- ];
- const [selectedSponsorship, setSelectedSponsorship] = useState("");
-
- return (
- <>
-
- {/* Navigation */}
-
-
-
-
-
-
- Inpact
-
-
- Brand
-
-
-
-
-
-
-
-
- {/* Header */}
-
-
- Brand Dashboard
-
-
- Discover and collaborate with creators that match your brand
-
-
-
- {/* Search */}
-
-
-
-
-
- {/* Main Content */}
-
-
- Discover
- Contracts
- Messages
- Tracking
-
-
- {/* Discover Tab */}
-
- {/* Stats */}
-
-
-
-
- Active Creators
-
-
-
-
- 12,234
-
- +180 from last month
-
-
-
-
-
-
- Avg. Engagement
-
-
-
-
- 4.5%
-
- +0.3% from last month
-
-
-
-
-
-
- Active Campaigns
-
-
-
-
- 24
-
- 8 pending approval
-
-
-
-
-
-
- Messages
-
-
-
-
- 12
-
- 3 unread messages
-
-
-
-
-
- {/* Creator Recommendations */}
-
-
-
- Matched Creators for Your Campaign
-
-
-
- Select Campaign:
-
-
-
-
-
-
- {/* Contracts Tab */}
-
-
-
- Active Contracts
-
-
-
- New Contract
-
-
-
-
- {[1, 2, 3].map((i) => (
-
-
-
-
-
-
- Summer Collection Campaign
-
-
- with Alex Rivera
-
-
-
-
- Due in 12 days
-
-
-
-
-
-
- Active
-
-
- $2,400
-
-
-
-
-
-
-
- View Contract
-
-
-
- Message
-
-
-
-
-
- ))}
-
-
-
- {/* Messages Tab */}
-
-
-
-
- {/* Tracking Tab */}
-
-
-
-
-
- Total Reach
-
-
-
-
- 2.4M
-
- Across all campaigns
-
-
-
-
-
-
- Engagement Rate
-
-
-
-
- 5.2%
-
- Average across creators
-
-
-
-
-
- ROI
-
-
-
- 3.8x
-
- Last 30 days
-
-
-
-
-
-
- Active Posts
-
-
-
-
- 156
-
- Across platforms
-
-
-
-
-
-
-
- Campaign Performance
-
-
- {[1, 2, 3].map((i) => (
-
-
-
-
-
-
Summer Collection
-
- with Sarah Parker
-
-
-
-
-
458K Reach
-
- 6.2% Engagement
-
-
-
-
-
-
- 12 Posts Live
-
-
-
- 2 Pending
-
-
-
- ))}
-
-
-
-
-
-
- >
- );
-};
-
-export default Dashboard;
diff --git a/Frontend/src/pages/CollaborationDetails.tsx b/Frontend/src/pages/CollaborationDetails.tsx
deleted file mode 100644
index f0c29f9..0000000
--- a/Frontend/src/pages/CollaborationDetails.tsx
+++ /dev/null
@@ -1,900 +0,0 @@
-import React, { useState, useEffect } from "react";
-import { useParams, useNavigate, Link } from "react-router-dom";
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../components/ui/card";
-import { Button } from "../components/ui/button";
-import { Avatar, AvatarFallback, AvatarImage } from "../components/ui/avatar";
-import { Badge } from "../components/ui/badge";
-import { Tabs, TabsContent, TabsList, TabsTrigger } from "../components/ui/tabs";
-import { Input } from "../components/ui/input";
-import { Textarea } from "../components/ui/textarea";
-import { Separator } from "../components/ui/separator";
-import { ModeToggle } from "../components/mode-toggle";
-import { UserNav } from "../components/user-nav";
-import {
- ArrowLeft,
- MessageSquare,
- Calendar,
- CheckCircle,
- Clock,
- FileText,
- Users,
- BarChart3,
- Send,
- Edit,
- Download,
- Eye,
- MoreHorizontal,
- Phone,
- Mail,
- MapPin,
- ExternalLink,
- Star,
- TrendingUp,
- Activity,
- LayoutDashboard,
- Briefcase,
- Search,
- Rocket,
- X
-} from "lucide-react";
-import { activeCollabsMock } from "../components/collaboration-hub/activeCollabsMockData";
-import CollaborationOverviewTab from "../components/collaboration-hub/CollaborationOverviewTab";
-import CollaborationMessagesTab from "../components/collaboration-hub/CollaborationMessagesTab";
-import CollaborationTimelineTab from "../components/collaboration-hub/CollaborationTimelineTab";
-import CollaboratorSidebar from "../components/collaboration-hub/CollaboratorSidebar";
-import CollaborationQuickActions from "../components/collaboration-hub/CollaborationQuickActions";
-import CollaborationProjectStats from "../components/collaboration-hub/CollaborationProjectStats";
-
-interface Message {
- id: number;
- sender: string;
- content: string;
- timestamp: string;
- isOwn: boolean;
-}
-
-interface Deliverable {
- id: number;
- title: string;
- description: string;
- status: "pending" | "in-progress" | "completed" | "review";
- dueDate: string;
- assignedTo: string;
- files?: string[];
-}
-
-interface Milestone {
- id: number;
- title: string;
- description: string;
- dueDate: string;
- status: "upcoming" | "in-progress" | "completed";
- progress: number;
-}
-
-const mockMessages: Message[] = [
- {
- id: 1,
- sender: "GadgetGuru",
- content: "Hey! I've started working on the unboxing video. Should have the first draft ready by tomorrow.",
- timestamp: "2024-06-10 14:30",
- isOwn: false
- },
- {
- id: 2,
- sender: "You",
- content: "Perfect! Looking forward to seeing it. Any specific angles you want to focus on?",
- timestamp: "2024-06-10 15:45",
- isOwn: true
- },
- {
- id: 3,
- sender: "GadgetGuru",
- content: "I'm thinking close-ups of the packaging and then a reveal shot. Also planning to include some B-roll of the setup process.",
- timestamp: "2024-06-10 16:20",
- isOwn: false
- }
-];
-
-const mockDeliverables: Deliverable[] = [
- {
- id: 1,
- title: "Unboxing Video",
- description: "Main unboxing video showcasing the product features",
- status: "in-progress",
- dueDate: "2024-06-12",
- assignedTo: "GadgetGuru",
- files: ["unboxing_draft_v1.mp4"]
- },
- {
- id: 2,
- title: "Thumbnail Design",
- description: "Eye-catching thumbnail for the video",
- status: "completed",
- dueDate: "2024-06-10",
- assignedTo: "GadgetGuru",
- files: ["thumbnail_final.png"]
- },
- {
- id: 3,
- title: "Social Media Posts",
- description: "Instagram and TikTok posts promoting the collaboration",
- status: "pending",
- dueDate: "2024-06-15",
- assignedTo: "GadgetGuru"
- }
-];
-
-const mockMilestones: Milestone[] = [
- {
- id: 1,
- title: "Project Kickoff",
- description: "Initial meeting and project setup",
- dueDate: "2024-06-01",
- status: "completed",
- progress: 100
- },
- {
- id: 2,
- title: "Content Creation",
- description: "Video production and editing",
- dueDate: "2024-06-12",
- status: "in-progress",
- progress: 65
- },
- {
- id: 3,
- title: "Review & Approval",
- description: "Content review and final approval",
- dueDate: "2024-06-14",
- status: "upcoming",
- progress: 0
- },
- {
- id: 4,
- title: "Publication",
- description: "Video goes live on all platforms",
- dueDate: "2024-06-15",
- status: "upcoming",
- progress: 0
- }
-];
-
-export default function CollaborationDetails() {
- const { id } = useParams<{ id: string }>();
- const navigate = useNavigate();
- const [newMessage, setNewMessage] = useState("");
- const [activeTab, setActiveTab] = useState("overview");
- const [showContractModal, setShowContractModal] = useState(false);
- const [messageStyle, setMessageStyle] = useState("professional");
- const [showStyleOptions, setShowStyleOptions] = useState(false);
- const [customStyle, setCustomStyle] = useState("");
- const [isEditingUpdate, setIsEditingUpdate] = useState(false);
- const [editedUpdate, setEditedUpdate] = useState("");
- const [showDeliverableModal, setShowDeliverableModal] = useState(false);
- const [selectedDeliverable, setSelectedDeliverable] = useState(null);
-
- // Find the collaboration data
- const collaboration = activeCollabsMock.find(collab => collab.id === parseInt(id || "1"));
-
- if (!collaboration) {
- return (
-
-
-
Collaboration Not Found
-
The collaboration you're looking for doesn't exist.
-
navigate("/dashboard/collaborations")}>
- Back to Collaborations
-
-
-
- );
- }
-
- const getStatusColor = (status: string) => {
- switch (status) {
- case "In Progress": return "bg-blue-100 text-blue-700";
- case "Awaiting Response": return "bg-yellow-100 text-yellow-700";
- case "Completed": return "bg-green-100 text-green-700";
- default: return "bg-gray-100 text-gray-700";
- }
- };
-
- const getDeliverableStatusColor = (status: string) => {
- switch (status) {
- case "completed": return "bg-green-100 text-green-700";
- case "in-progress": return "bg-blue-100 text-blue-700";
- case "review": return "bg-yellow-100 text-yellow-700";
- case "pending": return "bg-gray-100 text-gray-700";
- default: return "bg-gray-100 text-gray-700";
- }
- };
-
- const getMilestoneStatusColor = (status: string) => {
- switch (status) {
- case "completed": return "bg-green-100 text-green-700";
- case "in-progress": return "bg-blue-100 text-blue-700";
- case "upcoming": return "bg-gray-100 text-gray-700";
- default: return "bg-gray-100 text-gray-700";
- }
- };
-
- const handleSendMessage = () => {
- if (newMessage.trim()) {
- // In a real app, this would send the message to the backend
- setNewMessage("");
- }
- };
-
- const handleViewContract = () => {
- setShowContractModal(true);
- };
-
- // Mock contract URL - in a real app, this would come from the collaboration data
- const contractUrl = "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf";
-
- // Message style options for AI enhancement
- const messageStyles = [
- { value: "professional", label: "Professional", description: "Formal and business-like" },
- { value: "casual", label: "Casual", description: "Friendly and relaxed" },
- { value: "polite", label: "Polite", description: "Courteous and respectful" },
- { value: "concise", label: "Concise", description: "Brief and to the point" },
- { value: "enthusiastic", label: "Enthusiastic", description: "Energetic and positive" },
- { value: "constructive", label: "Constructive", description: "Helpful and solution-focused" }
- ];
-
- /**
- * AI Message Style Enhancement Feature(Not implemented yet)
- * i am putting this here for future reference for contributors...
- * This feature allows users to enhance their message content using AI to match different communication styles.
- *
- * Requirements for future development:
- * 1. Integration with LLM API (OpenAI, Anthropic, etc.) to generate styled messages
- * 2. Real-time message transformation as user types or selects style
- * 3. Support for custom style descriptions (user-defined tone/approach)
- * 4. Context awareness - consider collaboration history and relationship
- * 5. Style suggestions based on message content and collaboration stage
- * 6. Option to preview changes before applying
- * 7. Learning from user preferences and successful communication patterns
- * 8. Integration with collaboration analytics to suggest optimal communication timing
- *
- * Technical considerations:
- * - API rate limiting and error handling
- * - Caching of common style transformations
- * - Privacy and data security for message content
- * - Real-time collaboration features (typing indicators, etc.)
- */
- const handleStyleChange = (style: string) => {
- setMessageStyle(style);
- setShowStyleOptions(false);
-
- // TODO: Implement AI message transformation
- // This would call an LLM API to transform the current message
- // Example API call structure:
- // const transformedMessage = await transformMessageStyle(newMessage, style);
- // setNewMessage(transformedMessage);
- };
-
- const handleCustomStyle = () => {
- if (customStyle.trim()) {
- // TODO: Implement custom style transformation
- // This would use the custom style description to guide the AI transformation
- setCustomStyle("");
- setShowStyleOptions(false);
- }
- };
-
- const handleEditUpdate = () => {
- setEditedUpdate(collaboration.latestUpdate);
- setIsEditingUpdate(true);
- };
-
- const handleSaveUpdate = () => {
- // TODO: Implement API call to save the updated latest update
- // This would update the collaboration's latest update in the backend
- // For now, we'll just close the edit mode
- // In a real app, you would update the collaboration object here
- setIsEditingUpdate(false);
- };
-
- const handleCancelEdit = () => {
- setIsEditingUpdate(false);
- setEditedUpdate("");
- };
-
- const handleViewDeliverable = (deliverable: Deliverable) => {
- setSelectedDeliverable(deliverable);
- setShowDeliverableModal(true);
- };
-
- const handleCloseDeliverableModal = () => {
- setShowDeliverableModal(false);
- setSelectedDeliverable(null);
- };
-
- return (
-
- {/* Main Header */}
-
-
-
-
-
Inpact
-
-
- {[
- { to: "/dashboard", icon: LayoutDashboard, label: "Dashboard" },
- { to: "/dashboard/sponsorships", icon: Briefcase, label: "Sponsorships" },
- { to: "/dashboard/collaborations", icon: Users, label: "Collaborations" },
- { to: "/dashboard/contracts", icon: FileText, label: "Contracts" },
- { to: "/dashboard/analytics", icon: BarChart3, label: "Analytics" },
- { to: "/dashboard/messages", icon: MessageSquare, label: "Messages" },
- ].map(({ to, icon: Icon, label }) => (
-
-
-
- {label}
-
-
- ))}
-
-
-
-
-
- {/* Page Header */}
-
-
-
-
-
navigate("/dashboard/collaborations")}
- className="flex items-center gap-2"
- >
-
- Back to Collaborations
-
-
-
{collaboration.collabTitle}
-
Collaboration with {collaboration.collaborator.name}
-
-
-
-
- {collaboration.status}
-
-
-
-
-
-
-
-
-
-
-
- {/* Main Content */}
-
-
-
- Overview
- Messages
- Deliverables
- Timeline
-
- {/* Overview Tab */}
-
-
- {/* AI Project Overview & Recommendations remains inline for now */}
-
-
-
-
- AI Project Overview & Recommendations
-
-
-
-
-
Project Health Analysis
-
-
- This collaboration is progressing well with 65% timeline completion.
- The content creation phase is active and on track.
- Communication frequency is optimal for this stage of the project.
-
-
-
-
-
-
Current Timeline Recommendations
-
-
-
-
- Content Creation Phase: Consider scheduling a review meeting
- within the next 2 days to ensure alignment on video direction and style.
-
-
-
-
-
- Quality Check: Request a preview of the thumbnail design
- to provide early feedback and avoid last-minute revisions.
-
-
-
-
-
- Risk Mitigation: Prepare backup content ideas in case
- the current direction needs adjustment.
-
-
-
-
-
-
-
Communication Tips
-
-
- Pro Tip: Use specific feedback when reviewing content.
- Instead of "make it better," try "increase the energy in the first 30 seconds"
- or "add more close-up shots of the product features."
-
-
-
-
-
-
- {/* Messages Tab */}
-
-
-
- {/* Deliverables Tab */}
-
-
-
-
-
- Deliverables
-
-
-
-
- {mockDeliverables.map((deliverable) => (
-
-
-
-
{deliverable.title}
-
{deliverable.description}
-
-
- {deliverable.status.replace('-', ' ')}
-
-
-
-
-
- Due Date:
- {deliverable.dueDate}
-
-
- Assigned To:
- {deliverable.assignedTo}
-
-
-
- {deliverable.files && deliverable.files.length > 0 && (
-
-
Files:
-
- {deliverable.files.map((file, index) => (
-
-
- {file}
-
- ))}
-
-
- )}
-
-
- handleViewDeliverable(deliverable)}
- >
-
- View
-
-
-
- Edit
-
-
-
- ))}
-
-
-
-
- {/* Timeline Tab */}
-
-
-
-
-
-
- {/* Sidebar */}
-
-
-
-
-
-
-
-
- {/* Deliverable View Modal */}
- {showDeliverableModal && selectedDeliverable && (
-
-
-
-
Deliverable Details
-
-
-
-
-
-
-
- {/* Main Content */}
-
- {/* Deliverable Details */}
-
-
-
- Deliverable Details
-
-
- {selectedDeliverable.title}
-
- {selectedDeliverable.description}
-
-
-
-
-
Status & Progress
-
-
-
- {selectedDeliverable.status.replace('-', ' ')}
-
-
- {selectedDeliverable.status === 'completed' ? '100%' :
- selectedDeliverable.status === 'in-progress' ? '65%' : '0%'} complete
-
-
- {selectedDeliverable.status === 'in-progress' && (
-
- )}
-
-
-
-
Timeline
-
-
- Due Date:
- {selectedDeliverable.dueDate}
-
-
- Assigned To:
- {selectedDeliverable.assignedTo}
-
-
- Created:
- {collaboration.startDate}
-
-
-
-
-
-
-
- {/* Files & Attachments */}
- {selectedDeliverable.files && selectedDeliverable.files.length > 0 && (
-
-
-
-
- Files & Attachments
-
-
-
-
- {selectedDeliverable.files.map((file, index) => (
-
-
-
-
-
-
-
{file}
-
Uploaded 2 days ago
-
-
-
-
-
- Preview
-
-
-
- Download
-
-
-
- ))}
-
-
-
- )}
-
- {/* Comments & Feedback */}
-
-
-
-
- Comments & Feedback
-
-
-
-
-
-
-
-
- {collaboration.collaborator.name.slice(0, 2).toUpperCase()}
-
-
{collaboration.collaborator.name}
-
2 days ago
-
-
- "The first draft is ready for review. I've included the main product features
- and added some B-roll footage. Let me know if you'd like any adjustments to the pacing."
-
-
-
-
-
-
- You
-
-
You
-
1 day ago
-
-
- "Great work! The pacing looks good. Could you add a few more close-up shots
- of the product features around the 1:30 mark?"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {/* Sidebar */}
-
- {/* Quick Actions */}
-
-
- Quick Actions
-
-
-
-
- Edit Deliverable
-
-
-
- Download All Files
-
-
-
- Send Message
-
- {selectedDeliverable.status !== 'completed' && (
-
-
- Mark Complete
-
- )}
-
-
-
- {/* Deliverable Stats */}
-
-
- Deliverable Stats
-
-
-
-
-
- {selectedDeliverable.status === 'completed' ? '100%' :
- selectedDeliverable.status === 'in-progress' ? '65%' : '0%'}
-
-
Progress
-
-
-
- {selectedDeliverable.files?.length || 0}
-
-
Files
-
-
-
-
-
-
-
- Days Remaining:
- 3 days
-
-
- Comments:
- 2
-
-
- Last Updated:
- 1 day ago
-
-
-
-
-
- {/* Version History */}
-
-
- Version History
-
-
-
-
-
-
-
v1.2 - Final Draft
-
Updated 1 day ago
-
-
-
-
-
-
v1.1 - First Review
-
Updated 2 days ago
-
-
-
-
-
-
v1.0 - Initial Draft
-
Created 3 days ago
-
-
-
-
-
-
-
-
-
-
- )}
-
- {/* Contract Modal */}
- {showContractModal && (
-
-
-
-
- Collaboration Contract - {collaboration.collabTitle}
-
- setShowContractModal(false)}
- className="h-8 w-8 p-0"
- >
-
-
-
-
-
-
-
-
- Contract uploaded on {collaboration.startDate}
-
-
-
-
- Download
-
-
-
- Sign Contract
-
-
-
-
-
- )}
-
- );
-}
\ No newline at end of file
diff --git a/Frontend/src/pages/Collaborations.tsx b/Frontend/src/pages/Collaborations.tsx
deleted file mode 100644
index dbbbbc8..0000000
--- a/Frontend/src/pages/Collaborations.tsx
+++ /dev/null
@@ -1,252 +0,0 @@
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../components/ui/card"
-import { ModeToggle } from "../components/mode-toggle"
-import { UserNav } from "../components/user-nav"
-import { Button } from "../components/ui/button"
-import { Input } from "../components/ui/input"
-import { BarChart3, Briefcase, FileText, LayoutDashboard, MessageSquare, Rocket, Search, Users } from "lucide-react"
-import {Link} from "react-router-dom"
-import { Avatar, AvatarFallback, AvatarImage } from "../components/ui/avatar"
-import { Badge } from "../components/ui/badge"
-import { Tabs, TabsContent, TabsList, TabsTrigger } from "../components/ui/tabs"
-import { Label } from "../components/ui/label"
-import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../components/ui/select"
-import CreatorMatchGrid from "../components/collaboration-hub/CreatorMatchGrid";
-import { mockCreatorMatches } from "../components/dashboard/creator-collaborations";
-import ActiveCollabsGrid from "../components/collaboration-hub/ActiveCollabsGrid";
-import React from "react";
-import CollabRequests from "../components/collaboration-hub/CollabRequests";
-import { useCollaborationState } from "../hooks/useCollaborationState";
-import { mockCollabIdeas, mockRequestTexts } from "../components/collaboration-hub/mockProfileData";
-import NewCollaborationModal from "../components/collaboration-hub/NewCollaborationModal";
-import CreatorSearchModal from "../components/collaboration-hub/CreatorSearchModal";
-
-export default function CollaborationsPage({ showHeader = true }: { showHeader?: boolean }) {
- const {
- modals,
- filters,
- openNewCollaborationModal,
- closeNewCollaborationModal,
- openAiSearchModal,
- closeAiSearchModal,
- updateFilter,
- resetFilters,
- hasActiveFilters,
- activeFiltersCount,
- } = useCollaborationState();
-
- const handleNewCollabSubmit = (data: any) => {
- console.log("New collaboration request submitted:", data);
- // Handle the submission logic here
- };
-
- const handleCreatorConnect = (creator: any) => {
- console.log("Connecting with creator:", creator);
- // Handle the connection logic here
- };
- return (
-
- {showHeader && (
-
-
-
-
-
Inpact
-
-
- {[
- { to: "/dashboard", icon: LayoutDashboard, label: "Dashboard" },
- { to: "/dashboard/sponsorships", icon: Briefcase, label: "Sponsorships" },
- { to: "/dashboard/collaborations", icon: Users, label: "Collaborations" },
- { to: "/dashboard/contracts", icon: FileText, label: "Contracts" },
- { to: "/dashboard/analytics", icon: BarChart3, label: "Analytics" },
- { to: "/dashboard/messages", icon: MessageSquare, label: "Messages" },
- ].map(({ to, icon: Icon, label }) => (
-
-
-
- {label}
-
-
- ))}
-
-
-
-
- )}
-
-
- {/* Filter Sidebar */}
-
-
- Filters
- Find your ideal collaborators
-
-
-
- Content Niche
- updateFilter('niche', value)}>
-
-
-
-
- All Niches
- Fashion
- Technology
- Beauty
- Fitness
- Food
- Travel
-
-
-
-
-
- Audience Size
- updateFilter('audienceSize', value)}>
-
-
-
-
- All Sizes
- Micro (10K-50K)
- Mid-tier (50K-500K)
- Macro (500K-1M)
- Mega (1M+)
-
-
-
-
-
- Collaboration Type
- updateFilter('collaborationType', value)}>
-
-
-
-
- All Types
- Guest Appearances
- Joint Content
- Challenges
- Content Series
-
-
-
-
-
- Location
- updateFilter('location', value)}>
-
-
-
-
- Anywhere
- United States
- Europe
- Asia
- Remote Only
-
-
-
-
-
-
- Reset Filters
-
-
- Apply Filters
-
-
- {hasActiveFilters && (
-
- {activeFiltersCount} filter{activeFiltersCount !== 1 ? 's' : ''} active
-
- )}
-
-
- {/* Main Content */}
-
- {/* Tabs for AI Matches, Active Collabs, Requests */}
-
-
- AI Matches
- Active Collabs
- Requests
-
-
- {/* Banner */}
-
-
-
- ⚡
- AI-Powered Creator Matching
-
-
Our AI analyzes your content style, audience demographics, and engagement patterns to find your ideal collaborators.
-
-
Refresh Matches
-
- {/* Creator Match Grid with Pagination */}
-
-
-
- {/* View More Recommendations Button */}
-
- View More Recommendations
-
-
-
-
-
-
-
-
- + New Collaboration Request
-
-
- Find Creators with AI
-
-
-
-
- {/* New Collaboration Modal */}
-
-
- {/* AI Creator Search Modal */}
-
-
-
-
-
-
-
- )
-}
-
diff --git a/Frontend/src/pages/Contracts.tsx b/Frontend/src/pages/Contracts.tsx
deleted file mode 100644
index 792b38a..0000000
--- a/Frontend/src/pages/Contracts.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import React from 'react'
-
-function Contracts() {
- return (
- Contracts
- )
-}
-
-export default Contracts
\ No newline at end of file
diff --git a/Frontend/src/pages/DashboardPage.tsx b/Frontend/src/pages/DashboardPage.tsx
deleted file mode 100644
index e5a8fc2..0000000
--- a/Frontend/src/pages/DashboardPage.tsx
+++ /dev/null
@@ -1,237 +0,0 @@
-import { Link } from "react-router-dom"
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../components/ui/card"
-import { Tabs, TabsContent, TabsList, TabsTrigger } from "../components/ui/tabs"
-import { ModeToggle } from "../components/mode-toggle"
-import { UserNav } from "../components/user-nav"
-import { Button } from "../components/ui/button"
-import { Input } from "../components/ui/input"
-import {
- BarChart3,
- Briefcase,
- DollarSign,
- FileText,
- Icon,
- LayoutDashboard,
- LogOut,
- MessageSquare,
- Rocket,
- Search,
- Users,
-} from "lucide-react"
-import { PerformanceMetrics } from "../components/dashboard/performance-metrics"
-import { RecentActivity } from "../components/dashboard/recent-activity"
-import { SponsorshipMatches } from "../components/dashboard/sponsorship-matches"
-import { useAuth } from "../context/AuthContext"
-import CollaborationsPage from "./Collaborations";
-
-export default function DashboardPage() {
- const {logout, user} = useAuth();
-
- return (
-
-
-
-
-
-
Inpact
-
-
- {[
- { to: "/dashboard", icon: LayoutDashboard, label: "Dashboard" },
- { to: "/dashboard/sponsorships", icon: Briefcase, label: "Sponsorships" },
- { to: "/dashboard/collaborations", icon: Users, label: "Collaborations" },
- { to: "/dashboard/contracts", icon: FileText, label: "Contracts" },
- { to: "/dashboard/analytics", icon: BarChart3, label: "Analytics" },
- { to: "/dashboard/messages", icon: MessageSquare, label: "Messages" },
- ].map(({ to, icon: Icon, label }) => (
-
-
-
- {label}
-
-
- ))}
-
-
-
-
-
-
-
Dashboard
-
-
-
- New Campaign
-
-
-
-
-
-
- Overview
-
-
- Sponsorships
-
-
- Collaborations
-
-
- Analytics
-
-
-
-
-
-
- Total Revenue
-
-
-
- $45,231.89
- +20.1% from last month
-
-
-
-
- Active Sponsorships
-
-
-
- 12
- +3 from last month
-
-
-
-
- Collaborations
-
-
-
- 8
- +2 from last month
-
-
-
-
- Audience Growth
-
-
-
- +12.5%
- +2.1% from last month
-
-
-
-
-
-
- Performance Metrics
-
-
-
-
-
-
-
- Recent Activity
- Your latest interactions and updates
-
-
-
-
-
-
-
-
-
- AI-Matched Sponsorships
- Brands that match your audience and content
-
-
-
-
-
-
-
- Creator Collaborations
- Creators with complementary audiences
-
-
-
-
-
-
-
-
-
-
- AI-Driven Sponsorship Matchmaking
- Discover brands that align with your audience and content style
-
-
-
-
Coming Soon
-
- The full sponsorship matchmaking interface will be available here.
-
-
-
-
-
-
-
-
-
-
-
- Performance Analytics & ROI Tracking
- Track sponsorship performance and campaign success
-
-
-
-
Coming Soon
-
- The full analytics dashboard will be available here.
-
-
-
-
-
-
-
-
- )
- }
\ No newline at end of file
diff --git a/Frontend/src/pages/ForgotPassword.tsx b/Frontend/src/pages/ForgotPassword.tsx
deleted file mode 100644
index f2d1a03..0000000
--- a/Frontend/src/pages/ForgotPassword.tsx
+++ /dev/null
@@ -1,185 +0,0 @@
-import { useState } from "react";
-import { Link } from "react-router-dom";
-import { ArrowLeft, Check, Rocket } from "lucide-react";
-import { supabase } from "../utils/supabase";
-
-export default function ForgotPasswordPage() {
- const [email, setEmail] = useState("");
- const [isLoading, setIsLoading] = useState(false);
- const [isSubmitted, setIsSubmitted] = useState(false);
- const [error, setError] = useState("");
- const [showSignupPrompt, setShowSignupPrompt] = useState(false);
-
- const handleSubmit = async (e: React.FormEvent) => {
- e.preventDefault();
- setIsLoading(true);
- setError("");
- setShowSignupPrompt(false);
-
- try {
- // Check if the email exists in the users table before sending a reset link
- const { data: users, error: userError } = await supabase
- .from("users")
- .select("id")
- .eq("email", email)
- .maybeSingle();
- if (userError) throw userError;
- if (!users) {
- // If the email does not exist, prompt the user to sign up
- setShowSignupPrompt(true);
- setIsLoading(false);
- return;
- }
- // Send the password reset email using Supabase Auth
- const { error } = await supabase.auth.resetPasswordForEmail(email, {
- redirectTo: window.location.origin + "/reset-password"
- });
- if (error) throw error;
- setIsSubmitted(true);
- } catch (err: any) {
-
- setError(err.message || "Something went wrong. Please try again.");
- } finally {
- setIsLoading(false);
- }
- };
-
- return (
-
-
-
-
-
- Inpact
-
-
-
-
-
-
-
-
-
-
- Back to login
-
-
- {isSubmitted ? (
-
-
-
-
-
- Check your email
-
-
- We've sent a password reset link to{" "}
- {email}
-
-
- Didn't receive the email? Check your spam folder or{" "}
- setIsSubmitted(false)}
- className="text-purple-600 hover:text-purple-800 dark:text-purple-400 dark:hover:text-purple-300 transition-colors duration-200"
- >
- try another email address
-
-
-
- ) : (
- <>
-
- Reset your password
-
-
- Enter your email address and we'll send you a link to reset
- your password
-
-
- {error && (
-
- {error}
-
- )}
-
- {showSignupPrompt && (
-
- No account found with this email. Sign up?
-
- )}
-
-
-
-
- Email address
-
- setEmail(e.target.value)}
- required
- className="w-full px-4 py-3 rounded-lg border border-gray-300 dark:border-gray-600 focus:outline-none focus:ring-2 focus:ring-purple-500 dark:focus:ring-purple-400 focus:border-transparent bg-white dark:bg-gray-700 text-gray-900 dark:text-white transition-all duration-200"
- // Email is case sensitive for password reset
- placeholder="you@example.com (CASE sensitive)"
- />
-
-
-
- {isLoading ? (
-
-
-
-
-
- Sending reset link...
-
- ) : (
- "Send reset link"
- )}
-
-
- >
- )}
-
-
-
-
-
-
- © 2024 Inpact. All rights reserved.
-
-
- );
-}
diff --git a/Frontend/src/pages/HomePage.tsx b/Frontend/src/pages/HomePage.tsx
deleted file mode 100644
index 011641d..0000000
--- a/Frontend/src/pages/HomePage.tsx
+++ /dev/null
@@ -1,937 +0,0 @@
-import { useEffect, useRef, useState } from "react";
-import { Link } from "react-router-dom";
-import {
- ArrowRight,
- BarChart3,
- Handshake,
- Layers,
- MessageSquare,
- Rocket,
- Users,
- Plus,
- TrendingUp,
- Calendar,
- Star,
- Target,
- Zap,
- BookOpen,
- Award,
- TrendingDown,
- Eye,
- Heart,
- Share2,
- Play,
- UserPlus,
- Sparkles,
-} from "lucide-react";
-import { Button } from "../components/ui/button";
-import { MainNav } from "../components/main-nav";
-import { ModeToggle } from "../components/mode-toggle";
-import { UserNav } from "../components/user-nav";
-import { useAuth } from "../context/AuthContext";
-import { supabase } from "../utils/supabase";
-
-const features = [
- {
- icon: Handshake,
- title: "AI-Driven Matchmaking",
- desc: "Connect with brands based on audience demographics, engagement rates, and content style.",
- gradient: "from-blue-500 to-purple-600",
- },
- {
- icon: Users,
- title: "Creator Collaboration Hub",
- desc: "Find and partner with creators who have complementary audiences and content niches.",
- gradient: "from-green-500 to-blue-600",
- },
- {
- icon: Layers,
- title: "Smart Pricing Optimization",
- desc: "Get fair sponsorship pricing recommendations based on engagement and market trends.",
- gradient: "from-purple-500 to-pink-600",
- },
- {
- icon: MessageSquare,
- title: "AI Contract Assistant",
- desc: "Structure deals, generate contracts, and optimize terms using AI insights.",
- gradient: "from-orange-500 to-red-600",
- },
- {
- icon: BarChart3,
- title: "Performance Analytics",
- desc: "Track sponsorship performance, audience engagement, and campaign success.",
- gradient: "from-indigo-500 to-purple-600",
- },
- {
- icon: Rocket,
- title: "ROI Tracking",
- desc: "Measure and optimize return on investment for both creators and brands.",
- gradient: "from-teal-500 to-green-600",
- },
-];
-
-const dashboardFeatures = [
- {
- icon: TrendingUp,
- title: "Analytics Dashboard",
- desc: "Track your performance metrics, engagement rates, and growth trends.",
- },
- {
- icon: Handshake,
- title: "Active Collaborations",
- desc: "Manage your ongoing partnerships and track collaboration progress.",
- },
- {
- icon: Calendar,
- title: "Campaign Calendar",
- desc: "Schedule and organize your content campaigns and brand partnerships.",
- },
- {
- icon: MessageSquare,
- title: "Communication Hub",
- desc: "Connect with brands and creators through our integrated messaging system.",
- },
- {
- icon: BarChart3,
- title: "Performance Insights",
- desc: "Get detailed analytics and insights to optimize your content strategy.",
- },
- {
- icon: Plus,
- title: "Create New Campaign",
- desc: "Start new collaborations and campaigns with our AI-powered matching system.",
- },
-];
-
-const successStories = [
- {
- creator: "Sarah Chen",
- niche: "Tech & Lifestyle",
- followers: "2.1M",
- brand: "TechFlow",
- result: "500% ROI increase",
- story: "Sarah's authentic tech reviews helped TechFlow launch their new smartphone with record-breaking pre-orders.",
- avatar: "/avatars/sarah.jpg",
- platform: "YouTube",
- },
- {
- creator: "Marcus Rodriguez",
- niche: "Fitness & Wellness",
- followers: "850K",
- brand: "FitFuel",
- result: "300% engagement boost",
- story: "Marcus's workout challenges with FitFuel products generated over 10M views and 50K+ app downloads.",
- avatar: "/avatars/marcus.jpg",
- platform: "Instagram",
- },
- {
- creator: "Emma Thompson",
- niche: "Sustainable Fashion",
- followers: "1.2M",
- brand: "EcoStyle",
- result: "200% sales increase",
- story: "Emma's sustainable fashion content helped EcoStyle become the top eco-friendly brand in their category.",
- avatar: "/avatars/emma.jpg",
- platform: "TikTok",
- },
-];
-
-const trendingNiches = [
- {
- name: "AI & Tech",
- growth: "+45%",
- creators: "12.5K",
- avgEngagement: "8.2%",
- icon: Zap,
- color: "from-blue-500 to-purple-600",
- },
- {
- name: "Sustainable Living",
- growth: "+38%",
- creators: "8.9K",
- avgEngagement: "9.1%",
- icon: Target,
- color: "from-green-500 to-teal-600",
- },
- {
- name: "Mental Health",
- growth: "+52%",
- creators: "15.2K",
- avgEngagement: "7.8%",
- icon: Heart,
- color: "from-pink-500 to-rose-600",
- },
- {
- name: "Gaming & Esports",
- growth: "+41%",
- creators: "22.1K",
- avgEngagement: "6.9%",
- icon: Play,
- color: "from-purple-500 to-indigo-600",
- },
- {
- name: "Personal Finance",
- growth: "+33%",
- creators: "6.8K",
- avgEngagement: "8.5%",
- icon: TrendingUp,
- color: "from-emerald-500 to-green-600",
- },
- {
- name: "Remote Work",
- growth: "+29%",
- creators: "9.3K",
- avgEngagement: "7.2%",
- icon: Users,
- color: "from-orange-500 to-red-600",
- },
-];
-
-const creatorResources = [
- {
- title: "Creator Economy Report 2024",
- desc: "Latest trends, platform changes, and monetization strategies",
- readTime: "8 min read",
- category: "Research",
- icon: BookOpen,
- },
- {
- title: "How to Negotiate Brand Deals",
- desc: "Master the art of pricing and contract negotiation",
- readTime: "12 min read",
- category: "Guide",
- icon: Handshake,
- },
- {
- title: "Content Calendar Templates",
- desc: "Free templates to organize your content strategy",
- readTime: "5 min read",
- category: "Template",
- icon: Calendar,
- },
- {
- title: "Platform Algorithm Updates",
- desc: "Stay ahead with latest social media changes",
- readTime: "6 min read",
- category: "News",
- icon: TrendingUp,
- },
-];
-
-const brandShowcase = [
- {
- name: "TechFlow",
- industry: "Technology",
- logo: "/brands/techflow.png",
- description: "Leading smartphone manufacturer seeking tech reviewers and lifestyle creators",
- followers: "2.5M",
- budget: "$5K - $50K",
- lookingFor: ["Tech Reviewers", "Lifestyle Creators", "Gaming Streamers"],
- activeCampaigns: 3,
- },
- {
- name: "FitFuel",
- industry: "Health & Fitness",
- logo: "/brands/fitfuel.png",
- description: "Premium fitness supplement brand looking for authentic fitness influencers",
- followers: "1.8M",
- budget: "$3K - $25K",
- lookingFor: ["Fitness Trainers", "Nutrition Experts", "Wellness Coaches"],
- activeCampaigns: 5,
- },
- {
- name: "EcoStyle",
- industry: "Sustainable Fashion",
- logo: "/brands/ecostyle.png",
- description: "Eco-friendly fashion brand seeking sustainable lifestyle advocates",
- followers: "950K",
- budget: "$2K - $20K",
- lookingFor: ["Fashion Influencers", "Sustainability Advocates", "Lifestyle Creators"],
- activeCampaigns: 2,
- },
- {
- name: "GameZone",
- industry: "Gaming",
- logo: "/brands/gamezone.png",
- description: "Gaming accessories company looking for esports and gaming content creators",
- followers: "3.2M",
- budget: "$4K - $40K",
- lookingFor: ["Gaming Streamers", "Esports Players", "Tech Reviewers"],
- activeCampaigns: 4,
- },
-];
-
-// TrendingNichesSection: Fetches and displays trending niches from the backend
-function TrendingNichesSection() {
- // State for trending niches, loading, and error
- const [niches, setNiches] = useState<{ name: string; insight: string; global_activity: number }[]>([]);
- const [loading, setLoading] = useState(true);
- const [error, setError] = useState(null);
-
- // Fetch trending niches from the backend API on mount
- useEffect(() => {
- fetch("/api/trending-niches")
- .then(res => {
- if (!res.ok) throw new Error("Failed to fetch trending niches");
- return res.json();
- })
- .then(data => {
- setNiches(data);
- setLoading(false);
- })
- .catch(err => {
- setError(err.message);
- setLoading(false);
- });
- }, []);
-
- if (loading) return Loading trending niches...
;
- if (error) return Error: {error}
;
-
- // Emoji icons for visual variety in cards
- const icons = ['🤖','🌱','🎮','💸','✈️','🧩'];
-
- // Modern glassmorphism card design for each trending niche
- return (
-
- {niches.map((niche, idx) => (
-
- {/* Gradient overlay for extra glass effect */}
-
- {/* Floating Emoji icon above the card */}
-
- {icons[idx % icons.length]}
-
- {/* Niche name */}
-
{niche.name}
- {/* Niche insight as a quote */}
-
- “{niche.insight}”
-
- {/* Global activity as a progress bar */}
-
-
Global Activity
-
-
-
= 4
- ? 'bg-gradient-to-r from-purple-500 to-blue-500'
- : 'bg-gradient-to-r from-yellow-400 to-orange-500'
- }`}
- style={{ width: `${(niche.global_activity / 5) * 100}%` }}
- />
-
-
{niche.global_activity}/5
-
-
-
- ))}
-
- );
-}
-
-function WhyChooseSection() {
- return (
-
-
-
Why Choose Inpact AI?
-
- Powerful tools for both brands and creators to connect, collaborate, and grow.
-
-
- {/* Brands Column */}
-
-
-
- For Brands
-
-
- AI-driven creator matching for your campaigns
- Real-time performance analytics & ROI tracking
- Smart pricing & budget optimization
- Streamlined communication & contract management
-
-
- {/* Creators Column */}
-
-
-
- For Creators
-
-
- Get discovered by top brands in your niche
- Fair sponsorship deals & transparent payments
- AI-powered content & contract assistant
- Grow your audience & track your impact
-
-
-
-
-
- );
-}
-
-export default function HomePage() {
- const { isAuthenticated, user } = useAuth();
-
- // Refs for scroll detection
- const featuresRef = useRef(null);
- const successStoriesRef = useRef(null);
- const trendingRef = useRef(null);
- const resourcesRef = useRef(null);
- const footerRef = useRef(null);
-
- // State to track visibility (for one-time animation)
- const [isFeaturesVisible, setIsFeaturesVisible] = useState(false);
- const [isSuccessStoriesVisible, setIsSuccessStoriesVisible] = useState(false);
- const [isTrendingVisible, setIsTrendingVisible] = useState(false);
- const [isResourcesVisible, setIsResourcesVisible] = useState(false);
- const [isFooterVisible, setIsFooterVisible] = useState(false);
-
- // One-time animation state
- const [hasAnimatedTrending, setHasAnimatedTrending] = useState(false);
- const [hasAnimatedBrands, setHasAnimatedBrands] = useState(false);
-
- // Set up intersection observer for scroll detection (one-time animation)
- useEffect(() => {
- const trendingObserver = new IntersectionObserver(
- (entries) => {
- const [entry] = entries;
- if (entry.isIntersecting && !hasAnimatedTrending) {
- setIsTrendingVisible(true);
- setHasAnimatedTrending(true);
- }
- },
- { root: null, rootMargin: "0px", threshold: 0.1 }
- );
- const brandsObserver = new IntersectionObserver(
- (entries) => {
- const [entry] = entries;
- if (entry.isIntersecting && !hasAnimatedBrands) {
- setIsSuccessStoriesVisible(true);
- setHasAnimatedBrands(true);
- }
- },
- { root: null, rootMargin: "0px", threshold: 0.1 }
- );
- if (trendingRef.current) trendingObserver.observe(trendingRef.current);
- if (successStoriesRef.current) brandsObserver.observe(successStoriesRef.current);
- return () => {
- if (trendingRef.current) trendingObserver.unobserve(trendingRef.current);
- if (successStoriesRef.current) brandsObserver.unobserve(successStoriesRef.current);
- };
- }, [hasAnimatedTrending, hasAnimatedBrands]);
-
- // ... keep other observers for footer, etc. if needed ...
- useEffect(() => {
- const footerObserver = new IntersectionObserver(
- (entries) => {
- const [entry] = entries;
- setIsFooterVisible(entry.isIntersecting);
- },
- { root: null, rootMargin: "0px", threshold: 0.1 }
- );
- if (footerRef.current) footerObserver.observe(footerRef.current);
- return () => {
- if (footerRef.current) footerObserver.unobserve(footerRef.current);
- };
- }, []);
-
- // Logged-in user homepage
- if (isAuthenticated && user) {
- return (
-
- {/* Header with glassmorphism */}
-
-
- {/* Hero Section - Image Left, Text Right, Text More Centered */}
-
-
- {/* Background elements */}
-
-
-
-
-
-
-
- {/* Left Image */}
-
-
- {/* 3D Glow Effect */}
-
-
- {/* Main Image */}
-
-
-
- {/* Floating Elements */}
-
-
-
-
-
-
-
-
-
-
-
- {/* Right Content */}
-
-
-
- {/* Main Welcome Heading */}
-
- Welcome, {user.user_metadata?.name || user.email?.split('@')[0]}
-
-
- Ready to grow your creator business? Explore new opportunities, track your performance, and connect with brands.
-
-
- {/* Action Buttons */}
-
-
-
- Go to Dashboard
-
-
-
-
- Browse Opportunities
-
-
-
- {/* How It Works Row */}
-
-
-
- Create your profile
-
-
-
- Get matched by AI
-
-
-
- Collaborate & grow
-
-
-
-
-
-
-
- {/* Why Choose Inpact AI Section (for logged out users) */}
-
-
- {/* Trending Niches Section - Centered Grid, No Extra Right Space */}
-
-
-
-
- Trending Niches
-
-
- Discover the fastest-growing content categories and opportunities.
-
-
-
-
-
- {/* Brand Showcase Section - Centered Grid, No Extra Right Space */}
-
-
-
-
- Brands Seeking Creators
-
-
- Connect with companies actively looking for creators like you.
-
-
- {brandShowcase.map((brand, idx) => (
-
-
-
-
-
- {brand.name.split('').slice(0, 2).join('')}
-
-
-
-
-
-
{brand.name}
-
{brand.industry}
-
{brand.description}
-
-
-
-
-
Followers
-
{brand.followers}
-
-
-
Budget Range
-
{brand.budget}
-
-
-
Active Campaigns
-
{brand.activeCampaigns}
-
-
-
Looking For
-
{brand.lookingFor.length} types
-
-
-
- {brand.lookingFor.map((type, typeIdx) => (
-
- {type}
-
- ))}
-
-
-
- View Opportunities
-
-
-
- ))}
-
-
-
-
- {/* Footer */}
-
-
-
- );
- }
-
- // Non-logged-in user homepage (redesigned)
- return (
-
- {/* Header with glassmorphism */}
-
-
-
-
-
-
-
- Login
-
-
- Sign Up
-
-
-
-
-
-
-
- {/* Hero Section - Completely Redesigned */}
-
-
- {/* Background elements */}
-
-
-
-
-
-
-
- {/* Left Content */}
-
-
-
-
AI-Powered Platform
-
-
-
- {/* 3D Text Effect for "Inpact AI" */}
-
-
- INPACT AI
-
-
- Creator Collaboration Platform
-
-
-
-
- Connect with brands, collaborate with creators, and optimize your partnerships through data-driven insights.
-
-
-
-
-
-
- Get Started
-
-
-
- Learn More
-
-
- {/* How It Works Row */}
-
-
-
- Create your profile
-
-
-
- Get matched by AI
-
-
-
- Collaborate & grow
-
-
-
-
- {/* Right Image */}
-
-
- {/* 3D Glow Effect */}
-
-
-
- {/* Main Image */}
-
-
-
-
- {/* Floating Elements */}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {/* Why Choose Inpact AI Section (for logged out users) */}
-
-
- {/* Success Stories Section */}
-
-
-
-
- Success Stories
-
-
- Real creators achieving amazing results with brand partnerships.
-
-
- {successStories.map((story, idx) => (
-
-
-
-
-
- {story.creator.split(' ').map(n => n[0]).join('')}
-
-
-
-
-
-
{story.creator}
-
{story.niche}
-
-
-
-
{story.story}
-
-
-
- {story.followers}
-
-
-
- {story.platform}
-
-
-
-
-
- Result: {story.result}
-
-
-
- ))}
-
-
-
-
- {/* Trending Niches Section */}
-
-
-
-
- Trending Niches
-
-
- Discover the fastest-growing content categories and opportunities.
-
-
-
-
-
- {/* Footer */}
-
-
-
- );
-}
\ No newline at end of file
diff --git a/Frontend/src/pages/Login.tsx b/Frontend/src/pages/Login.tsx
deleted file mode 100644
index 875567a..0000000
--- a/Frontend/src/pages/Login.tsx
+++ /dev/null
@@ -1,244 +0,0 @@
-import { useState } from "react";
-import { Link, useNavigate } from "react-router-dom";
-import { Eye, EyeOff, Rocket } from "lucide-react";
-import { supabase } from "../utils/supabase";
-import { useAuth } from "../context/AuthContext";
-
-export default function LoginPage() {
- const Navigate = useNavigate();
- const { login } = useAuth();
- const [email, setEmail] = useState("");
- const [password, setPassword] = useState("");
- const [showPassword, setShowPassword] = useState(false);
- const [isLoading, setIsLoading] = useState(false);
- const [error, setError] = useState("");
-
- const handleSubmit = async (e: React.FormEvent
) => {
- e.preventDefault();
- setIsLoading(true);
- setError("");
-
- try {
- const { data, error } = await supabase.auth.signInWithPassword({
- email,
- password,
- });
-
- if (error) {
- setError(error.message);
- setIsLoading(false);
- return;
- }
-
- // AuthContext will handle navigation based on user onboarding status and role
- setIsLoading(false);
- } catch (err) {
- setError("Invalid email or password. Please try again.");
- } finally {
- setIsLoading(false);
- }
- };
-
- const handleGoogleLogin = async () => {
- const { data, error } = await supabase.auth.signInWithOAuth({
- provider: "google",
- });
-
- if (error) {
- console.log("Google login error", error);
- return;
- }
-
- // AuthContext will handle navigation based on user onboarding status and role
- };
-
- return (
-
-
-
-
-
- Inpact
-
-
-
-
- Don't have an account?
-
-
- Sign up
-
-
-
-
-
-
-
-
-
- Welcome back
-
-
- Sign in to your account to continue
-
-
- {error && (
-
- {error}
-
- )}
-
-
-
-
- Email
-
- setEmail(e.target.value)}
- required
- className="w-full px-4 py-3 rounded-lg border border-gray-300 dark:border-gray-600 focus:outline-none focus:ring-2 focus:ring-purple-500 dark:focus:ring-purple-400 focus:border-transparent bg-white dark:bg-gray-700 text-gray-900 dark:text-white transition-all duration-200"
- placeholder="you@example.com"
- />
-
-
-
-
-
- Password
-
-
- Forgot password?
-
-
-
- setPassword(e.target.value)}
- required
- className="w-full px-4 py-3 rounded-lg border border-gray-300 dark:border-gray-600 focus:outline-none focus:ring-2 focus:ring-purple-500 dark:focus:ring-purple-400 focus:border-transparent bg-white dark:bg-gray-700 text-gray-900 dark:text-white transition-all duration-200"
- placeholder="••••••••"
- />
- setShowPassword(!showPassword)}
- className="absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 transition-colors duration-200"
- >
- {showPassword ? (
-
- ) : (
-
- )}
-
-
-
-
-
- {isLoading ? (
-
-
-
-
-
- Signing in...
-
- ) : (
- "Sign in"
- )}
-
-
-
-
-
-
-
-
- Or continue with
-
-
-
-
-
-
handleGoogleLogin()}
- className="w-full inline-flex justify-center py-3 px-4 border border-gray-300 dark:border-gray-600 rounded-lg shadow-sm bg-white dark:bg-gray-700 text-sm font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-600 transition-colors duration-200"
- >
-
-
-
- Google
-
-
-
-
-
- Facebook
-
-
-
-
-
-
-
-
-
- © 2024 Inpact. All rights reserved.
-
-
- );
-}
diff --git a/Frontend/src/pages/Messages.tsx b/Frontend/src/pages/Messages.tsx
deleted file mode 100644
index 332b854..0000000
--- a/Frontend/src/pages/Messages.tsx
+++ /dev/null
@@ -1,402 +0,0 @@
-import { useState } from "react";
-import { Button } from "../components/ui/button";
-import { Input } from "../components/ui/input";
-import {
- BarChart3,
- Briefcase,
- FileText,
- LayoutDashboard,
- MessageSquare,
- Rocket,
- Search,
- Send,
- Users,
-} from "lucide-react";
-import { Link } from "react-router-dom";
-import { Avatar, AvatarFallback, AvatarImage } from "../components/ui/avatar";
-import { Badge } from "../components/ui/badge";
-import { ModeToggle } from "../components/mode-toggle";
-import { UserNav } from "../components/user-nav";
-import { ScrollArea } from "../components/ui/scroll-area";
-import { Separator } from "../components/ui/separator";
-import { Tabs, TabsList, TabsTrigger } from "../components/ui/tabs";
-import Chat from "@/components/chat/chat";
-
-const contacts = [
- {
- id: "1",
- name: "EcoStyle",
- avatar: "/placeholder.svg?height=40&width=40",
- initials: "ES",
- lastMessage:
- "Let's discuss the contract details for our upcoming campaign.",
- time: "10:30 AM",
- unread: true,
- type: "brand",
- },
- {
- id: "2",
- name: "Sarah Johnson",
- avatar: "/placeholder.svg?height=40&width=40",
- initials: "SJ",
- lastMessage: "I'm excited about our travel vlog collaboration!",
- time: "Yesterday",
- unread: true,
- type: "creator",
- },
- {
- id: "3",
- name: "TechGadgets",
- avatar: "/placeholder.svg?height=40&width=40",
- initials: "TG",
- lastMessage:
- "We've shipped the products for your review. You should receive them by tomorrow.",
- time: "Yesterday",
- unread: false,
- type: "brand",
- },
- {
- id: "4",
- name: "Mike Chen",
- avatar: "/placeholder.svg?height=40&width=40",
- initials: "MC",
- lastMessage: "I've shared the draft script for our tech comparison video.",
- time: "2 days ago",
- unread: false,
- type: "creator",
- },
- {
- id: "5",
- name: "FitLife Supplements",
- avatar: "/placeholder.svg?height=40&width=40",
- initials: "FL",
- lastMessage: "Would you be interested in a 3-month partnership?",
- time: "3 days ago",
- unread: false,
- type: "brand",
- },
- {
- id: "6",
- name: "Leila Ahmed",
- avatar: "/placeholder.svg?height=40&width=40",
- initials: "LA",
- lastMessage: "Let's schedule our fashion lookbook shoot for next week.",
- time: "1 week ago",
- unread: false,
- type: "creator",
- },
-];
-
-const messages = [
- {
- id: "1",
- sender: "user",
- content: "Hi EcoStyle team! I'm excited about our potential partnership.",
- time: "10:15 AM",
- },
- {
- id: "2",
- sender: "contact",
- content:
- "Hello! We're thrilled to work with you too. We love your content and think you'd be a perfect fit for our sustainable fashion line.",
- time: "10:18 AM",
- },
- {
- id: "3",
- sender: "user",
- content:
- "That's great to hear! I've been a fan of your brand for a while and appreciate your commitment to sustainability.",
- time: "10:20 AM",
- },
- {
- id: "4",
- sender: "contact",
- content:
- "Thank you! We've been following your content and your audience aligns perfectly with our target demographic. We'd like to discuss a potential sponsorship for our new summer collection.",
- time: "10:22 AM",
- },
- {
- id: "5",
- sender: "user",
- content:
- "I'd be very interested in that. What kind of deliverables are you looking for?",
- time: "10:25 AM",
- },
- {
- id: "6",
- sender: "contact",
- content:
- "We're thinking about 1 dedicated post and 2 stories highlighting our sustainable materials and production process. We'd also love if you could share your authentic experience with our products.",
- time: "10:28 AM",
- },
- {
- id: "7",
- sender: "contact",
- content:
- "Let's discuss the contract details for our upcoming campaign. We can use Inpact's AI contract generator to streamline the process.",
- time: "10:30 AM",
- },
-];
-
-export default function MessagesPage() {
- const [activeContact, setActiveContact] = useState(contacts[0]);
- const [messageInput, setMessageInput] = useState("");
- const [activeMessages, setActiveMessages] = useState(messages);
- const [activeTab, setActiveTab] = useState("all");
-
- const handleSendMessage = () => {
- if (messageInput.trim() === "") return;
-
- const newMessage = {
- id: String(activeMessages.length + 1),
- sender: "user",
- content: messageInput,
- time: new Date().toLocaleTimeString([], {
- hour: "2-digit",
- minute: "2-digit",
- }),
- };
-
- setActiveMessages([...activeMessages, newMessage]);
- setMessageInput("");
- };
-
- const filteredContacts =
- activeTab === "all"
- ? contacts
- : contacts.filter((contact) => contact.type === activeTab);
-
- return (
-
-
-
-
-
-
- Inpact
-
-
-
- {[
- { to: "/dashboard", icon: LayoutDashboard, label: "Dashboard" },
- {
- to: "/dashboard/sponsorships",
- icon: Briefcase,
- label: "Sponsorships",
- },
- {
- to: "/dashboard/collaborations",
- icon: Users,
- label: "Collaborations",
- },
- {
- to: "/dashboard/contracts",
- icon: FileText,
- label: "Contracts",
- },
- {
- to: "/dashboard/analytics",
- icon: BarChart3,
- label: "Analytics",
- },
- {
- to: "/dashboard/messages",
- icon: MessageSquare,
- label: "Messages",
- },
- ].map(({ to, icon: Icon, label }) => (
-
-
-
- {label}
-
-
- ))}
-
-
-
-
- {/* Old Code */}
-
- {/* Sidebar */}
-
- {/* Search Input */}
-
-
- {/* Tabs Section */}
-
-
-
-
- All
-
-
- Brands
-
-
- Creators
-
-
-
-
- {/* Contacts List */}
-
-
- {filteredContacts.map((contact) => (
-
-
setActiveContact(contact)}
- >
-
-
-
- {contact.initials}
-
-
-
-
- {contact.name}
-
-
- {contact.time}
-
-
-
- {contact.lastMessage}
-
-
- {contact.unread && (
-
- )}
-
-
-
-
- ))}
-
-
-
-
-
- {/* Chat Section */}
-
- {/* Chat Header */}
-
-
-
-
- {activeContact.initials}
-
-
-
{activeContact.name}
-
- {activeContact.type === "brand" ? "Brand Partner" : "Creator"}
-
-
-
-
-
- View Profile
-
-
- Create Contract
-
-
-
-
- {/* Messages Area */}
-
-
- {activeMessages.map((message) => (
-
-
-
{message.content}
-
{message.time}
-
-
- ))}
-
-
-
- {/* Message Input */}
-
-
- setMessageInput(e.target.value)}
- onKeyDown={(e) => {
- if (e.key === "Enter") {
- handleSendMessage();
- }
- }}
- className="w-full p-2 border rounded-md bg-gray-100 dark:bg-gray-700 focus:ring focus:ring-purple-300"
- />
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/Frontend/src/pages/ResetPassword.tsx b/Frontend/src/pages/ResetPassword.tsx
deleted file mode 100644
index 2beff71..0000000
--- a/Frontend/src/pages/ResetPassword.tsx
+++ /dev/null
@@ -1,357 +0,0 @@
-import { useState, useEffect, useRef } from "react";
-import { Link } from "react-router-dom";
-import { useNavigate, useParams } from "react-router-dom";
-import { Check, Eye, EyeOff, Rocket } from "lucide-react";
-import { supabase } from "../utils/supabase";
-
-export default function ResetPasswordPage() {
- const router = useNavigate();
- const searchParams = useParams();
-
- const [password, setPassword] = useState("");
- const [confirmPassword, setConfirmPassword] = useState("");
- const [showPassword, setShowPassword] = useState(false);
- const [isLoading, setIsLoading] = useState(false);
- const [error, setError] = useState("");
- const [isSuccess, setIsSuccess] = useState(false);
- const [progress, setProgress] = useState(0);
- const progressRef = useRef(null);
-
- useEffect(() => {
- // Supabase will automatically handle the session if the user comes from the reset link
- // No need to manually extract token
- }, []);
-
- useEffect(() => {
- if (isSuccess) {
- setProgress(0);
- progressRef.current = setInterval(() => {
- setProgress((prev) => {
- if (prev >= 100) {
- if (progressRef.current) clearInterval(progressRef.current);
- router("/dashboard");
- return 100;
- }
- return prev + (100 / 30); // 3 seconds, 100ms interval
- });
- }, 100);
- }
- return () => {
- if (progressRef.current) clearInterval(progressRef.current);
- };
- }, [isSuccess, router]);
-
- const handleSubmit = async (e: React.FormEvent) => {
- e.preventDefault();
-
- if (password !== confirmPassword) {
- setError("Passwords don't match");
- return;
- }
-
- setIsLoading(true);
- setError("");
-
- try {
- // Update the user's password using Supabase Auth
- // Supabase automatically authenticates the user from the reset link
- const { error } = await supabase.auth.updateUser({ password });
- if (error) throw error;
- setIsSuccess(true);
- // After success,redirect to dashboard
- } catch (err: any) {
-
- setError(err.message || "Something went wrong. Please try again.");
- } finally {
- setIsLoading(false);
- }
- };
-
- const passwordStrength = () => {
- if (!password)
- return { strength: 0, text: "", color: "bg-gray-200 dark:bg-gray-700" };
-
- let strength = 0;
- if (password.length >= 8) strength += 1;
- if (/[A-Z]/.test(password)) strength += 1;
- if (/[0-9]/.test(password)) strength += 1;
- if (/[^A-Za-z0-9]/.test(password)) strength += 1;
-
- const strengthMap = [
- { text: "Weak", color: "bg-red-500" },
- { text: "Fair", color: "bg-orange-500" },
- { text: "Good", color: "bg-yellow-500" },
- { text: "Strong", color: "bg-green-500" },
- ];
-
- return {
- strength,
- text: strengthMap[strength - 1]?.text || "",
- color: strengthMap[strength - 1]?.color || "bg-gray-200 dark:bg-gray-700",
- };
- };
-
- const { strength, text, color } = passwordStrength();
-
- if (isSuccess) {
- return (
-
-
-
-
-
- Inpact
-
-
-
-
-
-
-
- Password Changed Successfully
-
-
- Redirecting you to your application...
-
-
-
-
-
-
- © 2024 Inpact. All rights reserved.
-
-
- );
- }
-
- return (
-
-
-
-
-
- Inpact
-
-
-
-
-
-
-
-
- {error && (
-
- {error}
-
- )}
-
-
-
-
- New Password
-
-
- setPassword(e.target.value)}
- required
- className="w-full px-4 py-3 rounded-lg border border-gray-300 dark:border-gray-600 focus:outline-none focus:ring-2 focus:ring-purple-500 dark:focus:ring-purple-400 focus:border-transparent bg-white dark:bg-gray-700 text-gray-900 dark:text-white transition-all duration-200"
- placeholder="••••••••"
- />
- setShowPassword(!showPassword)}
- className="absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 transition-colors duration-200"
- >
- {showPassword ? (
-
- ) : (
-
- )}
-
-
-
- {password && (
-
-
-
- Password strength: {text}
-
-
- {strength}/4
-
-
-
-
-
- = 8
- ? "text-green-500"
- : "text-gray-400"
- }`}
- >
- {password.length >= 8 ? (
-
- ) : (
- "○"
- )}
-
- At least 8 characters
-
-
-
- {/[A-Z]/.test(password) ? (
-
- ) : (
- "○"
- )}
-
- At least 1 uppercase letter
-
-
-
- {/[0-9]/.test(password) ? (
-
- ) : (
- "○"
- )}
-
- At least 1 number
-
-
-
- {/[^A-Za-z0-9]/.test(password) ? (
-
- ) : (
- "○"
- )}
-
- At least 1 special character
-
-
-
- )}
-
-
-
-
- Confirm Password
-
-
- setConfirmPassword(e.target.value)}
- required
- className={`w-full px-4 py-3 rounded-lg border focus:outline-none focus:ring-2 focus:ring-purple-500 dark:focus:ring-purple-400 focus:border-transparent bg-white dark:bg-gray-700 text-gray-900 dark:text-white transition-all duration-200 ${
- confirmPassword && password !== confirmPassword
- ? "border-red-500 dark:border-red-500"
- : "border-gray-300 dark:border-gray-600"
- }`}
- placeholder="••••••••"
- />
-
- {confirmPassword && password !== confirmPassword && (
-
- Passwords don't match
-
- )}
-
-
-
- {isLoading ? (
-
-
-
-
-
- Resetting password...
-
- ) : (
- "Reset Password"
- )}
-
-
-
-
-
-
-
-
- © 2024 Inpact. All rights reserved.
-
-
- );
-}
diff --git a/Frontend/src/pages/RoleSelection.tsx b/Frontend/src/pages/RoleSelection.tsx
deleted file mode 100644
index 9905a64..0000000
--- a/Frontend/src/pages/RoleSelection.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import { useState } from "react";
-import { useNavigate } from "react-router-dom";
-
-export default function RoleSelection() {
- const [selectedRole, setSelectedRole] = useState("");
- const [error, setError] = useState("");
- const navigate = useNavigate();
-
- const handleSelect = (role: string) => {
- setSelectedRole(role);
- setError("");
- };
-
- const handleContinue = () => {
- if (!selectedRole) {
- setError("Please select a role to continue.");
- return;
- }
- if (selectedRole === "brand") {
- navigate("/onboarding/brand");
- } else if (selectedRole === "creator") {
- navigate("/onboarding/creator");
- }
- };
-
- return (
-
-
-
Choose your role
-
Select whether you want to sign up as a Brand or a Creator. You cannot change this later.
- {error && (
-
- {error}
-
- )}
-
- handleSelect("creator")}
- >
- Creator
-
- handleSelect("brand")}
- >
- Brand
-
-
-
- Continue
-
-
-
- );
-}
\ No newline at end of file
diff --git a/Frontend/src/pages/Signup.tsx b/Frontend/src/pages/Signup.tsx
deleted file mode 100644
index 0055239..0000000
--- a/Frontend/src/pages/Signup.tsx
+++ /dev/null
@@ -1,234 +0,0 @@
-
-import { useState } from "react";
-import { Link, useNavigate } from "react-router-dom";
-import { Check, Eye, EyeOff, Rocket } from "lucide-react";
-import { supabase } from "../utils/supabase";
-import { useAuth } from "@/context/AuthContext";
-import { demoInsert } from '../utils/demoInsert';
-
-export default function SignupPage() {
- const navigate = useNavigate();
- const [formData, setFormData] = useState({
- name: "",
- email: "",
- password: "",
- confirmPassword: ""
- });
- const [showPassword, setShowPassword] = useState(false);
- const [isLoading, setIsLoading] = useState(false);
- const [error, setError] = useState("");
- const [step, setStep] = useState(1);
- const [user, setuser] = useState("influencer");
- const { login } = useAuth();
-
- const handleChange = (e: React.ChangeEvent) => {
- const { name, value } = e.target;
- setFormData((prev) => ({ ...prev, [name]: value }));
- };
-
- const handleAccountTypeChange = (type: string) => {
- setuser(type);
- setFormData((prev) => ({ ...prev, accountType: type }));
- };
-
- const handleSubmit = async (e: React.FormEvent) => {
- e.preventDefault();
- if (formData.password !== formData.confirmPassword) {
- setError("Passwords do not match");
- return;
- }
- setIsLoading(true);
- setError("");
- try {
- const { name, email, password } = formData;
-
- // Check if user already exists
- const { data: existingUser } = await supabase.auth.signInWithPassword({
- email,
- password: "dummy-password-to-check-existence",
- });
-
- if (existingUser.user) {
- setError("An account with this email already exists. Please sign in instead.");
- setIsLoading(false);
- return;
- }
-
- const { data, error } = await supabase.auth.signUp({
- email,
- password,
- options: { data: { name } },
- });
- if (error) {
- if (error.message.includes("already registered")) {
- setError("An account with this email already exists. Please sign in instead.");
- } else {
- setError(error.message);
- }
- setIsLoading(false);
- return;
- }
- setIsLoading(false);
- // AuthContext will handle navigation based on user onboarding status and role
- } catch (err) {
- setError("Something went wrong. Please try again.");
- } finally {
- setIsLoading(false);
- }
- };
-
- const handleGoogleSignUp = async () => {
- const { data, error } = await supabase.auth.signInWithOAuth({
- provider: "google",
- });
-
- if (error) {
- console.log("Google login error", error);
- return;
- }
-
- // AuthContext will handle navigation based on user onboarding status and role
- };
-
- const passwordStrength = () => {
- const { password } = formData;
- if (!password)
- return { strength: 0, text: "", color: "bg-gray-200 dark:bg-gray-700" };
-
- let strength = 0;
- if (password.length >= 8) strength += 1;
- if (/[A-Z]/.test(password)) strength += 1;
- if (/[0-9]/.test(password)) strength += 1;
- if (/[^A-Za-z0-9]/.test(password)) strength += 1;
-
- const strengthMap = [
- { text: "Weak", color: "bg-red-500" },
- { text: "Fair", color: "bg-orange-500" },
- { text: "Good", color: "bg-yellow-500" },
- { text: "Strong", color: "bg-green-500" },
- ];
-
- return {
- strength,
- text: strengthMap[strength - 1]?.text || "",
- color: strengthMap[strength - 1]?.color || "bg-gray-200 dark:bg-gray-700",
- };
- };
-
- const { strength, text, color } = passwordStrength();
-
- return (
-
-
-
-
-
- Inpact
-
-
-
-
- Already have an account?
-
-
- Sign in
-
-
-
-
-
-
-
-
-
- {step === 1 ? "Create your account" : "Complete your profile"}
-
-
- {step === 1
- ? "Join the AI-powered creator collaboration platform"
- : "How do you want to use our Platform?"}
-
-
- {error && (
-
- {error}
-
- )}
-
-
-
- Email
-
-
-
- Password
-
-
-
- Confirm Password
-
-
- {isLoading ? "Signing up..." : "Sign Up"}
-
-
- {step === 1 && (
-
-
-
-
-
- Or continue with
-
-
-
-
-
-
-
-
-
- Google
-
-
-
-
-
- Facebook
-
-
-
- )}
-
-
-
-
-
-
- © 2024 Inpact. All rights reserved.
-
-
- );
-}
diff --git a/Frontend/src/pages/Sponsorships.tsx b/Frontend/src/pages/Sponsorships.tsx
deleted file mode 100644
index 67e813e..0000000
--- a/Frontend/src/pages/Sponsorships.tsx
+++ /dev/null
@@ -1,360 +0,0 @@
-import React from "react"
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../components/ui/card"
-import { ModeToggle } from "../components/mode-toggle"
-import { UserNav } from "../components/user-nav"
-import { Button } from "../components/ui/button"
-import { Input } from "../components/ui/input"
-import {
- BarChart3,
- Briefcase,
- DollarSign,
- FileText,
- LayoutDashboard,
- MessageSquare,
- Rocket,
- Search,
- Users,
-} from "lucide-react"
-import { Link } from "react-router-dom"
-import { Avatar, AvatarFallback, AvatarImage } from "../components/ui/avatar"
-import { Badge } from "../components/ui/badge"
-import { Tabs, TabsContent, TabsList, TabsTrigger } from "../components/ui/tabs"
-import { Slider } from "../components/ui/slider"
-import { Label } from "../components/ui/label"
-import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../components/ui/select"
-
-export default function SponsorshipsPage() {
- return (
-
-
-
-
-
AI-Driven Sponsorship Matchmaking
-
-
-
- Create Proposal
-
-
-
-
-
-
-
- Filters
- Refine your sponsorship matches
-
-
-
- Category
-
-
-
-
-
- All Categories
- Fashion
- Technology
- Beauty
- Fitness
- Food
- Travel
-
-
-
-
-
-
Budget Range
-
-
-
-
- $1,000
- $10,000
-
-
-
-
- Campaign Type
-
-
-
-
-
- All Types
- Single Post
- Content Series
- Long-term Partnership
- Affiliate Program
-
-
-
-
-
- Minimum Match Score
-
-
-
-
-
- 90% and above
- 80% and above
- 70% and above
- 60% and above
-
-
-
-
- Apply Filters
-
-
-
-
-
-
- AI Matches
- Active Deals
- History
-
-
-
-
-
-
-
- ES
-
-
-
-
-
EcoStyle
-
Sustainable fashion brand
-
-
98% Match
-
-
- EcoStyle is looking for lifestyle creators who can showcase their sustainable fashion line to
- environmentally conscious audiences. Their products include eco-friendly clothing,
- accessories, and home goods.
-
-
-
-
Budget
-
$3,000 - $5,000
-
-
-
Duration
-
1-2 months
-
-
-
Deliverables
-
1 post, 2 stories
-
-
-
Audience Match
-
Very High
-
-
-
- View Full Details
-
- Contact Brand
-
-
- Generate Proposal
-
-
-
-
-
-
-
-
-
-
-
-
- TG
-
-
-
-
-
TechGadgets
-
Consumer electronics company
-
-
95% Match
-
-
- TechGadgets is seeking tech-savvy creators to review and showcase their new line of smart home
- products. They're looking for in-depth reviews that highlight features and user experience.
-
-
-
-
Budget
-
$2,500 - $4,000
-
-
-
-
Deliverables
-
Review video + posts
-
-
-
Audience Match
-
High
-
-
-
- View Full Details
-
- Contact Brand
-
-
- Generate Proposal
-
-
-
-
-
-
-
-
-
-
-
-
- FL
-
-
-
-
-
FitLife Supplements
-
Health and wellness brand
-
-
92% Match
-
-
- FitLife is looking for health and fitness creators to promote their new line of plant-based
- supplements. They want authentic content showing how their products integrate into a healthy
- lifestyle.
-
-
-
-
Budget
-
$1,800 - $3,500
-
-
-
-
Deliverables
-
Monthly content
-
-
-
Audience Match
-
Very High
-
-
-
- View Full Details
-
- Contact Brand
-
-
- Generate Proposal
-
-
-
-
-
-
-
-
-
-
- Active Sponsorships
- Your current brand partnerships
-
-
- Your active sponsorships will appear here.
-
-
-
-
-
-
- Sponsorship History
- Your past brand partnerships
-
-
- Your sponsorship history will appear here.
-
-
-
-
-
-
-
-
- )
-}
\ No newline at end of file
diff --git a/Frontend/src/redux/chatSlice.ts b/Frontend/src/redux/chatSlice.ts
deleted file mode 100644
index bf1677e..0000000
--- a/Frontend/src/redux/chatSlice.ts
+++ /dev/null
@@ -1,257 +0,0 @@
-import { createSlice, PayloadAction } from "@reduxjs/toolkit";
-import { NewMessageResponse } from "@/types/chat";
-
-// Define the shape of a message
-export interface Message {
- id: string;
- chatListId: string;
- isSent: boolean;
- createdAt: string;
- message: string;
- status?: "sent" | "delivered" | "seen";
-}
-
-// Define the shape of a receiver
-interface Receiver {
- id: string;
- username?: string;
- profileImage?: string;
- isOnline: boolean;
- lastSeen: string | null;
-}
-
-// Define the shape of a chat
-export interface Chat {
- id: string;
- receiver: Receiver;
- messageIds: string[]; // Array of message IDs
- lastMessageTime: string;
-}
-
-// Define the shape of the chat state
-interface ChatState {
- chats: { [chatListId: string]: Chat }; // Normalized chats
- messages: { [message_id: string]: Message }; // Normalized messages
- selectedChatId: string | null; // Currently selected chat
-}
-
-// Initial state
-const initialState: ChatState = {
- chats: {},
- messages: {},
- selectedChatId: null,
-};
-
-// Create the chat slice
-const chatSlice = createSlice({
- name: "chat",
- initialState,
- reducers: {
- // Add a new chat
- addChat: (
- state,
- action: PayloadAction<{
- chatListId: string;
- lastMessageTime: string;
- receiver: Receiver;
- }>
- ) => {
- const { chatListId, receiver, lastMessageTime } = action.payload;
- if (!state.chats[chatListId]) {
- state.chats[chatListId] = {
- id: chatListId,
- receiver,
- messageIds: [],
- lastMessageTime: new Date(lastMessageTime).toISOString(),
- };
- }
- },
-
- addChats: (
- state,
- action: PayloadAction<
- { chatListId: string; lastMessageTime: string; receiver: Receiver }[]
- >
- ) => {
- action.payload.forEach(({ chatListId, lastMessageTime, receiver }) => {
- if (!state.chats[chatListId]) {
- state.chats[chatListId] = {
- id: chatListId,
- receiver,
- messageIds: [],
- lastMessageTime: new Date(lastMessageTime).toISOString(),
- };
- }
- });
- },
-
- // Add a message to a chat
- addMessage: (
- state,
- action: PayloadAction<{ chatListId: string; message: NewMessageResponse }>
- ) => {
- const { chatListId, message } = action.payload;
-
- const newMessage: Message = {
- id: message.id,
- chatListId: chatListId,
- isSent: message.isSent,
- createdAt: new Date(message.createdAt).toISOString(),
- message: message.message,
- status: message.status,
- };
-
- // Add the message to the normalized messages
- state.messages[newMessage.id] = newMessage;
-
- // Add the message ID to the chat's messageIds array
- if (state.chats[chatListId]) {
- state.chats[chatListId].messageIds.push(message.id);
- state.chats[chatListId].lastMessageTime = newMessage.createdAt;
- } else {
- // If the chat doesn't exist, create it
- state.chats[chatListId] = {
- id: chatListId,
- receiver: {
- id: message.senderId || "",
- isOnline: false,
- lastSeen: null,
- },
- messageIds: [message.id],
- lastMessageTime: newMessage.createdAt,
- };
- }
- },
-
- // Update receiver status
- updateReceiverStatus: (
- state,
- action: PayloadAction<{
- chatListId: string;
- isOnline: boolean;
- lastSeen?: string;
- }>
- ) => {
- const { chatListId, isOnline, lastSeen } = action.payload;
- if (state.chats[chatListId]) {
- state.chats[chatListId].receiver.isOnline = isOnline;
- if (lastSeen) {
- state.chats[chatListId].receiver.lastSeen = lastSeen;
- }
- }
- },
-
- // Remove a chat
- removeChat: (state, action: PayloadAction) => {
- const chatListId = action.payload;
-
- // Remove the chat
- delete state.chats[chatListId];
-
- // Remove all messages associated with the chat
- const messageIds = state.chats[chatListId]?.messageIds || [];
- messageIds.forEach((messageId) => {
- delete state.messages[messageId];
- });
- },
-
- // Set the selected chat
- setSelectedChat: (state, action: PayloadAction) => {
- state.selectedChatId = action.payload;
- },
-
- addOldMessages: (
- state,
- action: PayloadAction<{ chatListId: string; messages: Message[] }>
- ) => {
- const { chatListId, messages } = action.payload;
-
- // Add each message to the normalized messages
- messages.forEach((message) => {
- state.messages[message.id] = message;
- // Add the message ID to the chat's messageIds array
- if (state.chats[chatListId]) {
- state.chats[chatListId].messageIds.unshift(message.id);
- }
- });
- },
-
- markChatAsDelivered: (
- state,
- action: PayloadAction<{ chatListId: string }>
- ) => {
- const { chatListId } = action.payload;
- if (state.chats[chatListId]) {
- state.chats[chatListId].messageIds.forEach((messageId) => {
- if (state.messages[messageId]) {
- if (
- state.messages[messageId].status == "sent" &&
- state.messages[messageId].isSent
- ) {
- state.messages[messageId].status = "delivered";
- }
- }
- });
- }
- },
-
- markChatAsSeen: (state, action: PayloadAction<{ chatListId: string }>) => {
- const { chatListId } = action.payload;
- if (state.chats[chatListId]) {
- state.chats[chatListId].messageIds.forEach((messageId) => {
- if (state.messages[messageId]) {
- if (state.messages[messageId].isSent) {
- if (state.messages[messageId].status !== "seen")
- state.messages[messageId].status = "seen";
- }
- }
- });
- }
- },
-
- markMessageAsSeen: (
- state,
- action: PayloadAction<{ chatListId: string; messageId: string }>
- ) => {
- const { chatListId, messageId } = action.payload;
- if (state.chats[chatListId]) {
- if (state.messages[messageId]) {
- if (state.messages[messageId].isSent) {
- if (state.messages[messageId].status !== "seen")
- state.messages[messageId].status = "seen";
- }
- }
- }
- },
-
- updateUserDetails: (
- state,
- action: PayloadAction<{
- chatListId: string;
- username: string;
- profileImage: string | undefined;
- }>
- ) => {
- const { chatListId, username, profileImage } = action.payload;
- if (state.chats[chatListId]) {
- state.chats[chatListId].receiver.username = username;
- state.chats[chatListId].receiver.profileImage = profileImage;
- }
- },
- },
-});
-
-export const {
- addChat,
- addChats,
- addMessage,
- updateReceiverStatus,
- removeChat,
- setSelectedChat,
- addOldMessages,
- markChatAsDelivered,
- markChatAsSeen,
- updateUserDetails,
- markMessageAsSeen,
-} = chatSlice.actions;
-export default chatSlice.reducer;
diff --git a/Frontend/src/redux/store.ts b/Frontend/src/redux/store.ts
deleted file mode 100644
index 0e8e30d..0000000
--- a/Frontend/src/redux/store.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { configureStore } from "@reduxjs/toolkit";
-import chatReducer from "./chatSlice";
-
-const store = configureStore({
- reducer: {
- chat: chatReducer,
- },
-});
-
-// Infer the `RootState` and `AppDispatch` types from the store itself
-export type RootState = ReturnType;
-export type AppDispatch = typeof store.dispatch;
-export default store;
diff --git a/Frontend/src/types/chat.ts b/Frontend/src/types/chat.ts
deleted file mode 100644
index 399e50e..0000000
--- a/Frontend/src/types/chat.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-export interface MessagesReadResponse {
- chatListId: string;
- eventType: "MESSAGES_READ";
-}
-
-export interface NewMessageResponse {
- id: string;
- isSent: boolean;
- status?: "sent" | "delivered" | "seen";
- senderId?: string;
- chatListId?: string;
- message: string;
- createdAt: string;
- eventType?: string;
- username?: string;
-}
diff --git a/Frontend/src/utils/demoInsert.ts b/Frontend/src/utils/demoInsert.ts
deleted file mode 100644
index 3e309e9..0000000
--- a/Frontend/src/utils/demoInsert.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { supabase } from './supabase';
-
-export async function demoInsert() {
- // Insert user
- const { data: user, error: userError } = await supabase
- .from('users')
- .insert({
- id: 'demo-user-123',
- username: 'demouser',
- email: 'demo@example.com',
- role: 'creator',
- age: '25',
- gender: 'Male',
- country: 'India',
- category: 'Tech',
- });
- console.log('User:', user, userError);
-
- // Insert social profile
- const { data: profile, error: profileError } = await supabase
- .from('social_profiles')
- .insert({
- user_id: 'demo-user-123',
- platform: 'YouTube',
- username: 'demoyt',
- followers: 1000,
- posts: 10,
- channel_id: 'UC1234567890abcdef',
- channel_name: 'Demo Channel',
- subscriber_count: 1000,
- total_views: 50000,
- video_count: 10,
- per_post_cost: 100,
- per_video_cost: 200,
- per_post_cost_currency: 'USD',
- per_video_cost_currency: 'USD',
- channel_url: 'https://youtube.com/channel/UC1234567890abcdef',
- });
- console.log('Profile:', profile, profileError);
-}
\ No newline at end of file
diff --git a/Frontend/src/utils/supabase.tsx b/Frontend/src/utils/supabase.tsx
deleted file mode 100644
index b97998d..0000000
--- a/Frontend/src/utils/supabase.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { createClient } from "@supabase/supabase-js";
-
-const supabaseUrl = import.meta.env.VITE_SUPABASE_URL;
-const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY;
-
-if (!supabaseUrl || !supabaseAnonKey) {
- console.error("Supabase environment variables are not configured. Please set VITE_SUPABASE_URL and VITE_SUPABASE_ANON_KEY in your .env file.");
- throw new Error("Missing Supabase environment variables");
-}
-
-export const supabase = createClient(supabaseUrl, supabaseAnonKey);
-export * from "@supabase/supabase-js";
diff --git a/Frontend/src/vite-env.d.ts b/Frontend/src/vite-env.d.ts
deleted file mode 100644
index 11f02fe..0000000
--- a/Frontend/src/vite-env.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/Frontend/tsconfig.app.json b/Frontend/tsconfig.app.json
deleted file mode 100644
index 0f468d7..0000000
--- a/Frontend/tsconfig.app.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "compilerOptions": {
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
- "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": false,
- "noUnusedParameters": false,
- "noFallthroughCasesInSwitch": true,
- "noUncheckedSideEffectImports": true,
- "baseUrl": ".",
- "paths": {
- "@/*": ["./src/*"]
- }
- },
- "include": ["src"]
-}
diff --git a/Frontend/tsconfig.json b/Frontend/tsconfig.json
deleted file mode 100644
index fec8c8e..0000000
--- a/Frontend/tsconfig.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "files": [],
- "references": [
- { "path": "./tsconfig.app.json" },
- { "path": "./tsconfig.node.json" }
- ],
- "compilerOptions": {
- "baseUrl": ".",
- "paths": {
- "@/*": ["./src/*"]
- }
- }
-}
diff --git a/Frontend/tsconfig.node.json b/Frontend/tsconfig.node.json
deleted file mode 100644
index db0becc..0000000
--- a/Frontend/tsconfig.node.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "compilerOptions": {
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
- "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,
- "noUncheckedSideEffectImports": true
- },
- "include": ["vite.config.ts"]
-}
diff --git a/Frontend/vite.config.ts b/Frontend/vite.config.ts
deleted file mode 100644
index 4eba012..0000000
--- a/Frontend/vite.config.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import path from "path";
-import tailwindcss from "@tailwindcss/vite";
-import react from "@vitejs/plugin-react";
-import { defineConfig } from "vite";
-
-// https://vite.dev/config/
-export default defineConfig({
- plugins: [react(), tailwindcss()],
- resolve: {
- alias: {
- "@": path.resolve(__dirname, "./src"),
- },
- },
- server: {
- proxy: {
- '/api': 'http://localhost:8000',
- },
- },
-});
diff --git a/LandingPage/.gitignore b/LandingPage/.gitignore
deleted file mode 100644
index a547bf3..0000000
--- a/LandingPage/.gitignore
+++ /dev/null
@@ -1,24 +0,0 @@
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-pnpm-debug.log*
-lerna-debug.log*
-
-node_modules
-dist
-dist-ssr
-*.local
-
-# Editor directories and files
-.vscode/*
-!.vscode/extensions.json
-.idea
-.DS_Store
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?
diff --git a/LandingPage/README.md b/LandingPage/README.md
deleted file mode 100644
index 5443803..0000000
--- a/LandingPage/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Inpact Landing Page
-
-**This repository is a fork of [ishaanxgupta/Inpact-LandingPage](https://github.com/ishaanxgupta/Inpact-LandingPage).**
-
-Special thanks and credit to **Ishaan Gupta** ([ishaanxgupta](https://github.com/ishaanxgupta)) for building the landing page to this level.
-
----
\ No newline at end of file
diff --git a/LandingPage/eslint.config.js b/LandingPage/eslint.config.js
deleted file mode 100644
index 092408a..0000000
--- a/LandingPage/eslint.config.js
+++ /dev/null
@@ -1,28 +0,0 @@
-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/LandingPage/index.html b/LandingPage/index.html
deleted file mode 100644
index 340be0d..0000000
--- a/LandingPage/index.html
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
- Vite + React + TS
-
-
-
-
-
-
diff --git a/LandingPage/package-lock.json b/LandingPage/package-lock.json
deleted file mode 100644
index f3f9e25..0000000
--- a/LandingPage/package-lock.json
+++ /dev/null
@@ -1,4291 +0,0 @@
-{
- "name": "inpactai",
- "version": "0.0.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "inpactai",
- "version": "0.0.0",
- "dependencies": {
- "@emotion/react": "^11.14.0",
- "@emotion/styled": "^11.14.0",
- "@mui/material": "^7.0.2",
- "clsx": "^2.1.1",
- "framer-motion": "^12.6.5",
- "gsap": "^3.12.7",
- "lucide-react": "^0.487.0",
- "ogl": "^1.0.11",
- "react": "^19.0.0",
- "react-dom": "^19.0.0",
- "react-router-dom": "^7.5.0",
- "react-slick": "^0.30.3",
- "react-social-icons": "^6.24.0",
- "slick-carousel": "^1.8.1",
- "styled-components": "^6.1.17"
- },
- "devDependencies": {
- "@eslint/js": "^9.21.0",
- "@types/react": "^19.0.10",
- "@types/react-dom": "^19.0.4",
- "@vitejs/plugin-react": "^4.3.4",
- "eslint": "^9.21.0",
- "eslint-plugin-react-hooks": "^5.1.0",
- "eslint-plugin-react-refresh": "^0.4.19",
- "globals": "^15.15.0",
- "typescript": "~5.7.2",
- "typescript-eslint": "^8.24.1",
- "vite": "^6.2.0"
- }
- },
- "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.26.2",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
- "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.25.9",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/compat-data": {
- "version": "7.26.8",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz",
- "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/core": {
- "version": "7.26.10",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz",
- "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.26.2",
- "@babel/generator": "^7.26.10",
- "@babel/helper-compilation-targets": "^7.26.5",
- "@babel/helper-module-transforms": "^7.26.0",
- "@babel/helpers": "^7.26.10",
- "@babel/parser": "^7.26.10",
- "@babel/template": "^7.26.9",
- "@babel/traverse": "^7.26.10",
- "@babel/types": "^7.26.10",
- "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.27.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz",
- "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==",
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.27.0",
- "@babel/types": "^7.27.0",
- "@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.27.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz",
- "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.26.8",
- "@babel/helper-validator-option": "^7.25.9",
- "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.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
- "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.25.9",
- "@babel/types": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
- "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.25.9",
- "@babel/helper-validator-identifier": "^7.25.9",
- "@babel/traverse": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-plugin-utils": {
- "version": "7.26.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
- "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-string-parser": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
- "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
- "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-option": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
- "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helpers": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz",
- "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/template": "^7.27.0",
- "@babel/types": "^7.27.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz",
- "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.27.0"
- },
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-self": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz",
- "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-source": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz",
- "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/runtime": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz",
- "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
- "license": "MIT",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/template": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz",
- "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.26.2",
- "@babel/parser": "^7.27.0",
- "@babel/types": "^7.27.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz",
- "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.26.2",
- "@babel/generator": "^7.27.0",
- "@babel/parser": "^7.27.0",
- "@babel/template": "^7.27.0",
- "@babel/types": "^7.27.0",
- "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==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/types": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz",
- "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-string-parser": "^7.25.9",
- "@babel/helper-validator-identifier": "^7.25.9"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@emotion/babel-plugin": {
- "version": "11.13.5",
- "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz",
- "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.16.7",
- "@babel/runtime": "^7.18.3",
- "@emotion/hash": "^0.9.2",
- "@emotion/memoize": "^0.9.0",
- "@emotion/serialize": "^1.3.3",
- "babel-plugin-macros": "^3.1.0",
- "convert-source-map": "^1.5.0",
- "escape-string-regexp": "^4.0.0",
- "find-root": "^1.1.0",
- "source-map": "^0.5.7",
- "stylis": "4.2.0"
- }
- },
- "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
- "license": "MIT"
- },
- "node_modules/@emotion/cache": {
- "version": "11.14.0",
- "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz",
- "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==",
- "license": "MIT",
- "dependencies": {
- "@emotion/memoize": "^0.9.0",
- "@emotion/sheet": "^1.4.0",
- "@emotion/utils": "^1.4.2",
- "@emotion/weak-memoize": "^0.4.0",
- "stylis": "4.2.0"
- }
- },
- "node_modules/@emotion/hash": {
- "version": "0.9.2",
- "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
- "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==",
- "license": "MIT"
- },
- "node_modules/@emotion/is-prop-valid": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz",
- "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==",
- "license": "MIT",
- "dependencies": {
- "@emotion/memoize": "^0.9.0"
- }
- },
- "node_modules/@emotion/memoize": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
- "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==",
- "license": "MIT"
- },
- "node_modules/@emotion/react": {
- "version": "11.14.0",
- "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz",
- "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.18.3",
- "@emotion/babel-plugin": "^11.13.5",
- "@emotion/cache": "^11.14.0",
- "@emotion/serialize": "^1.3.3",
- "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
- "@emotion/utils": "^1.4.2",
- "@emotion/weak-memoize": "^0.4.0",
- "hoist-non-react-statics": "^3.3.1"
- },
- "peerDependencies": {
- "react": ">=16.8.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@emotion/serialize": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz",
- "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==",
- "license": "MIT",
- "dependencies": {
- "@emotion/hash": "^0.9.2",
- "@emotion/memoize": "^0.9.0",
- "@emotion/unitless": "^0.10.0",
- "@emotion/utils": "^1.4.2",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@emotion/sheet": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz",
- "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==",
- "license": "MIT"
- },
- "node_modules/@emotion/styled": {
- "version": "11.14.0",
- "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz",
- "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.18.3",
- "@emotion/babel-plugin": "^11.13.5",
- "@emotion/is-prop-valid": "^1.3.0",
- "@emotion/serialize": "^1.3.3",
- "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
- "@emotion/utils": "^1.4.2"
- },
- "peerDependencies": {
- "@emotion/react": "^11.0.0-rc.0",
- "react": ">=16.8.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@emotion/unitless": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
- "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==",
- "license": "MIT"
- },
- "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz",
- "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==",
- "license": "MIT",
- "peerDependencies": {
- "react": ">=16.8.0"
- }
- },
- "node_modules/@emotion/utils": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz",
- "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==",
- "license": "MIT"
- },
- "node_modules/@emotion/weak-memoize": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz",
- "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==",
- "license": "MIT"
- },
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz",
- "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz",
- "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz",
- "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/android-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz",
- "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz",
- "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz",
- "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz",
- "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz",
- "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz",
- "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz",
- "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz",
- "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz",
- "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz",
- "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==",
- "cpu": [
- "mips64el"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz",
- "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz",
- "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz",
- "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/linux-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz",
- "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz",
- "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz",
- "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz",
- "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz",
- "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz",
- "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz",
- "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz",
- "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz",
- "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@eslint-community/eslint-utils": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.0.tgz",
- "integrity": "sha512-WhCn7Z7TauhBtmzhvKpoQs0Wwb/kBcy4CwpuI0/eEIr2Lx2auxmulAzLr91wVZJaz47iUZdkXOK7WlAfxGKCnA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
- }
- },
- "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint-community/regexpp": {
- "version": "4.12.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
- "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
- }
- },
- "node_modules/@eslint/config-array": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz",
- "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/object-schema": "^2.1.6",
- "debug": "^4.3.1",
- "minimatch": "^3.1.2"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/config-helpers": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz",
- "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/core": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz",
- "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/eslintrc": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
- "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^10.0.1",
- "globals": "^14.0.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint/eslintrc/node_modules/globals": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
- "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@eslint/js": {
- "version": "9.24.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.24.0.tgz",
- "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/object-schema": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
- "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/plugin-kit": {
- "version": "0.2.8",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz",
- "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/core": "^0.13.0",
- "levn": "^0.4.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz",
- "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@humanfs/core": {
- "version": "0.19.1",
- "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
- "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanfs/node": {
- "version": "0.16.6",
- "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
- "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@humanfs/core": "^0.19.1",
- "@humanwhocodes/retry": "^0.3.0"
- },
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
- "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=12.22"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/retry": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz",
- "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
- "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
- "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/@mui/core-downloads-tracker": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.0.2.tgz",
- "integrity": "sha512-TfeFU9TgN1N06hyb/pV/63FfO34nijZRMqgHk0TJ3gkl4Fbd+wZ73+ZtOd7jag6hMmzO9HSrBc6Vdn591nhkAg==",
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- }
- },
- "node_modules/@mui/material": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.0.2.tgz",
- "integrity": "sha512-rjJlJ13+3LdLfobRplkXbjIFEIkn6LgpetgU/Cs3Xd8qINCCQK9qXQIjjQ6P0FXFTPFzEVMj0VgBR1mN+FhOcA==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.27.0",
- "@mui/core-downloads-tracker": "^7.0.2",
- "@mui/system": "^7.0.2",
- "@mui/types": "^7.4.1",
- "@mui/utils": "^7.0.2",
- "@popperjs/core": "^2.11.8",
- "@types/react-transition-group": "^4.4.12",
- "clsx": "^2.1.1",
- "csstype": "^3.1.3",
- "prop-types": "^15.8.1",
- "react-is": "^19.1.0",
- "react-transition-group": "^4.4.5"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@emotion/react": "^11.5.0",
- "@emotion/styled": "^11.3.0",
- "@mui/material-pigment-css": "^7.0.2",
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@emotion/react": {
- "optional": true
- },
- "@emotion/styled": {
- "optional": true
- },
- "@mui/material-pigment-css": {
- "optional": true
- },
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/private-theming": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.0.2.tgz",
- "integrity": "sha512-6lt8heDC9wN8YaRqEdhqnm0cFCv08AMf4IlttFvOVn7ZdKd81PNpD/rEtPGLLwQAFyyKSxBG4/2XCgpbcdNKiA==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.27.0",
- "@mui/utils": "^7.0.2",
- "prop-types": "^15.8.1"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/styled-engine": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.0.2.tgz",
- "integrity": "sha512-11Bt4YdHGlh7sB8P75S9mRCUxTlgv7HGbr0UKz6m6Z9KLeiw1Bm9y/t3iqLLVMvSHYB6zL8X8X+LmfTE++gyBw==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.27.0",
- "@emotion/cache": "^11.13.5",
- "@emotion/serialize": "^1.3.3",
- "@emotion/sheet": "^1.4.0",
- "csstype": "^3.1.3",
- "prop-types": "^15.8.1"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@emotion/react": "^11.4.1",
- "@emotion/styled": "^11.3.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@emotion/react": {
- "optional": true
- },
- "@emotion/styled": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/system": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.0.2.tgz",
- "integrity": "sha512-yFUraAWYWuKIISPPEVPSQ1NLeqmTT4qiQ+ktmyS8LO/KwHxB+NNVOacEZaIofh5x1NxY8rzphvU5X2heRZ/RDA==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.27.0",
- "@mui/private-theming": "^7.0.2",
- "@mui/styled-engine": "^7.0.2",
- "@mui/types": "^7.4.1",
- "@mui/utils": "^7.0.2",
- "clsx": "^2.1.1",
- "csstype": "^3.1.3",
- "prop-types": "^15.8.1"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@emotion/react": "^11.5.0",
- "@emotion/styled": "^11.3.0",
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@emotion/react": {
- "optional": true
- },
- "@emotion/styled": {
- "optional": true
- },
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/types": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.1.tgz",
- "integrity": "sha512-gUL8IIAI52CRXP/MixT1tJKt3SI6tVv4U/9soFsTtAsHzaJQptZ42ffdHZV3niX1ei0aUgMvOxBBN0KYqdG39g==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.27.0"
- },
- "peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/utils": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.0.2.tgz",
- "integrity": "sha512-72gcuQjPzhj/MLmPHLCgZjy2VjOH4KniR/4qRtXTTXIEwbkgcN+Y5W/rC90rWtMmZbjt9svZev/z+QHUI4j74w==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.27.0",
- "@mui/types": "^7.4.1",
- "@types/prop-types": "^15.7.14",
- "clsx": "^2.1.1",
- "prop-types": "^15.8.1",
- "react-is": "^19.1.0"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@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==",
- "dev": true,
- "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==",
- "dev": true,
- "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==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@popperjs/core": {
- "version": "2.11.8",
- "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
- "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/popperjs"
- }
- },
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz",
- "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz",
- "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz",
- "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz",
- "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz",
- "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz",
- "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz",
- "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz",
- "integrity": "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz",
- "integrity": "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz",
- "integrity": "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz",
- "integrity": "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz",
- "integrity": "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz",
- "integrity": "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz",
- "integrity": "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz",
- "integrity": "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz",
- "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz",
- "integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz",
- "integrity": "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz",
- "integrity": "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz",
- "integrity": "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@types/babel__core": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
- "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.20.7",
- "@babel/types": "^7.20.7",
- "@types/babel__generator": "*",
- "@types/babel__template": "*",
- "@types/babel__traverse": "*"
- }
- },
- "node_modules/@types/babel__generator": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
- "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__template": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
- "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
- },
- "node_modules/@types/babel__traverse": {
- "version": "7.20.7",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz",
- "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.20.7"
- }
- },
- "node_modules/@types/cookie": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
- "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==",
- "license": "MIT"
- },
- "node_modules/@types/estree": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
- "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/parse-json": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
- "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
- "license": "MIT"
- },
- "node_modules/@types/prop-types": {
- "version": "15.7.14",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
- "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==",
- "license": "MIT"
- },
- "node_modules/@types/react": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.1.tgz",
- "integrity": "sha512-ePapxDL7qrgqSF67s0h9m412d9DbXyC1n59O2st+9rjuuamWsZuD2w55rqY12CbzsZ7uVXb5Nw0gEp9Z8MMutQ==",
- "license": "MIT",
- "dependencies": {
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@types/react-dom": {
- "version": "19.1.2",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.2.tgz",
- "integrity": "sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "^19.0.0"
- }
- },
- "node_modules/@types/react-transition-group": {
- "version": "4.4.12",
- "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
- "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*"
- }
- },
- "node_modules/@types/stylis": {
- "version": "4.2.5",
- "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz",
- "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==",
- "license": "MIT"
- },
- "node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.29.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.1.tgz",
- "integrity": "sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.29.1",
- "@typescript-eslint/type-utils": "8.29.1",
- "@typescript-eslint/utils": "8.29.1",
- "@typescript-eslint/visitor-keys": "8.29.1",
- "graphemer": "^1.4.0",
- "ignore": "^5.3.1",
- "natural-compare": "^1.4.0",
- "ts-api-utils": "^2.0.1"
- },
- "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",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/@typescript-eslint/parser": {
- "version": "8.29.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.1.tgz",
- "integrity": "sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/scope-manager": "8.29.1",
- "@typescript-eslint/types": "8.29.1",
- "@typescript-eslint/typescript-estree": "8.29.1",
- "@typescript-eslint/visitor-keys": "8.29.1",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "8.29.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.1.tgz",
- "integrity": "sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.29.1",
- "@typescript-eslint/visitor-keys": "8.29.1"
- },
- "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.29.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.1.tgz",
- "integrity": "sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/typescript-estree": "8.29.1",
- "@typescript-eslint/utils": "8.29.1",
- "debug": "^4.3.4",
- "ts-api-utils": "^2.0.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/@typescript-eslint/types": {
- "version": "8.29.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.1.tgz",
- "integrity": "sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==",
- "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.29.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.1.tgz",
- "integrity": "sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.29.1",
- "@typescript-eslint/visitor-keys": "8.29.1",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.0.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
- "version": "2.0.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.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@typescript-eslint/utils": {
- "version": "8.29.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.1.tgz",
- "integrity": "sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "8.29.1",
- "@typescript-eslint/types": "8.29.1",
- "@typescript-eslint/typescript-estree": "8.29.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.29.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.1.tgz",
- "integrity": "sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.29.1",
- "eslint-visitor-keys": "^4.2.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@vitejs/plugin-react": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz",
- "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.26.0",
- "@babel/plugin-transform-react-jsx-self": "^7.25.9",
- "@babel/plugin-transform-react-jsx-source": "^7.25.9",
- "@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 || ^6.0.0"
- }
- },
- "node_modules/acorn": {
- "version": "8.14.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
- "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
- "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-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true,
- "license": "Python-2.0"
- },
- "node_modules/babel-plugin-macros": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
- "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.12.5",
- "cosmiconfig": "^7.0.0",
- "resolve": "^1.19.0"
- },
- "engines": {
- "node": ">=10",
- "npm": ">=6"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/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==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fill-range": "^7.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browserslist": {
- "version": "4.24.4",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
- "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
- "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.30001688",
- "electron-to-chromium": "^1.5.73",
- "node-releases": "^2.0.19",
- "update-browserslist-db": "^1.1.1"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/camelize": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz",
- "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001713",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz",
- "integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "CC-BY-4.0"
- },
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/classnames": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
- "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==",
- "license": "MIT"
- },
- "node_modules/clsx": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
- "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/convert-source-map": {
- "version": "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/cookie": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz",
- "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==",
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/cosmiconfig": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
- "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
- "license": "MIT",
- "dependencies": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.2.1",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/cosmiconfig/node_modules/yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "license": "ISC",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/css-color-keywords": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",
- "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==",
- "license": "ISC",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/css-to-react-native": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz",
- "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==",
- "license": "MIT",
- "dependencies": {
- "camelize": "^1.0.0",
- "css-color-keywords": "^1.0.0",
- "postcss-value-parser": "^4.0.2"
- }
- },
- "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/debug": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/dom-helpers": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
- "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.8.7",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/electron-to-chromium": {
- "version": "1.5.136",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.136.tgz",
- "integrity": "sha512-kL4+wUTD7RSA5FHx5YwWtjDnEEkIIikFgWHR4P6fqjw1PPLlqYkxeOb++wAauAssat0YClCy8Y3C5SxgSkjibQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/enquire.js": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
- "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==",
- "license": "MIT"
- },
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "license": "MIT",
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
- "node_modules/esbuild": {
- "version": "0.25.2",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz",
- "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.25.2",
- "@esbuild/android-arm": "0.25.2",
- "@esbuild/android-arm64": "0.25.2",
- "@esbuild/android-x64": "0.25.2",
- "@esbuild/darwin-arm64": "0.25.2",
- "@esbuild/darwin-x64": "0.25.2",
- "@esbuild/freebsd-arm64": "0.25.2",
- "@esbuild/freebsd-x64": "0.25.2",
- "@esbuild/linux-arm": "0.25.2",
- "@esbuild/linux-arm64": "0.25.2",
- "@esbuild/linux-ia32": "0.25.2",
- "@esbuild/linux-loong64": "0.25.2",
- "@esbuild/linux-mips64el": "0.25.2",
- "@esbuild/linux-ppc64": "0.25.2",
- "@esbuild/linux-riscv64": "0.25.2",
- "@esbuild/linux-s390x": "0.25.2",
- "@esbuild/linux-x64": "0.25.2",
- "@esbuild/netbsd-arm64": "0.25.2",
- "@esbuild/netbsd-x64": "0.25.2",
- "@esbuild/openbsd-arm64": "0.25.2",
- "@esbuild/openbsd-x64": "0.25.2",
- "@esbuild/sunos-x64": "0.25.2",
- "@esbuild/win32-arm64": "0.25.2",
- "@esbuild/win32-ia32": "0.25.2",
- "@esbuild/win32-x64": "0.25.2"
- }
- },
- "node_modules/escalade": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint": {
- "version": "9.24.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.24.0.tgz",
- "integrity": "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.12.1",
- "@eslint/config-array": "^0.20.0",
- "@eslint/config-helpers": "^0.2.0",
- "@eslint/core": "^0.12.0",
- "@eslint/eslintrc": "^3.3.1",
- "@eslint/js": "9.24.0",
- "@eslint/plugin-kit": "^0.2.7",
- "@humanfs/node": "^0.16.6",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@humanwhocodes/retry": "^0.4.2",
- "@types/estree": "^1.0.6",
- "@types/json-schema": "^7.0.15",
- "ajv": "^6.12.4",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.6",
- "debug": "^4.3.2",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^8.3.0",
- "eslint-visitor-keys": "^4.2.0",
- "espree": "^10.3.0",
- "esquery": "^1.5.0",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^8.0.0",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.3"
- },
- "bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://eslint.org/donate"
- },
- "peerDependencies": {
- "jiti": "*"
- },
- "peerDependenciesMeta": {
- "jiti": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-plugin-react-hooks": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
- "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
- }
- },
- "node_modules/eslint-plugin-react-refresh": {
- "version": "0.4.19",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz",
- "integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "eslint": ">=8.40"
- }
- },
- "node_modules/eslint-scope": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz",
- "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
- "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/espree": {
- "version": "10.3.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
- "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "acorn": "^8.14.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^4.2.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.3",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
- "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
- "dev": true,
- "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.8"
- },
- "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==",
- "dev": true,
- "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.19.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
- "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/file-entry-cache": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
- "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flat-cache": "^4.0.0"
- },
- "engines": {
- "node": ">=16.0.0"
- }
- },
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/find-root": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
- "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
- "license": "MIT"
- },
- "node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/flat-cache": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
- "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.4"
- },
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/flatted": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
- "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/framer-motion": {
- "version": "12.6.5",
- "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.6.5.tgz",
- "integrity": "sha512-MKvnWov0paNjvRJuIy6x418w23tFqRfS6CXHhZrCiSEpXVlo/F+usr8v4/3G6O0u7CpsaO1qop+v4Ip7PRCBqQ==",
- "license": "MIT",
- "dependencies": {
- "motion-dom": "^12.6.5",
- "motion-utils": "^12.6.5",
- "tslib": "^2.4.0"
- },
- "peerDependencies": {
- "@emotion/is-prop-valid": "*",
- "react": "^18.0.0 || ^19.0.0",
- "react-dom": "^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@emotion/is-prop-valid": {
- "optional": true
- },
- "react": {
- "optional": true
- },
- "react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "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/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/globals": {
- "version": "15.15.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
- "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/gsap": {
- "version": "3.12.7",
- "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.12.7.tgz",
- "integrity": "sha512-V4GsyVamhmKefvcAKaoy0h6si0xX7ogwBoBSs2CTJwt7luW0oZzC0LhdkyuKV8PJAXr7Yaj8pMjCKD4GJ+eEMg==",
- "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": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/hoist-non-react-statics": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
- "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "react-is": "^16.7.0"
- }
- },
- "node_modules/hoist-non-react-statics/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/ignore": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
- "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/import-fresh": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
- "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
- "license": "MIT",
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "license": "MIT"
- },
- "node_modules/is-core-module": {
- "version": "2.16.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
- "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
- "license": "MIT",
- "dependencies": {
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "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==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/jquery": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
- "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==",
- "license": "MIT",
- "peer": true
- },
- "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.1.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
- "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
- "license": "MIT",
- "bin": {
- "jsesc": "bin/jsesc"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "license": "MIT"
- },
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json2mq": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
- "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
- "license": "MIT",
- "dependencies": {
- "string-convert": "^0.2.0"
- }
- },
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "json-buffer": "3.0.1"
- }
- },
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "license": "MIT"
- },
- "node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/lodash.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.487.0",
- "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.487.0.tgz",
- "integrity": "sha512-aKqhOQ+YmFnwq8dWgGjOuLc8V1R9/c/yOd+zDY4+ohsR2Jo05lSGc3WsstYPIzcTpeosN7LoCkLReUUITvaIvw==",
- "license": "ISC",
- "peerDependencies": {
- "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- }
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "braces": "^3.0.3",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/motion-dom": {
- "version": "12.6.5",
- "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.6.5.tgz",
- "integrity": "sha512-jpM9TQLXzYMWMJ7Ec7sAj0iis8oIuu6WvjI3yNKJLdrZyrsI/b2cRInDVL8dCl683zQQq19DpL9cSMP+k8T1NA==",
- "license": "MIT",
- "dependencies": {
- "motion-utils": "^12.6.5"
- }
- },
- "node_modules/motion-utils": {
- "version": "12.6.5",
- "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.6.5.tgz",
- "integrity": "sha512-IsOeKsOF+FWBhxQEDFBO6ZYC8/jlidmVbbLpe9/lXSA9j9kzGIMUuIBx2SZY+0reAS0DjZZ1i7dJp4NHrjocPw==",
- "license": "MIT"
- },
- "node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/nanoid": {
- "version": "3.3.11",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
- "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/node-releases": {
- "version": "2.0.19",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
- "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/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/ogl": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/ogl/-/ogl-1.0.11.tgz",
- "integrity": "sha512-kUpC154AFfxi16pmZUK4jk3J+8zxwTWGPo03EoYA8QPbzikHoaC82n6pNTbd+oEaJonaE8aPWBlX7ad9zrqLsA==",
- "license": "Unlicense"
- },
- "node_modules/optionator": {
- "version": "0.9.4",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
- "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.5"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "license": "MIT",
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "license": "MIT"
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/picocolors": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
- "license": "ISC"
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/postcss": {
- "version": "8.5.3",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
- "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.8",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/postcss-value-parser": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
- "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
- "license": "MIT"
- },
- "node_modules/prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/prop-types": {
- "version": "15.8.1",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
- "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
- "license": "MIT",
- "dependencies": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.13.1"
- }
- },
- "node_modules/prop-types/node_modules/react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
- "license": "MIT"
- },
- "node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "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": "19.1.0",
- "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
- "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-dom": {
- "version": "19.1.0",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
- "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
- "license": "MIT",
- "dependencies": {
- "scheduler": "^0.26.0"
- },
- "peerDependencies": {
- "react": "^19.1.0"
- }
- },
- "node_modules/react-is": {
- "version": "19.1.0",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz",
- "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==",
- "license": "MIT"
- },
- "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-router": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.0.tgz",
- "integrity": "sha512-estOHrRlDMKdlQa6Mj32gIks4J+AxNsYoE0DbTTxiMy2mPzZuWSDU+N85/r1IlNR7kGfznF3VCUlvc5IUO+B9g==",
- "license": "MIT",
- "dependencies": {
- "@types/cookie": "^0.6.0",
- "cookie": "^1.0.1",
- "set-cookie-parser": "^2.6.0",
- "turbo-stream": "2.4.0"
- },
- "engines": {
- "node": ">=20.0.0"
- },
- "peerDependencies": {
- "react": ">=18",
- "react-dom": ">=18"
- },
- "peerDependenciesMeta": {
- "react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/react-router-dom": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.0.tgz",
- "integrity": "sha512-fFhGFCULy4vIseTtH5PNcY/VvDJK5gvOWcwJVHQp8JQcWVr85ENhJ3UpuF/zP1tQOIFYNRJHzXtyhU1Bdgw0RA==",
- "license": "MIT",
- "dependencies": {
- "react-router": "7.5.0"
- },
- "engines": {
- "node": ">=20.0.0"
- },
- "peerDependencies": {
- "react": ">=18",
- "react-dom": ">=18"
- }
- },
- "node_modules/react-slick": {
- "version": "0.30.3",
- "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.30.3.tgz",
- "integrity": "sha512-B4x0L9GhkEWUMApeHxr/Ezp2NncpGc+5174R02j+zFiWuYboaq98vmxwlpafZfMjZic1bjdIqqmwLDcQY0QaFA==",
- "license": "MIT",
- "dependencies": {
- "classnames": "^2.2.5",
- "enquire.js": "^2.1.6",
- "json2mq": "^0.2.0",
- "lodash.debounce": "^4.0.8",
- "resize-observer-polyfill": "^1.5.0"
- },
- "peerDependencies": {
- "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
- "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- }
- },
- "node_modules/react-social-icons": {
- "version": "6.24.0",
- "resolved": "https://registry.npmjs.org/react-social-icons/-/react-social-icons-6.24.0.tgz",
- "integrity": "sha512-1YlJe2TOf/UwPi2JAb8Ci7J207owP806Tpxu36o4EkB1/jLjGhi83xbCHOagoMyPozTZrPnZIGgvp1LiiWGuZw==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.24.8"
- },
- "peerDependencies": {
- "react": "16.x.x || 17.x.x || 18.x.x || 19.x.x",
- "react-dom": "16.x.x || 17.x.x || 18.x.x || 19.x.x"
- }
- },
- "node_modules/react-transition-group": {
- "version": "4.4.5",
- "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
- "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "@babel/runtime": "^7.5.5",
- "dom-helpers": "^5.0.1",
- "loose-envify": "^1.4.0",
- "prop-types": "^15.6.2"
- },
- "peerDependencies": {
- "react": ">=16.6.0",
- "react-dom": ">=16.6.0"
- }
- },
- "node_modules/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/resize-observer-polyfill": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
- "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==",
- "license": "MIT"
- },
- "node_modules/resolve": {
- "version": "1.22.10",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
- "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
- "license": "MIT",
- "dependencies": {
- "is-core-module": "^2.16.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/reusify": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
- "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rollup": {
- "version": "4.40.0",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz",
- "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "1.0.7"
- },
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
- },
- "optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.40.0",
- "@rollup/rollup-android-arm64": "4.40.0",
- "@rollup/rollup-darwin-arm64": "4.40.0",
- "@rollup/rollup-darwin-x64": "4.40.0",
- "@rollup/rollup-freebsd-arm64": "4.40.0",
- "@rollup/rollup-freebsd-x64": "4.40.0",
- "@rollup/rollup-linux-arm-gnueabihf": "4.40.0",
- "@rollup/rollup-linux-arm-musleabihf": "4.40.0",
- "@rollup/rollup-linux-arm64-gnu": "4.40.0",
- "@rollup/rollup-linux-arm64-musl": "4.40.0",
- "@rollup/rollup-linux-loongarch64-gnu": "4.40.0",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.40.0",
- "@rollup/rollup-linux-riscv64-gnu": "4.40.0",
- "@rollup/rollup-linux-riscv64-musl": "4.40.0",
- "@rollup/rollup-linux-s390x-gnu": "4.40.0",
- "@rollup/rollup-linux-x64-gnu": "4.40.0",
- "@rollup/rollup-linux-x64-musl": "4.40.0",
- "@rollup/rollup-win32-arm64-msvc": "4.40.0",
- "@rollup/rollup-win32-ia32-msvc": "4.40.0",
- "@rollup/rollup-win32-x64-msvc": "4.40.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==",
- "dev": true,
- "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.26.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
- "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
- "license": "MIT"
- },
- "node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/set-cookie-parser": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz",
- "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==",
- "license": "MIT"
- },
- "node_modules/shallowequal": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
- "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==",
- "license": "MIT"
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/slick-carousel": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz",
- "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==",
- "license": "MIT",
- "peerDependencies": {
- "jquery": ">=1.8.0"
- }
- },
- "node_modules/source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
- "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/string-convert": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
- "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==",
- "license": "MIT"
- },
- "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/styled-components": {
- "version": "6.1.17",
- "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.17.tgz",
- "integrity": "sha512-97D7DwWanI7nN24v0D4SvbfjLE9656umNSJZkBkDIWL37aZqG/wRQ+Y9pWtXyBIM/NSfcBzHLErEsqHmJNSVUg==",
- "license": "MIT",
- "dependencies": {
- "@emotion/is-prop-valid": "1.2.2",
- "@emotion/unitless": "0.8.1",
- "@types/stylis": "4.2.5",
- "css-to-react-native": "3.2.0",
- "csstype": "3.1.3",
- "postcss": "8.4.49",
- "shallowequal": "1.1.0",
- "stylis": "4.3.2",
- "tslib": "2.6.2"
- },
- "engines": {
- "node": ">= 16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/styled-components"
- },
- "peerDependencies": {
- "react": ">= 16.8.0",
- "react-dom": ">= 16.8.0"
- }
- },
- "node_modules/styled-components/node_modules/@emotion/is-prop-valid": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz",
- "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==",
- "license": "MIT",
- "dependencies": {
- "@emotion/memoize": "^0.8.1"
- }
- },
- "node_modules/styled-components/node_modules/@emotion/memoize": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
- "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==",
- "license": "MIT"
- },
- "node_modules/styled-components/node_modules/@emotion/unitless": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
- "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==",
- "license": "MIT"
- },
- "node_modules/styled-components/node_modules/postcss": {
- "version": "8.4.49",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
- "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
- "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.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/styled-components/node_modules/stylis": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz",
- "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==",
- "license": "MIT"
- },
- "node_modules/styled-components/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
- "license": "0BSD"
- },
- "node_modules/stylis": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
- "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==",
- "license": "MIT"
- },
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/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==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/ts-api-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
- "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18.12"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4"
- }
- },
- "node_modules/tslib": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "license": "0BSD"
- },
- "node_modules/turbo-stream": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz",
- "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==",
- "license": "ISC"
- },
- "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.7.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
- "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
- "dev": true,
- "license": "Apache-2.0",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/typescript-eslint": {
- "version": "8.29.1",
- "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.29.1.tgz",
- "integrity": "sha512-f8cDkvndhbQMPcysk6CUSGBWV+g1utqdn71P5YKwMumVMOG/5k7cHq0KyG4O52nB0oKS4aN2Tp5+wB4APJGC+w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/eslint-plugin": "8.29.1",
- "@typescript-eslint/parser": "8.29.1",
- "@typescript-eslint/utils": "8.29.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
- }
- },
- "node_modules/update-browserslist-db": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
- "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "escalade": "^3.2.0",
- "picocolors": "^1.1.1"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/vite": {
- "version": "6.2.6",
- "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz",
- "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "esbuild": "^0.25.0",
- "postcss": "^8.5.3",
- "rollup": "^4.30.1"
- },
- "bin": {
- "vite": "bin/vite.js"
- },
- "engines": {
- "node": "^18.0.0 || ^20.0.0 || >=22.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 || >=22.0.0",
- "jiti": ">=1.21.0",
- "less": "*",
- "lightningcss": "^1.21.0",
- "sass": "*",
- "sass-embedded": "*",
- "stylus": "*",
- "sugarss": "*",
- "terser": "^5.16.0",
- "tsx": "^4.8.1",
- "yaml": "^2.4.2"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "jiti": {
- "optional": true
- },
- "less": {
- "optional": true
- },
- "lightningcss": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "sass-embedded": {
- "optional": true
- },
- "stylus": {
- "optional": true
- },
- "sugarss": {
- "optional": true
- },
- "terser": {
- "optional": true
- },
- "tsx": {
- "optional": true
- },
- "yaml": {
- "optional": true
- }
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/word-wrap": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
- "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/yaml": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz",
- "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==",
- "dev": true,
- "license": "ISC",
- "optional": true,
- "peer": true,
- "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"
- }
- }
- }
-}
diff --git a/LandingPage/package.json b/LandingPage/package.json
deleted file mode 100644
index 558bc8e..0000000
--- a/LandingPage/package.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "name": "inpactai",
- "private": true,
- "version": "0.0.0",
- "type": "module",
- "scripts": {
- "dev": "vite",
- "build": "tsc -b && vite build",
- "lint": "eslint .",
- "preview": "vite preview"
- },
- "dependencies": {
- "@emotion/react": "^11.14.0",
- "@emotion/styled": "^11.14.0",
- "@mui/material": "^7.0.2",
- "clsx": "^2.1.1",
- "framer-motion": "^12.6.5",
- "gsap": "^3.12.7",
- "lucide-react": "^0.487.0",
- "ogl": "^1.0.11",
- "react": "^19.0.0",
- "react-dom": "^19.0.0",
- "react-router-dom": "^7.5.0",
- "react-slick": "^0.30.3",
- "react-social-icons": "^6.24.0",
- "slick-carousel": "^1.8.1",
- "styled-components": "^6.1.17"
- },
- "devDependencies": {
- "@eslint/js": "^9.21.0",
- "@types/react": "^19.0.10",
- "@types/react-dom": "^19.0.4",
- "@vitejs/plugin-react": "^4.3.4",
- "eslint": "^9.21.0",
- "eslint-plugin-react-hooks": "^5.1.0",
- "eslint-plugin-react-refresh": "^0.4.19",
- "globals": "^15.15.0",
- "typescript": "~5.7.2",
- "typescript-eslint": "^8.24.1",
- "vite": "^6.2.0"
- }
-}
diff --git a/LandingPage/public/aossie_logo.png b/LandingPage/public/aossie_logo.png
deleted file mode 100644
index b2421da..0000000
Binary files a/LandingPage/public/aossie_logo.png and /dev/null differ
diff --git a/LandingPage/public/vite.svg b/LandingPage/public/vite.svg
deleted file mode 100644
index e7b8dfb..0000000
--- a/LandingPage/public/vite.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/LandingPage/src/App.css b/LandingPage/src/App.css
deleted file mode 100644
index 59983a1..0000000
--- a/LandingPage/src/App.css
+++ /dev/null
@@ -1,60 +0,0 @@
-#root {
- max-width: 1280px;
- margin: 0 auto;
- padding: 2rem;
- text-align: center;
-}
-
-.logo {
- height: 6em;
- padding: 1.5em;
- will-change: filter;
- transition: filter 300ms;
-}
-.logo:hover {
- filter: drop-shadow(0 0 2em #646cffaa);
-}
-.logo.react:hover {
- filter: drop-shadow(0 0 2em #61dafbaa);
-}
-
-@keyframes logo-spin {
- from {
- transform: rotate(0deg);
- }
- to {
- transform: rotate(360deg);
- }
-}
-
-@media (prefers-reduced-motion: no-preference) {
- a:nth-of-type(2) .logo {
- animation: logo-spin infinite 20s linear;
- }
-}
-
-.card {
- padding: 2em;
-}
-
-.read-the-docs {
- color: #888;
-}
-/* Applies to WebKit browsers */
-::-webkit-scrollbar {
- width: 8px;
-}
-
-::-webkit-scrollbar-track {
- background: #000000;
- border-radius: 3px;
-}
-
-::-webkit-scrollbar-thumb {
- background: linear-gradient(to bottom, #fc5fff, #764e95); /* Gradient colors */
- border-radius: 3px;
-}
-
-::-webkit-scrollbar-thumb:hover {
- background: linear-gradient(to bottom, #de43e9, #764e95); /* Darker on hover */
-}
diff --git a/LandingPage/src/App.tsx b/LandingPage/src/App.tsx
deleted file mode 100644
index 3ac0eab..0000000
--- a/LandingPage/src/App.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import { BrowserRouter, Routes, Route } from 'react-router-dom';
-// import Lenis from '@studio-freight/lenis';
-import Landing from '../src/Pages/Landing';
-import PrivacyPolicy from './Pages/Privacy';
-import TermsOfService from './Pages/Legal';
-
-function App() {
- // useEffect(() => {
- // const lenis = new Lenis({
- // duration: 1.2,
- // easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),
- // smoothWheel: true,
- // });
-
- // function raf(time: number) {
- // lenis.raf(time);
- // requestAnimationFrame(raf);
- // }
-
- // requestAnimationFrame(raf);
- // }, []);
-
- return (
-
-
- } />
- } />
- } />
- {/* } /> */}
-
- {/* */}
-
- );
-}
-
-export default App;
\ No newline at end of file
diff --git a/LandingPage/src/Pages/Landing.tsx b/LandingPage/src/Pages/Landing.tsx
deleted file mode 100644
index 90f25ac..0000000
--- a/LandingPage/src/Pages/Landing.tsx
+++ /dev/null
@@ -1,186 +0,0 @@
-import { motion } from 'framer-motion';
-import { Sparkles, Users } from 'lucide-react';
-import { DollarSign, FileText, BarChart2, RefreshCw } from 'lucide-react';
-import ChatbotSidebarForm from '../components/form';
-import Footer from '../components/Footer';
-import Threads from '../components/bg';
-import SpotlightCard from '../components/card';
-import Header from '../components/Header';
-import HowItWorks from '../components/howitworks';
-import Integrations from '../components/integration';
-
-
-function Landing() {
- const headingWords = ['Creator', 'Collaboration', 'Hub'];
-
- const containerVariants = {
- hidden: { opacity: 0 },
- show: {
- opacity: 1,
- transition: {
- staggerChildren: 0.2,
- },
- },
- };
-
- const wordVariants = {
- hidden: { opacity: 0, y: 30 },
- show: { opacity: 1, y: 0 },
- };
- return (
-
-
- {/* Hero Section */}
-
-
-
- Powered by AOSSIE
-
-
-
-
-
-
-
-
- {headingWords.map((word, index) => (
-
- {word}
-
- ))}
-
-
-
-
- The future of creator collaboration is coming.
- Join the waitlist to be the first to experience
- the revolution in influencer marketing .
-
-
-
- {/* Features */}
-
-
- Features
-
-
-
-
-
- {[
- {
- icon:
,
- title: "AI-Driven Sponsorship Matchmaking",
- description:
- "Automatically connects creators with brands based on audience demographics, engagement rates, and content style.",
- },
- {
- icon:
,
- title: "AI-Powered Creator Collaboration Hub",
- description:
- "Facilitates partnerships between creators with complementary audiences and content niches.",
- },
- {
- icon:
,
- title: "AI-Based Pricing & Deal Optimization",
- description:
- "Provides fair sponsorship pricing recommendations based on engagement, market trends, and historical data.",
- },
- {
- icon:
,
- title: "AI-Powered Negotiation & Contract Assistant",
- description:
- "Assists in structuring deals, generating contracts, and optimizing terms using AI insights.",
- },
- {
- icon:
,
- title: "Performance Analytics & ROI Tracking",
- description:
- "Enables brands and creators to track sponsorship performance, audience engagement, and campaign success.",
- },
- {
- icon:
,
- title: "Real-Time Campaign Feedback Loop",
- description:
- "Gathers continuous feedback on campaigns to adapt and improve collaboration effectiveness over time.",
- },
- ].map((feature, index) => (
-
- {feature.icon}
- {feature.title}
- {feature.description}
-
- ))}
-
-
- {/* How It Works Section */}
-
-
-
-
-
- {/* Waitlist Form Section */}
-
-
-
- Be a Part of the Revolution
-
-
-
- Join our waitlist to be the first to experience how InpactAI is transforming the way brands and creators collaborate.
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-export default Landing;
diff --git a/LandingPage/src/Pages/Legal.tsx b/LandingPage/src/Pages/Legal.tsx
deleted file mode 100644
index f533279..0000000
--- a/LandingPage/src/Pages/Legal.tsx
+++ /dev/null
@@ -1,105 +0,0 @@
-import React, { useEffect } from 'react';
-import Navbar from '../components/Header';
-import Footer from '../components/Footer';
-import { motion } from 'framer-motion';
-
-const TermsOfService: React.FC = () => {
- useEffect(() => {
- window.scrollTo(0, 0);
- document.title = "Terms of Service | inpactAI";
- }, []);
-
- return (
-
-
-
-
-
- Terms of Service
-
-
-
Last updated: April 14, 2025
-
-
- Introduction
-
- Welcome to inpactAI. These Terms of Service ("Terms") govern your use of our platform and services. By accessing or using inpactAI, you agree to be bound by these Terms.
-
-
-
-
- Use of the Platform
- You agree to use the platform in compliance with all applicable laws and regulations. You must not misuse our platform or attempt to access it using a method other than the interface we provide.
-
-
-
- Account Registration
- To access certain features, you may be required to create an account. You are responsible for safeguarding your account credentials and for any activities or actions under your account.
-
-
-
- User Content
- You retain ownership of the content you submit to the platform, but you grant inpactAI a worldwide, royalty-free license to use, display, and distribute that content as needed to provide services.
-
-
-
- Prohibited Activities
- You agree not to engage in any of the following:
-
- Reverse engineering or decompiling any part of the platform
- Using the platform for unlawful or harmful purposes
- Infringing on the intellectual property rights of others
- Disrupting the functionality or security of the platform
-
-
-
-
- Termination
-
- We may suspend or terminate your access if you violate these Terms. Upon termination, your right to use the platform ceases immediately.
-
-
-
-
- Disclaimers
-
- The platform is provided "as is" without warranties of any kind. We do not guarantee that the platform will be uninterrupted, secure, or error-free.
-
-
-
-
- Limitation of Liability
-
- To the fullest extent permitted by law, inpactAI shall not be liable for any indirect, incidental, special, or consequential damages resulting from your use of the platform.
-
-
-
-
- Changes to These Terms
-
- We may modify these Terms at any time. If we do, we will notify you via the platform or by email. Continued use of the platform after changes means you accept the new Terms.
-
-
-
-
- Contact Us
-
- If you have any questions about these Terms, contact us at:
-
- Email: aossie.oss@gmail.com
-
-
-
-
-
-
-
-
- );
-};
-
-export default TermsOfService;
\ No newline at end of file
diff --git a/LandingPage/src/Pages/Privacy.tsx b/LandingPage/src/Pages/Privacy.tsx
deleted file mode 100644
index 4705e21..0000000
--- a/LandingPage/src/Pages/Privacy.tsx
+++ /dev/null
@@ -1,132 +0,0 @@
-import React, { useEffect } from 'react';
-import Navbar from '../components/Header';
-import Footer from '../components/Footer';
-import { motion } from 'framer-motion';
-
-const PrivacyPolicy: React.FC = () => {
- useEffect(() => {
- window.scrollTo(0, 0);
- document.title = "Privacy Policy | inpactAI";
- }, []);
-
- return (
-
-
-
-
-
- Privacy Policy
-
-
-
Last updated: April 14, 2025
-
-
- Introduction
-
- At inpactAI, we respect your privacy and are committed to protecting your personal data. This Privacy
- Policy explains how we collect, use, disclose, and safeguard your information when you use our service.
-
-
-
-
- Information We Collect
- When you use inpactAI, we may collect the following types of information:
-
-
- Personal Information: Name, email address, and organization details provided
- during signup or when joining our waitlist.
-
-
- Platform Data: If you connect inpactAI with platforms like Instagram, TikTok, or LinkedIn,
- we may collect information necessary to offer creator-brand matching services, such as follower data,
- audience engagement, and content performance metrics.
-
-
- Usage Information: Data about how you interact with our platform, including features used,
- actions taken, and time spent on the platform.
-
-
-
-
-
- How We Use Your Information
- We use the collected information for various purposes, including:
-
- Providing and maintaining our AI-powered platform
- Improving creator-brand matching accuracy
- Personalizing your dashboard and analytics
- Communicating with you about updates, matches, and insights
- Ensuring data integrity and platform security
-
-
-
-
- Data Sharing and Disclosure
-
- We do not sell your personal information. We may share data in the following circumstances:
-
-
- With service providers helping us run the platform (e.g., analytics, hosting)
- To comply with legal obligations or respond to lawful requests
- With your consent or to fulfill specific actions at your direction
- In connection with business restructuring, mergers, or acquisitions
-
-
-
-
- Data Security
-
- We apply industry-standard security practices to protect your data, including encryption, access controls,
- and regular security reviews. However, no digital system is completely secure, and we encourage
- you to practice responsible data handling on your end as well.
-
-
-
-
- Your Rights
-
- Depending on your location, you may have certain rights related to your personal information:
-
-
- Access or request a copy of your personal data
- Request correction of any inaccurate or incomplete data
- Request deletion of your personal data
- Restrict processing or object to data usage
- Request data portability
-
-
- To exercise your rights, contact us at privacy@inpact.ai.
-
-
-
-
- Changes to This Policy
-
- We may update this Privacy Policy occasionally to reflect changes in law or our practices.
- If significant changes are made, we will notify you on the platform or via email.
- Please review this policy periodically to stay informed.
-
-
-
-
- Contact Us
-
- If you have any questions about this Privacy Policy, feel free to reach out:
-
- Email: aossie.oss@gmail.com
-
-
-
-
-
-
-
-
- );
-};
-
-export default PrivacyPolicy;
diff --git a/LandingPage/src/assets/react.svg b/LandingPage/src/assets/react.svg
deleted file mode 100644
index 6c87de9..0000000
--- a/LandingPage/src/assets/react.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/LandingPage/src/components/Footer.tsx b/LandingPage/src/components/Footer.tsx
deleted file mode 100644
index bbe3cf6..0000000
--- a/LandingPage/src/components/Footer.tsx
+++ /dev/null
@@ -1,75 +0,0 @@
-import { Box, Typography, Link, Divider, Grid, Stack } from '@mui/material';
-
-const Footer = () => {
- const linkStyle = {
- color: 'rgba(255, 255, 255, 0.8)',
- textDecoration: 'none',
- fontSize: '0.95rem',
- '&:hover': {
- color: '#8B5CF6',
- },
- };
-
- return (
-
- {/* Top Section */}
-
-
-
- InpactAI
-
-
- Empowering brands to make smarter creator decisions through AI-powered insights and integrations.
-
-
-
-
-
- Explore
-
-
- Home
- About
- Contact
-
-
-
-
-
- Legal & Code
-
-
-
- GitHub
-
- Terms of Use
- Privacy Policy
-
-
-
-
- {/* Divider */}
-
-
- {/* Bottom Section */}
-
- © {new Date().getFullYear()} InpactAI. All rights reserved.
-
-
- );
-};
-
-export default Footer;
diff --git a/LandingPage/src/components/Header.tsx b/LandingPage/src/components/Header.tsx
deleted file mode 100644
index 4616b47..0000000
--- a/LandingPage/src/components/Header.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { motion } from 'framer-motion';
-import Github from './github';
-
-const Header = () => {
- return (
-
-
-
-
- InpactAI
-
-
-
-
-
-
-
- );
-};
-
-export default Header;
diff --git a/LandingPage/src/components/bg.tsx b/LandingPage/src/components/bg.tsx
deleted file mode 100644
index d69b642..0000000
--- a/LandingPage/src/components/bg.tsx
+++ /dev/null
@@ -1,235 +0,0 @@
-import React, { useEffect, useRef } from "react";
-import { Renderer, Program, Mesh, Triangle, Color } from "ogl";
-
-interface ThreadsProps {
- color?: [number, number, number];
- amplitude?: number;
- distance?: number;
- enableMouseInteraction?: boolean;
-}
-
-const vertexShader = `
-attribute vec2 position;
-attribute vec2 uv;
-varying vec2 vUv;
-void main() {
- vUv = uv;
- gl_Position = vec4(position, 0.0, 1.0);
-}
-`;
-
-const fragmentShader = `
-precision highp float;
-
-uniform float iTime;
-uniform vec3 iResolution;
-uniform vec3 uColor;
-uniform float uAmplitude;
-uniform float uDistance;
-uniform vec2 uMouse;
-
-#define PI 3.1415926538
-
-const int u_line_count = 40;
-const float u_line_width = 7.0;
-const float u_line_blur = 10.0;
-
-float Perlin2D(vec2 P) {
- vec2 Pi = floor(P);
- vec4 Pf_Pfmin1 = P.xyxy - vec4(Pi, Pi + 1.0);
- vec4 Pt = vec4(Pi.xy, Pi.xy + 1.0);
- Pt = Pt - floor(Pt * (1.0 / 71.0)) * 71.0;
- Pt += vec2(26.0, 161.0).xyxy;
- Pt *= Pt;
- Pt = Pt.xzxz * Pt.yyww;
- vec4 hash_x = fract(Pt * (1.0 / 951.135664));
- vec4 hash_y = fract(Pt * (1.0 / 642.949883));
- vec4 grad_x = hash_x - 0.49999;
- vec4 grad_y = hash_y - 0.49999;
- vec4 grad_results = inversesqrt(grad_x * grad_x + grad_y * grad_y)
- * (grad_x * Pf_Pfmin1.xzxz + grad_y * Pf_Pfmin1.yyww);
- grad_results *= 1.4142135623730950;
- vec2 blend = Pf_Pfmin1.xy * Pf_Pfmin1.xy * Pf_Pfmin1.xy
- * (Pf_Pfmin1.xy * (Pf_Pfmin1.xy * 6.0 - 15.0) + 10.0);
- vec4 blend2 = vec4(blend, vec2(1.0 - blend));
- return dot(grad_results, blend2.zxzx * blend2.wwyy);
-}
-
-float pixel(float count, vec2 resolution) {
- return (1.0 / max(resolution.x, resolution.y)) * count;
-}
-
-float lineFn(vec2 st, float width, float perc, float offset, vec2 mouse, float time, float amplitude, float distance) {
- float split_offset = (perc * 0.4);
- float split_point = 0.1 + split_offset;
-
- float amplitude_normal = smoothstep(split_point, 0.7, st.x);
- float amplitude_strength = 0.5;
- float finalAmplitude = amplitude_normal * amplitude_strength
- * amplitude * (1.0 + (mouse.y - 0.5) * 0.2);
-
- float time_scaled = time / 10.0 + (mouse.x - 0.5) * 1.0;
- float blur = smoothstep(split_point, split_point + 0.05, st.x) * perc;
-
- float xnoise = mix(
- Perlin2D(vec2(time_scaled, st.x + perc) * 2.5),
- Perlin2D(vec2(time_scaled, st.x + time_scaled) * 3.5) / 1.5,
- st.x * 0.3
- );
-
- float y = 0.5 + (perc - 0.5) * distance + xnoise / 2.0 * finalAmplitude;
-
- float line_start = smoothstep(
- y + (width / 2.0) + (u_line_blur * pixel(1.0, iResolution.xy) * blur),
- y,
- st.y
- );
-
- float line_end = smoothstep(
- y,
- y - (width / 2.0) - (u_line_blur * pixel(1.0, iResolution.xy) * blur),
- st.y
- );
-
- return clamp(
- (line_start - line_end) * (1.0 - smoothstep(0.0, 1.0, pow(perc, 0.3))),
- 0.0,
- 1.0
- );
-}
-
-void mainImage(out vec4 fragColor, in vec2 fragCoord) {
- vec2 uv = fragCoord / iResolution.xy;
-
- float line_strength = 1.0;
- for (int i = 0; i < u_line_count; i++) {
- float p = float(i) / float(u_line_count);
- line_strength *= (1.0 - lineFn(
- uv,
- u_line_width * pixel(1.0, iResolution.xy) * (1.0 - p),
- p,
- (PI * 1.0) * p,
- uMouse,
- iTime,
- uAmplitude,
- uDistance
- ));
- }
-
- float colorVal = 1.0 - line_strength;
- fragColor = vec4(uColor * colorVal, colorVal);
-}
-
-void main() {
- mainImage(gl_FragColor, gl_FragCoord.xy);
-}
-`;
-
-const Threads: React.FC = ({
- color = [1, 1, 1],
- amplitude = 1,
- distance = 0,
- enableMouseInteraction = false,
- ...rest
-}) => {
- const containerRef = useRef(null);
- const animationFrameId = useRef(null);
-
- useEffect(() => {
- if (!containerRef.current) return;
- const container = containerRef.current;
-
- const renderer = new Renderer({ alpha: true });
- const gl = renderer.gl;
- gl.clearColor(0, 0, 0, 0);
- gl.enable(gl.BLEND);
- gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
- container.appendChild(gl.canvas);
-
- const geometry = new Triangle(gl);
- const program = new Program(gl, {
- vertex: vertexShader,
- fragment: fragmentShader,
- uniforms: {
- iTime: { value: 0 },
- iResolution: {
- value: new Color(
- gl.canvas.width,
- gl.canvas.height,
- gl.canvas.width / gl.canvas.height
- ),
- },
- uColor: { value: new Color(...color) },
- uAmplitude: { value: amplitude },
- uDistance: { value: distance },
- uMouse: { value: new Float32Array([0.5, 0.5]) },
- },
- });
-
- const mesh = new Mesh(gl, { geometry, program });
-
- function resize() {
- const { clientWidth, clientHeight } = container;
- renderer.setSize(clientWidth, clientHeight);
- program.uniforms.iResolution.value.r = clientWidth;
- program.uniforms.iResolution.value.g = clientHeight;
- program.uniforms.iResolution.value.b = clientWidth / clientHeight;
- }
- window.addEventListener("resize", resize);
- resize();
-
- let currentMouse = [0.5, 0.5];
- let targetMouse = [0.5, 0.5];
-
- function handleMouseMove(e: MouseEvent) {
- const rect = container.getBoundingClientRect();
- const x = (e.clientX - rect.left) / rect.width;
- const y = 1.0 - (e.clientY - rect.top) / rect.height;
- targetMouse = [x, y];
- }
- function handleMouseLeave() {
- targetMouse = [0.5, 0.5];
- }
- if (enableMouseInteraction) {
- container.addEventListener("mousemove", handleMouseMove);
- container.addEventListener("mouseleave", handleMouseLeave);
- }
-
- function update(t: number) {
- if (enableMouseInteraction) {
- const smoothing = 0.05;
- currentMouse[0] += smoothing * (targetMouse[0] - currentMouse[0]);
- currentMouse[1] += smoothing * (targetMouse[1] - currentMouse[1]);
- program.uniforms.uMouse.value[0] = currentMouse[0];
- program.uniforms.uMouse.value[1] = currentMouse[1];
- } else {
- program.uniforms.uMouse.value[0] = 0.5;
- program.uniforms.uMouse.value[1] = 0.5;
- }
- program.uniforms.iTime.value = t * 0.001;
-
- renderer.render({ scene: mesh });
- animationFrameId.current = requestAnimationFrame(update);
- }
- animationFrameId.current = requestAnimationFrame(update);
-
- return () => {
- if (animationFrameId.current)
- cancelAnimationFrame(animationFrameId.current);
- window.removeEventListener("resize", resize);
-
- if (enableMouseInteraction) {
- container.removeEventListener("mousemove", handleMouseMove);
- container.removeEventListener("mouseleave", handleMouseLeave);
- }
- if (container.contains(gl.canvas)) container.removeChild(gl.canvas);
- gl.getExtension("WEBGL_lose_context")?.loseContext();
- };
- }, [color, amplitude, distance, enableMouseInteraction]);
-
- return (
-
- );
-};
-
-export default Threads;
diff --git a/LandingPage/src/components/card.tsx b/LandingPage/src/components/card.tsx
deleted file mode 100644
index 092fe6a..0000000
--- a/LandingPage/src/components/card.tsx
+++ /dev/null
@@ -1,70 +0,0 @@
-import React, { useRef, useState } from "react";
-
-interface Position {
- x: number;
- y: number;
-}
-
-interface SpotlightCardProps extends React.PropsWithChildren {
- className?: string;
- spotlightColor?: `rgba(${number}, ${number}, ${number}, ${number})`;
-}
-
-const SpotlightCard: React.FC = ({
- children,
- className = "",
- spotlightColor = "rgba(255, 255, 255, 0.25)"
-}) => {
- const divRef = useRef(null);
- const [isFocused, setIsFocused] = useState(false);
- const [position, setPosition] = useState({ x: 0, y: 0 });
- const [opacity, setOpacity] = useState(0);
-
- const handleMouseMove: React.MouseEventHandler = (e) => {
- if (!divRef.current || isFocused) return;
-
- const rect = divRef.current.getBoundingClientRect();
- setPosition({ x: e.clientX - rect.left, y: e.clientY - rect.top });
- };
-
- const handleFocus = () => {
- setIsFocused(true);
- setOpacity(0.6);
- };
-
- const handleBlur = () => {
- setIsFocused(false);
- setOpacity(0);
- };
-
- const handleMouseEnter = () => {
- setOpacity(0.6);
- };
-
- const handleMouseLeave = () => {
- setOpacity(0);
- };
-
- return (
-
- );
-};
-
-export default SpotlightCard;
\ No newline at end of file
diff --git a/LandingPage/src/components/carousel.tsx b/LandingPage/src/components/carousel.tsx
deleted file mode 100644
index e69de29..0000000
diff --git a/LandingPage/src/components/form.tsx b/LandingPage/src/components/form.tsx
deleted file mode 100644
index 16007d9..0000000
--- a/LandingPage/src/components/form.tsx
+++ /dev/null
@@ -1,221 +0,0 @@
-import { useState } from 'react';
-import { Drawer, Button, TextField } from '@mui/material';
-import { motion } from 'framer-motion';
-import SendButton from "../components/sendbutton";
-import WatchlistButton from "../components/watchlist";
-
-const chatbotSteps = {
- initial: {
- question: 'Are you a Brand or a Creator?',
- options: ['Brand', 'Creator'],
- },
- Brand: [
- { question: 'What is your brand name?', type: 'text', key: 'brandName' },
- { question: 'What industry are you in?', type: 'text', key: 'industry' },
- { question: 'What is your monthly ad budget?', type: 'text', key: 'budget' },
- { question: 'Do you work with influencers already?', type: 'text', key: 'influencerExperience' },
- { question: 'What platforms do you use for advertising?', type: 'text', key: 'adPlatforms' },
- { question: 'What is your target audience?', type: 'text', key: 'targetAudience' },
- { question: 'Do you have a campaign in mind already?', type: 'text', key: 'campaignDetails' },
- ],
- Creator: [
- { question: 'What is your name?', type: 'text', key: 'creatorName' },
- { question: 'What is your email?', type: 'text', key: 'email' },
- { question: 'What is your phone number?', type: 'text', key: 'phone' },
- { question: 'Which platform do you use the most?', type: 'text', key: 'platform' },
- { question: 'Provide your social media handle', type: 'text', key: 'socialMedia' },
- { question: 'How many subscribers do you have?', type: 'text', key: 'subscribers' },
- { question: 'How many followers do you have?', type: 'text', key: 'followers' },
- { question: 'What’s your niche or content type?', type: 'text', key: 'niche' },
- { question: 'Are you open to exclusive brand deals?', type: 'text', key: 'exclusiveDeals' },
- { question: 'Do you have a portfolio?', type: 'text', key: 'portfolio' },
- ],
-};
-
-
-export default function ChatbotSidebarForm() {
- const [open, setOpen] = useState(false);
- const [chat, setChat] = useState([{ from: 'bot', text: chatbotSteps.initial.question }]);
- const [stepIndex, setStepIndex] = useState(0);
- const [path, setPath] = useState(null);
- const [formData, setFormData] = useState<{ [key: string]: string }>({});
- const [userInput, setUserInput] = useState('');
- const [completed, setCompleted] = useState(false);
-
- const FORM_ID = '';
- const formUrl = `https://docs.google.com/forms/d/e/${FORM_ID}/formResponse`;
-
-
- const submitToGoogleForm = async () => {
-
- const formBody = new URLSearchParams();
- formBody.append('entry.1234567890', formData.brandName || formData.creatorName);
- formBody.append('entry.2345678901', formData.industry);
- formBody.append('entry.3456789012', formData.budget);
- formBody.append('entry.4567890123', formData.influencerExperience);
- formBody.append('entry.5678901234', formData.adPlatforms);
- formBody.append('entry.6789012345', formData.targetAudience);
- formBody.append('entry.7890123456', formData.campaignDetails);
- formBody.append('entry.8901234567', formData.creatorName);
- formBody.append('entry.9012345678', formData.email);
- formBody.append('entry.0123456789', formData.phone);
- formBody.append('entry.1234567890', formData.platform);
- formBody.append('entry.2345678901', formData.socialMedia);
- formBody.append('entry.3456789012', formData.subscribers);
- formBody.append('entry.4567890123', formData.followers);
- formBody.append('entry.5678901234', formData.niche);
- formBody.append('entry.6789012345', formData.exclusiveDeals);
- formBody.append('entry.7890123456', formData.portfolio);
-
-
- try {
- await fetch(formUrl, {
- method: 'POST',
- mode: 'no-cors',
- headers: {
- 'Content-Type': 'application/x-www-form-urlencoded',
- },
- body: formBody.toString(),
- });
- console.log("Submitted to Google Form");
- } catch (err) {
- console.error("Failed to submit to Google Form", err);
- }
- };
-
- const handleOptionClick = (option: 'Brand' | 'Creator') => {
- setChat((prev) => [...prev, { from: 'user', text: option }]);
- setPath(option);
- setTimeout(() => {
- setChat((prev) => [
- ...prev,
- { from: 'bot', text: chatbotSteps[option][0].question },
- ]);
- setStepIndex(0);
- }, 500);
- };
-
- const handleNext = () => {
- const currentStep = chatbotSteps[path!][stepIndex];
- if (!userInput) return;
-
- setFormData((prev) => ({ ...prev, [currentStep.key]: userInput }));
- setChat((prev) => [...prev, { from: 'user', text: userInput }]);
- setUserInput('');
-
- if (stepIndex + 1 < chatbotSteps[path!].length) {
- const nextQuestion = chatbotSteps[path!][stepIndex + 1].question;
- setTimeout(() => {
- setChat((prev) => [...prev, { from: 'bot', text: nextQuestion }]);
- }, 500);
- setStepIndex(stepIndex + 1);
- } else {
- setTimeout(() => {
- setChat((prev) => [
- ...prev,
- { from: 'bot', text: 'Thanks for joining the waitlist! 🎉' },
- ]);
- setCompleted(true);
- submitToGoogleForm();
- setTimeout(() => setOpen(false), 2000); // auto close after 2 seconds
- }, 500);
- }
- };
-
- const handleDrawerOpen = () => {
- setOpen(true);
- setChat([{ from: 'bot', text: chatbotSteps.initial.question }]);
- setStepIndex(0);
- setPath(null);
- setFormData({});
- setUserInput('');
- setCompleted(false);
- };
-
- return (
-
-
-
-
-
-
setOpen(false)}>
-
-
- {/* Header */}
-
- 🤖 Automated Chat Form
-
-
- {/* Chat Body */}
-
- {chat.map((msg, idx) => (
-
- {msg.text}
-
- ))}
-
-
- {/* Input Section */}
-
- {!path ? (
-
- {chatbotSteps.initial.options.map((opt) => (
- handleOptionClick(opt as 'Brand' | 'Creator')}
- sx={{
- borderColor: '#8B5CF6',
- color: '#8B5CF6',
- fontWeight: 600,
- '&:hover': {
- backgroundColor: '#8B5CF6',
- color: '#fff',
- },
- }}
- >
- {opt}
-
- ))}
-
- ) : !completed && stepIndex < chatbotSteps[path].length ? (
-
-
setUserInput(e.target.value)}
- disabled={completed}
- placeholder="Type your answer..."
- sx={{
- input: { color: '#000' },
- backgroundColor: 'white',
- borderRadius: '8px',
- }}
- />
-
-
-
-
- ) : null}
-
-
-
-
-
- );
-}
diff --git a/LandingPage/src/components/github.tsx b/LandingPage/src/components/github.tsx
deleted file mode 100644
index a1a33ff..0000000
--- a/LandingPage/src/components/github.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import styled from 'styled-components';
-
-const Github = () => {
- return (
-
-
-
-
-
- Contribute on Github
-
-
- );
-}
-
-const StyledWrapper = styled.div`
- .btn-github {
- cursor: pointer;
- display: flex;
- gap: 0.5rem;
- border: none;
-
- transition: all 0.5s cubic-bezier(0.165, 0.84, 0.44, 1);
- border-radius: 100px;
- font-weight: 800;
- place-content: center;
-
- padding: 0.75rem 1rem;
- font-size: 0.825rem;
- line-height: 1rem;
-
- background-color: rgba(255, 255, 255, 0.19);
- box-shadow:
- inset 0 1px 0 0 rgba(255, 255, 255, 0.04),
- inset 0 0 0 1px rgba(255, 255, 255, 0.04);
- color: #fff;
- }
-
- .btn-github:hover {
- box-shadow:
- inset 0 1px 0 0 rgba(255, 255, 255, 0.08),
- inset 0 0 0 1px rgba(252, 232, 3, 0.08);
- color:rgb(152, 3, 252);
- transform: translate(0, -0.25rem);
- background-color: rgba(0, 0, 0, 0.5);
- }`;
-
-export default Github;
diff --git a/LandingPage/src/components/howitworks.tsx b/LandingPage/src/components/howitworks.tsx
deleted file mode 100644
index 13e4e26..0000000
--- a/LandingPage/src/components/howitworks.tsx
+++ /dev/null
@@ -1,130 +0,0 @@
-import React from 'react';
-import { motion } from 'framer-motion';
-import {
- UserIcon,
- SparklesIcon,
- CreditCardIcon,
- BarChartIcon,
- LayoutDashboardIcon,
- CameraIcon
-
-} from 'lucide-react';
-
-const HowItWorks: React.FC = () => {
-
- const steps = [
- {
- title: "User Onboarding",
- description: "Brands and creators register and choose their roles, preferences, and categories.",
- icon: ,
- color: "from-pink-500 to-purple-500"
- },
- {
- title: "AI-Powered Matching",
- description: "Inpact uses AI to suggest ideal brand-creator collaborations based on past work, niches, and engagement.",
- icon: ,
- color: "from-pink-500 to-purple-500"
- },
- {
- title: "Creator Showcases",
- description: "Creators can highlight their portfolios and previous collaborations, making it easier for brands to evaluate fit.",
- icon: ,
- color: "from-purple-500 to-pink-500"
- },
- {
- title: "Collaboration Dashboard",
- description: "Both parties interact, chat, and collaborate with full task and timeline visibility.",
- icon: ,
- color: "from-purple-500 to-pink-500"
- },
- {
- title: "Smart Contracts & Payments",
- description: "Secure agreements and transactions powered by Stripe or Razorpay integrations.",
- icon: ,
- color: "from-pink-500 to-purple-500"
- },
- {
- title: "Analytics & Feedback",
- description: "Track campaign metrics, gather insights, and iterate smarter with built-in dashboards.",
- icon: ,
- color: "from-pink-500 to-purple-500"
- }
- ];
-
-
-
- return (
-
-
-
-
-
- How InpactAI works
-
-
-
- Inpact uses AI-powered pipelines to bridge the gap between brands and creators—simplifying discovery, onboarding, and collaboration.
-
-
-
-
- {steps.map((step, index) => (
-
-
-
- {step.icon}
-
-
-
{step.title}
-
{step.description}
-
-
-
- {index < steps.length - 1 && (
- <>
-
- {step.title !== "Smart Contracts & Payments" &&
- step.title !== "Analytics & Feedback" &&
- (
-
- )}
-
-
-
- >
- )}
-
- ))}
-
-
-
-
-
-
-
- );
-};
-
-export default HowItWorks;
\ No newline at end of file
diff --git a/LandingPage/src/components/integration.tsx b/LandingPage/src/components/integration.tsx
deleted file mode 100644
index 1155635..0000000
--- a/LandingPage/src/components/integration.tsx
+++ /dev/null
@@ -1,92 +0,0 @@
-import { motion } from 'framer-motion';
-import { SocialIcon } from 'react-social-icons'
-
-export default function Integrations() {
- const integrations = [
- {
- icon: ,
- name: 'Instagram',
- description: 'Fetch creator insights like engagement rate, reach trends, and content breakdown.',
- },
- {
- icon: ,
- name: 'YouTube',
- description: 'Access analytics on video performance, channel growth, and viewer demographics.',
- },
- {
- icon: ,
- name: 'X (formerly Twitter)',
- description: 'Measure influence through tweet engagement, retweet rate, and follower insights.',
- },
- {
- icon: ,
- name: 'LinkedIn',
- description: 'Track professional creator presence and branded thought leadership impact.',
- },
- ];
-
- const container = {
- hidden: { opacity: 0 },
- show: {
- opacity: 1,
- transition: {
- staggerChildren: 0.12,
- delayChildren: 0.2,
- },
- },
- };
-
- const item = {
- hidden: { opacity: 0, y: 24 },
- show: { opacity: 1, y: 0, transition: { duration: 0.4, ease: 'easeOut' } },
- };
-
- return (
-
-
-
-
- Social Integrations
-
-
-
- Inpact connects with major social platforms to analyze creator performance and brand-fit intelligence.
-
-
-
-
- {integrations.map((integration, index) => (
-
-
-
- {integration.icon}
-
-
{integration.name}
-
-
- {integration.description}
-
-
- ))}
-
-
-
- );
-}
diff --git a/LandingPage/src/components/sendbutton.tsx b/LandingPage/src/components/sendbutton.tsx
deleted file mode 100644
index 67019d8..0000000
--- a/LandingPage/src/components/sendbutton.tsx
+++ /dev/null
@@ -1,76 +0,0 @@
-import styled from 'styled-components';
-
-const SendButton = () => {
- return (
-
-
-
- Send
-
-
- );
-}
-
-const StyledWrapper = styled.div`
- button {
- font-family: inherit;
- font-size: 14px;
- background:rgb(101, 0, 135);
- color: white;
- padding: 0.9em 1.2em;
- padding-left: 0.9em;
- display: flex;
- align-items: center;
- border: none;
- border-radius: 16px;
- overflow: hidden;
- transition: all 0.2s;
- cursor: pointer;
- }
-
- button span {
- display: block;
- margin-left: 0.3em;
- transition: all 0.3s ease-in-out;
- }
-
- button svg {
- display: block;
- transform-origin: center center;
- transition: transform 0.3s ease-in-out;
- }
-
- button:hover .svg-wrapper {
- animation: fly-1 0.6s ease-in-out infinite alternate;
- }
-
- button:hover svg {
- transform: translateX(1.2em) rotate(45deg) scale(1.1);
- }
-
- button:hover span {
- transform: translateX(5em);
- }
-
- button:active {
- transform: scale(0.95);
- }
-
- @keyframes fly-1 {
- from {
- transform: translateY(0.1em);
- }
-
- to {
- transform: translateY(-0.1em);
- }
- }`;
-
-export default SendButton;
diff --git a/LandingPage/src/components/watchlist.tsx b/LandingPage/src/components/watchlist.tsx
deleted file mode 100644
index 2e0d9de..0000000
--- a/LandingPage/src/components/watchlist.tsx
+++ /dev/null
@@ -1,74 +0,0 @@
-import styled from 'styled-components';
-
-const WatchlistButton = () => {
- return (
-
-
- Join Watchlist
-
-
-
- );
-}
-
-const StyledWrapper = styled.div`
- .cssbuttons-io-button {
- background:rgb(115, 24, 252);
- color: white;
- font-family: inherit;
- padding: 0.35em;
- padding-left: 1.2em;
- font-size: 17px;
- font-weight: 500;
- border-radius: 0.9em;
- border: none;
- letter-spacing: 0.05em;
- display: flex;
- align-items: center;
- box-shadow: inset 0 0 1.6em -0.6em #714da6;
- overflow: hidden;
- position: relative;
- height: 2.8em;
- padding-right: 3.3em;
- cursor: pointer;
- }
-
- .cssbuttons-io-button .icon {
- background: white;
- margin-left: 1em;
- position: absolute;
- display: flex;
- align-items: center;
- justify-content: center;
- height: 2.2em;
- width: 2.2em;
- border-radius: 0.7em;
- box-shadow: 0.1em 0.1em 0.6em 0.2em #7b52b9;
- right: 0.3em;
- transition: all 0.3s;
- }
-
- .cssbuttons-io-button:hover .icon {
- width: calc(100% - 0.6em);
- }
-
- .cssbuttons-io-button .icon svg {
- width: 1.1em;
- transition: transform 0.3s;
- color: #7b52b9;
- }
-
- .cssbuttons-io-button:hover .icon svg {
- transform: translateX(0.1em);
- }
-
- .cssbuttons-io-button:active .icon {
- transform: scale(0.95);
- }`;
-
-export default WatchlistButton;
diff --git a/LandingPage/src/index.css b/LandingPage/src/index.css
deleted file mode 100644
index ddd5849..0000000
--- a/LandingPage/src/index.css
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Applies to WebKit browsers */
-::-webkit-scrollbar {
- width: 8px;
- }
-
- ::-webkit-scrollbar-track {
- background: #000000;
- border-radius: 3px;
- }
-
- ::-webkit-scrollbar-thumb {
- background: linear-gradient(to bottom, #fc5fff, #764e95); /* Gradient colors */
- border-radius: 3px;
- }
-
- ::-webkit-scrollbar-thumb:hover {
- background: linear-gradient(to bottom, #de43e9, #764e95); /* Darker on hover */
- }
-
\ No newline at end of file
diff --git a/LandingPage/src/main.tsx b/LandingPage/src/main.tsx
deleted file mode 100644
index bef5202..0000000
--- a/LandingPage/src/main.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import { StrictMode } from 'react'
-import { createRoot } from 'react-dom/client'
-import './index.css'
-import App from './App.tsx'
-
-createRoot(document.getElementById('root')!).render(
-
-
- ,
-)
diff --git a/LandingPage/src/vite-env.d.ts b/LandingPage/src/vite-env.d.ts
deleted file mode 100644
index 11f02fe..0000000
--- a/LandingPage/src/vite-env.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///
diff --git a/LandingPage/tsconfig.app.json b/LandingPage/tsconfig.app.json
deleted file mode 100644
index 358ca9b..0000000
--- a/LandingPage/tsconfig.app.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "compilerOptions": {
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
- "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,
- "noUncheckedSideEffectImports": true
- },
- "include": ["src"]
-}
diff --git a/LandingPage/tsconfig.json b/LandingPage/tsconfig.json
deleted file mode 100644
index 1ffef60..0000000
--- a/LandingPage/tsconfig.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "files": [],
- "references": [
- { "path": "./tsconfig.app.json" },
- { "path": "./tsconfig.node.json" }
- ]
-}
diff --git a/LandingPage/tsconfig.node.json b/LandingPage/tsconfig.node.json
deleted file mode 100644
index db0becc..0000000
--- a/LandingPage/tsconfig.node.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "compilerOptions": {
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
- "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,
- "noUncheckedSideEffectImports": true
- },
- "include": ["vite.config.ts"]
-}
diff --git a/LandingPage/vite.config.ts b/LandingPage/vite.config.ts
deleted file mode 100644
index 8b0f57b..0000000
--- a/LandingPage/vite.config.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { defineConfig } from 'vite'
-import react from '@vitejs/plugin-react'
-
-// https://vite.dev/config/
-export default defineConfig({
- plugins: [react()],
-})