From 1aea18c06a4713299030d1f42a825e5794df86d9 Mon Sep 17 00:00:00 2001 From: Arpit Singh Tomar Date: Fri, 10 Jul 2026 00:18:13 +0530 Subject: [PATCH 1/2] feat: trigger notifications from application events --- .gitignore | 17 ++ .vscode/settings.json | 6 +- backend/app/main.py | 45 ++- backend/app/routers/projects.py | 72 +++++ backend/app/schemas/activity.py | 35 +++ backend/app/schemas/application.py | 38 +++ backend/app/schemas/bookmark.py | 13 + backend/app/schemas/builder_flare.py | 43 +++ backend/app/schemas/conversation.py | 30 ++ backend/app/schemas/follower.py | 13 + backend/app/schemas/message.py | 37 +++ backend/app/schemas/notification.py | 35 +++ backend/app/schemas/organization.py | 56 ++++ backend/app/schemas/project.py | 57 ++++ backend/app/schemas/repository.py | 62 +++++ backend/app/schemas/skill.py | 30 ++ backend/app/services/application_service.py | 43 +++ backend/app/services/follower_service.py | 23 ++ backend/app/services/message_service.py | 33 +++ backend/app/services/notification_service.py | 24 ++ backend/app/tests/test_notifications.py | 224 +++++++++++++++ backend/logs/devlink.log | 273 ------------------- 22 files changed, 911 insertions(+), 298 deletions(-) create mode 100644 .gitignore create mode 100644 backend/app/schemas/activity.py create mode 100644 backend/app/schemas/application.py create mode 100644 backend/app/schemas/bookmark.py create mode 100644 backend/app/schemas/builder_flare.py create mode 100644 backend/app/schemas/conversation.py create mode 100644 backend/app/schemas/follower.py create mode 100644 backend/app/schemas/message.py create mode 100644 backend/app/schemas/notification.py create mode 100644 backend/app/schemas/organization.py create mode 100644 backend/app/schemas/project.py create mode 100644 backend/app/schemas/repository.py create mode 100644 backend/app/schemas/skill.py create mode 100644 backend/app/tests/test_notifications.py delete mode 100644 backend/logs/devlink.log diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..d8864781 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.pyc +*.pyo +*.pyd + +# Virtual Environment +backend/venv/ +venv/ + +# Logs +backend/logs/ +*.log + +# OS files +.DS_Store +Thumbs.db diff --git a/.vscode/settings.json b/.vscode/settings.json index e308575a..158c20dd 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,7 @@ { - "DockerRun.DisableDockerrc": true + "DockerRun.DisableDockerrc": true, + "python.defaultInterpreterPath": "${workspaceFolder}/devlink/backend/venv/Scripts/python.exe", + "python.analysis.extraPaths": [ + "${workspaceFolder}/devlink/backend" + ] } \ No newline at end of file diff --git a/backend/app/main.py b/backend/app/main.py index 7142b3a2..04734567 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -12,6 +12,23 @@ from slowapi.middleware import SlowAPIMiddleware from slowapi import _rate_limit_exceeded_handler +from app.routers import ( + activities, + applications, + auth, + bookmarks, + builder_flares, + conversations, + followers, + messages, + notifications, + organizations, + projects, + repositories, + skills, + users, +) + @asynccontextmanager async def lifespan(app: FastAPI): @@ -125,43 +142,23 @@ async def global_exception_handler(request, exc): # API Routers # ------------------------------------------------------------------ -# Uncomment as each router is created. - -from app.routers import auth -from app.routers import users -from app.routers import projects -from app.routers import builders -from app.routers import builder_flare -from app.routers import messages -from app.routers import notifications -from app.routers import ai -from app.routers import followers -from app.routers import bookmarks -from app.routers import activities -from app.routers import notifications -from app.routers import conversations -from app.routers import repositories -from app.routers import organizations -from app.routers import applications -from app.routers import skills -from app.routers import users +# Router inclusions app.include_router(auth.router, prefix="/api/auth", tags=["Authentication"]) app.include_router(users.router, prefix="/api/users", tags=["Users"]) app.include_router(projects.router, prefix="/api/projects", tags=["Projects"]) -app.include_router(builder_flare.router, prefix="/api/flare", tags=["Builder's Flare"]) +app.include_router(builder_flares.router, prefix="/api/flare", tags=["Builder's Flare"]) app.include_router(messages.router, prefix="/api/messages", tags=["Messages"]) app.include_router( notifications.router, prefix="/api/notifications", tags=["Notifications"] ) -app.include_router(ai.router, prefix="/api/ai", tags=["AI"]) +# app.include_router(ai.router, prefix="/api/ai", tags=["AI"]) app.include_router(followers.router) app.include_router(bookmarks.router) app.include_router(activities.router) -app.include_router(notifications.router) app.include_router(conversations.router) app.include_router(repositories.router) app.include_router(organizations.router) app.include_router(applications.router) app.include_router(skills.router) -app.include_router(users.router) + diff --git a/backend/app/routers/projects.py b/backend/app/routers/projects.py index ff6a4f87..a97ff829 100644 --- a/backend/app/routers/projects.py +++ b/backend/app/routers/projects.py @@ -344,3 +344,75 @@ def delete_project( db, project, ) + + +@router.post( + "/{project_id}/invite/{user_id}", + status_code=status.HTTP_201_CREATED, +) +def invite_user( + project_id: uuid.UUID, + user_id: uuid.UUID, + db: Session = Depends(get_db), + current_user: User = Depends(get_current_user), +): + + project = ProjectService.get_project(db, project_id) + if project is None: + raise HTTPException( + status_code=404, + detail="Project not found", + ) + + if project.owner_id != current_user.id: + raise HTTPException( + status_code=403, + detail="Only the project owner can invite members", + ) + + from app.models.project_member import ProjectMember, MemberRole + from sqlalchemy import and_, select + existing_member = db.scalar( + select(ProjectMember).where( + and_( + ProjectMember.project_id == project_id, + ProjectMember.user_id == user_id, + ) + ) + ) + if existing_member: + raise HTTPException( + status_code=400, + detail="User is already invited or a member of the project", + ) + + new_member = ProjectMember( + project_id=project_id, + user_id=user_id, + role=MemberRole.MEMBER, + is_active=False, + ) + db.add(new_member) + db.commit() + db.refresh(new_member) + + from app.models.notification import NotificationType + from app.schemas.notification import NotificationCreate + from app.services.notification_service import NotificationService + + notification_data = NotificationCreate( + recipient_id=user_id, + type=NotificationType.PROJECT_INVITE, + title="Project Invitation", + message=f"You have been invited to join the project '{project.title}'.", + action_url=f"/projects/{project_id}", + project_id=project_id, + ) + NotificationService.create_notification( + db=db, + recipient_id=user_id, + sender_id=current_user.id, + notification=notification_data, + ) + + return {"message": "User invited successfully"} diff --git a/backend/app/schemas/activity.py b/backend/app/schemas/activity.py new file mode 100644 index 00000000..6fc111d1 --- /dev/null +++ b/backend/app/schemas/activity.py @@ -0,0 +1,35 @@ +from __future__ import annotations + +import uuid +from datetime import datetime +from typing import Optional +from pydantic import BaseModel, ConfigDict +from app.models.activity import ActivityType + +class ActivityBase(BaseModel): + activity_type: ActivityType + title: str + description: Optional[str] = None + project_id: Optional[uuid.UUID] = None + organization_id: Optional[uuid.UUID] = None + repository_id: Optional[uuid.UUID] = None + application_id: Optional[uuid.UUID] = None + builder_flare_id: Optional[uuid.UUID] = None + icon: Optional[str] = None + color: Optional[str] = None + +class ActivityCreate(ActivityBase): + actor_id: uuid.UUID + +class ActivityUpdate(BaseModel): + title: Optional[str] = None + description: Optional[str] = None + icon: Optional[str] = None + color: Optional[str] = None + +class ActivityResponse(ActivityBase): + model_config = ConfigDict(from_attributes=True) + + id: uuid.UUID + actor_id: uuid.UUID + created_at: datetime diff --git a/backend/app/schemas/application.py b/backend/app/schemas/application.py new file mode 100644 index 00000000..ef79975b --- /dev/null +++ b/backend/app/schemas/application.py @@ -0,0 +1,38 @@ +from __future__ import annotations + +import uuid +from datetime import datetime +from typing import Optional +from pydantic import BaseModel, ConfigDict +from app.models.application import ApplicationStatus + +class ApplicationBase(BaseModel): + message: Optional[str] = None + portfolio_url: Optional[str] = None + github_url: Optional[str] = None + resume_url: Optional[str] = None + +class ApplicationCreate(ApplicationBase): + pass + +class ApplicationUpdate(BaseModel): + status: Optional[ApplicationStatus] = None + message: Optional[str] = None + portfolio_url: Optional[str] = None + github_url: Optional[str] = None + resume_url: Optional[str] = None + review_notes: Optional[str] = None + shortlisted: Optional[bool] = None + +class ApplicationResponse(ApplicationBase): + model_config = ConfigDict(from_attributes=True) + + id: uuid.UUID + applicant_id: uuid.UUID + project_id: uuid.UUID + flare_id: uuid.UUID + status: ApplicationStatus + review_notes: Optional[str] = None + shortlisted: bool + created_at: datetime + updated_at: datetime diff --git a/backend/app/schemas/bookmark.py b/backend/app/schemas/bookmark.py new file mode 100644 index 00000000..aea14ba4 --- /dev/null +++ b/backend/app/schemas/bookmark.py @@ -0,0 +1,13 @@ +from __future__ import annotations + +import uuid +from datetime import datetime +from pydantic import BaseModel, ConfigDict + +class BookmarkResponse(BaseModel): + model_config = ConfigDict(from_attributes=True) + + id: uuid.UUID + user_id: uuid.UUID + project_id: uuid.UUID + created_at: datetime diff --git a/backend/app/schemas/builder_flare.py b/backend/app/schemas/builder_flare.py new file mode 100644 index 00000000..09697085 --- /dev/null +++ b/backend/app/schemas/builder_flare.py @@ -0,0 +1,43 @@ +from __future__ import annotations + +import uuid +from datetime import datetime +from typing import Optional +from pydantic import BaseModel, ConfigDict +from app.models.builder_flare import FlareStatus + +class BuilderFlareBase(BaseModel): + title: str + description: str + role: str + location: Optional[str] = None + commitment: Optional[str] = None + experience_level: Optional[str] = None + openings: int = 1 + status: FlareStatus = FlareStatus.OPEN + remote: bool = True + +class BuilderFlareCreate(BuilderFlareBase): + project_id: uuid.UUID + +class BuilderFlareUpdate(BaseModel): + title: Optional[str] = None + description: Optional[str] = None + role: Optional[str] = None + location: Optional[str] = None + commitment: Optional[str] = None + experience_level: Optional[str] = None + openings: Optional[int] = None + status: Optional[FlareStatus] = None + remote: Optional[bool] = None + +class BuilderFlareResponse(BuilderFlareBase): + model_config = ConfigDict(from_attributes=True) + + id: uuid.UUID + project_id: uuid.UUID + created_by: uuid.UUID + applicants_count: int + featured: bool + created_at: datetime + updated_at: datetime diff --git a/backend/app/schemas/conversation.py b/backend/app/schemas/conversation.py new file mode 100644 index 00000000..faaec5f0 --- /dev/null +++ b/backend/app/schemas/conversation.py @@ -0,0 +1,30 @@ +from __future__ import annotations + +import uuid +from datetime import datetime +from typing import Optional +from pydantic import BaseModel, ConfigDict +from app.models.conversation import ConversationType + +class ConversationBase(BaseModel): + type: ConversationType = ConversationType.DIRECT + title: Optional[str] = None + project_id: Optional[uuid.UUID] = None + +class ConversationCreate(ConversationBase): + pass + +class ConversationUpdate(BaseModel): + title: Optional[str] = None + is_active: Optional[bool] = None + archived: Optional[bool] = None + +class ConversationResponse(ConversationBase): + model_config = ConfigDict(from_attributes=True) + + id: uuid.UUID + created_by: uuid.UUID + is_active: bool + archived: bool + created_at: datetime + updated_at: datetime diff --git a/backend/app/schemas/follower.py b/backend/app/schemas/follower.py new file mode 100644 index 00000000..4c1eb126 --- /dev/null +++ b/backend/app/schemas/follower.py @@ -0,0 +1,13 @@ +from __future__ import annotations + +import uuid +from datetime import datetime +from pydantic import BaseModel, ConfigDict + +class FollowerResponse(BaseModel): + model_config = ConfigDict(from_attributes=True) + + id: uuid.UUID + follower_id: uuid.UUID + following_id: uuid.UUID + created_at: datetime diff --git a/backend/app/schemas/message.py b/backend/app/schemas/message.py new file mode 100644 index 00000000..a047a262 --- /dev/null +++ b/backend/app/schemas/message.py @@ -0,0 +1,37 @@ +from __future__ import annotations + +import uuid +from datetime import datetime +from typing import Optional +from pydantic import BaseModel, ConfigDict +from app.models.message import MessageType + +class MessageBase(BaseModel): + content: str + type: MessageType = MessageType.TEXT + parent_message_id: Optional[uuid.UUID] = None + attachment_url: Optional[str] = None + attachment_name: Optional[str] = None + attachment_size: Optional[int] = None + mime_type: Optional[str] = None + +class MessageCreate(MessageBase): + pass + +class MessageUpdate(BaseModel): + content: Optional[str] = None + is_edited: Optional[bool] = None + is_deleted: Optional[bool] = None + +class MessageResponse(MessageBase): + model_config = ConfigDict(from_attributes=True) + + id: uuid.UUID + conversation_id: uuid.UUID + sender_id: uuid.UUID + is_edited: bool + is_deleted: bool + created_at: datetime + updated_at: datetime + edited_at: Optional[datetime] = None + deleted_at: Optional[datetime] = None diff --git a/backend/app/schemas/notification.py b/backend/app/schemas/notification.py new file mode 100644 index 00000000..65d162db --- /dev/null +++ b/backend/app/schemas/notification.py @@ -0,0 +1,35 @@ +from __future__ import annotations + +import uuid +from datetime import datetime +from typing import Optional +from pydantic import BaseModel, ConfigDict +from app.models.notification import NotificationType + +class NotificationBase(BaseModel): + recipient_id: uuid.UUID + type: NotificationType + title: str + message: str + action_url: Optional[str] = None + image_url: Optional[str] = None + project_id: Optional[uuid.UUID] = None + conversation_id: Optional[uuid.UUID] = None + message_id: Optional[uuid.UUID] = None + application_id: Optional[uuid.UUID] = None + +class NotificationCreate(NotificationBase): + pass + +class NotificationUpdate(BaseModel): + is_read: Optional[bool] = None + +class NotificationResponse(NotificationBase): + model_config = ConfigDict(from_attributes=True) + + id: uuid.UUID + sender_id: Optional[uuid.UUID] = None + is_read: bool + read_at: Optional[datetime] = None + created_at: datetime + updated_at: datetime diff --git a/backend/app/schemas/organization.py b/backend/app/schemas/organization.py new file mode 100644 index 00000000..2209e03f --- /dev/null +++ b/backend/app/schemas/organization.py @@ -0,0 +1,56 @@ +from __future__ import annotations + +import uuid +from datetime import datetime +from typing import Optional +from pydantic import BaseModel, ConfigDict +from app.models.organization import OrganizationType + +class OrganizationBase(BaseModel): + name: str + slug: str + description: Optional[str] = None + organization_type: OrganizationType = OrganizationType.STARTUP + website: Optional[str] = None + email: Optional[str] = None + phone: Optional[str] = None + logo_url: Optional[str] = None + banner_url: Optional[str] = None + location: Optional[str] = None + github_url: Optional[str] = None + linkedin_url: Optional[str] = None + twitter_url: Optional[str] = None + hiring: bool = False + +class OrganizationCreate(OrganizationBase): + pass + +class OrganizationUpdate(BaseModel): + name: Optional[str] = None + slug: Optional[str] = None + description: Optional[str] = None + organization_type: Optional[OrganizationType] = None + website: Optional[str] = None + email: Optional[str] = None + phone: Optional[str] = None + logo_url: Optional[str] = None + banner_url: Optional[str] = None + location: Optional[str] = None + github_url: Optional[str] = None + linkedin_url: Optional[str] = None + twitter_url: Optional[str] = None + hiring: Optional[bool] = None + active: Optional[bool] = None + +class OrganizationResponse(OrganizationBase): + model_config = ConfigDict(from_attributes=True) + + id: uuid.UUID + owner_id: uuid.UUID + members_count: int + projects_count: int + followers_count: int + verified: bool + active: bool + created_at: datetime + updated_at: datetime diff --git a/backend/app/schemas/project.py b/backend/app/schemas/project.py new file mode 100644 index 00000000..81d4e24c --- /dev/null +++ b/backend/app/schemas/project.py @@ -0,0 +1,57 @@ +from __future__ import annotations + +import uuid +from datetime import datetime +from typing import Optional +from pydantic import BaseModel, ConfigDict +from app.models.project import ProjectStage, ProjectVisibility + +class ProjectBase(BaseModel): + title: str + slug: str + tagline: Optional[str] = None + description: str + stage: ProjectStage = ProjectStage.IDEA + visibility: ProjectVisibility = ProjectVisibility.PUBLIC + tech_stack: Optional[str] = None + repository_url: Optional[str] = None + website_url: Optional[str] = None + demo_url: Optional[str] = None + team_size: int = 1 + max_team_size: int = 5 + hiring: bool = True + logo_url: Optional[str] = None + banner_url: Optional[str] = None + +class ProjectCreate(ProjectBase): + pass + +class ProjectUpdate(BaseModel): + title: Optional[str] = None + slug: Optional[str] = None + tagline: Optional[str] = None + description: Optional[str] = None + stage: Optional[ProjectStage] = None + visibility: Optional[ProjectVisibility] = None + tech_stack: Optional[str] = None + repository_url: Optional[str] = None + website_url: Optional[str] = None + demo_url: Optional[str] = None + team_size: Optional[int] = None + max_team_size: Optional[int] = None + hiring: Optional[bool] = None + logo_url: Optional[str] = None + banner_url: Optional[str] = None + +class ProjectResponse(ProjectBase): + model_config = ConfigDict(from_attributes=True) + + id: uuid.UUID + owner_id: uuid.UUID + stars: int + views: int + applications_count: int + is_featured: bool + is_archived: bool + created_at: datetime + updated_at: datetime diff --git a/backend/app/schemas/repository.py b/backend/app/schemas/repository.py new file mode 100644 index 00000000..91510382 --- /dev/null +++ b/backend/app/schemas/repository.py @@ -0,0 +1,62 @@ +from __future__ import annotations + +import uuid +from datetime import datetime +from typing import Optional +from pydantic import BaseModel, ConfigDict +from app.models.repository import RepositoryProvider + +class RepositoryBase(BaseModel): + provider: RepositoryProvider + repository_id: Optional[str] = None + owner: str + name: str + full_name: str + description: Optional[str] = None + default_branch: str = "main" + clone_url: Optional[str] = None + html_url: str + homepage: Optional[str] = None + language: Optional[str] = None + stars: int = 0 + forks: int = 0 + watchers: int = 0 + open_issues: int = 0 + contributors: int = 0 + is_private: bool = False + archived: bool = False + +class RepositoryCreate(RepositoryBase): + project_id: uuid.UUID + +class RepositoryUpdate(BaseModel): + provider: Optional[RepositoryProvider] = None + repository_id: Optional[str] = None + owner: Optional[str] = None + name: Optional[str] = None + full_name: Optional[str] = None + description: Optional[str] = None + default_branch: Optional[str] = None + clone_url: Optional[str] = None + html_url: Optional[str] = None + homepage: Optional[str] = None + language: Optional[str] = None + stars: Optional[int] = None + forks: Optional[int] = None + watchers: Optional[int] = None + open_issues: Optional[int] = None + contributors: Optional[int] = None + is_private: Optional[bool] = None + archived: Optional[bool] = None + synced: Optional[bool] = None + +class RepositoryResponse(RepositoryBase): + model_config = ConfigDict(from_attributes=True) + + id: uuid.UUID + project_id: uuid.UUID + connected_by: Optional[uuid.UUID] = None + synced: bool + last_synced_at: Optional[datetime] = None + created_at: datetime + updated_at: datetime diff --git a/backend/app/schemas/skill.py b/backend/app/schemas/skill.py new file mode 100644 index 00000000..1d8b9135 --- /dev/null +++ b/backend/app/schemas/skill.py @@ -0,0 +1,30 @@ +from __future__ import annotations + +import uuid +from datetime import datetime +from typing import Optional +from pydantic import BaseModel, ConfigDict + +class SkillBase(BaseModel): + name: str + slug: str + category: Optional[str] = None + description: Optional[str] = None + icon: Optional[str] = None + +class SkillCreate(SkillBase): + pass + +class SkillUpdate(BaseModel): + name: Optional[str] = None + slug: Optional[str] = None + category: Optional[str] = None + description: Optional[str] = None + icon: Optional[str] = None + +class SkillResponse(SkillBase): + model_config = ConfigDict(from_attributes=True) + + id: uuid.UUID + created_at: datetime + updated_at: datetime diff --git a/backend/app/services/application_service.py b/backend/app/services/application_service.py index 63a92435..32642976 100644 --- a/backend/app/services/application_service.py +++ b/backend/app/services/application_service.py @@ -9,10 +9,13 @@ Application, ApplicationStatus, ) +from app.models.notification import NotificationType from app.schemas.application import ( ApplicationCreate, ApplicationUpdate, ) +from app.schemas.notification import NotificationCreate +from app.services.notification_service import NotificationService class ApplicationService: @@ -101,6 +104,26 @@ def accept_application( db.commit() db.refresh(db_application) + # Trigger notification + project_title = db_application.project.title if db_application.project else "Project" + owner_id = db_application.project.owner_id if db_application.project else None + + notification_data = NotificationCreate( + recipient_id=db_application.applicant_id, + type=NotificationType.APPLICATION_ACCEPTED, + title="Application Accepted", + message=f"Your application for project '{project_title}' has been accepted!", + action_url=f"/projects/{db_application.project_id}", + project_id=db_application.project_id, + application_id=db_application.id + ) + NotificationService.create_notification( + db=db, + recipient_id=db_application.applicant_id, + sender_id=owner_id, + notification=notification_data + ) + return db_application @staticmethod @@ -114,6 +137,26 @@ def reject_application( db.commit() db.refresh(db_application) + # Trigger notification + project_title = db_application.project.title if db_application.project else "Project" + owner_id = db_application.project.owner_id if db_application.project else None + + notification_data = NotificationCreate( + recipient_id=db_application.applicant_id, + type=NotificationType.APPLICATION_REJECTED, + title="Application Rejected", + message=f"Your application for project '{project_title}' has been rejected.", + action_url=f"/projects/{db_application.project_id}", + project_id=db_application.project_id, + application_id=db_application.id + ) + NotificationService.create_notification( + db=db, + recipient_id=db_application.applicant_id, + sender_id=owner_id, + notification=notification_data + ) + return db_application @staticmethod diff --git a/backend/app/services/follower_service.py b/backend/app/services/follower_service.py index 92586c27..7abe65d8 100644 --- a/backend/app/services/follower_service.py +++ b/backend/app/services/follower_service.py @@ -6,6 +6,10 @@ from sqlalchemy.orm import Session from app.models.follower import Follower +from app.models.user import User +from app.models.notification import NotificationType +from app.schemas.notification import NotificationCreate +from app.services.notification_service import NotificationService class FollowerService: @@ -29,6 +33,25 @@ def follow_user( db.commit() db.refresh(relationship) + # Trigger notification + follower = db.get(User, follower_id) + follower_name = f"{follower.first_name} {follower.last_name}" if follower else "Someone" + follower_username = follower.username if follower else "" + + notification_data = NotificationCreate( + recipient_id=following_id, + type=NotificationType.FOLLOW, + title="New Follower", + message=f"{follower_name} started following you.", + action_url=f"/profile/{follower_username}" if follower_username else None + ) + NotificationService.create_notification( + db=db, + recipient_id=following_id, + sender_id=follower_id, + notification=notification_data + ) + return relationship @staticmethod diff --git a/backend/app/services/message_service.py b/backend/app/services/message_service.py index 49a9071e..306f7b14 100644 --- a/backend/app/services/message_service.py +++ b/backend/app/services/message_service.py @@ -7,10 +7,15 @@ from sqlalchemy.orm import Session from app.models.message import Message +from app.models.conversation_member import ConversationMember +from app.models.user import User +from app.models.notification import NotificationType from app.schemas.message import ( MessageCreate, MessageUpdate, ) +from app.schemas.notification import NotificationCreate +from app.services.notification_service import NotificationService class MessageService: @@ -42,6 +47,34 @@ def send_message( db.commit() db.refresh(db_message) + # Trigger notifications for conversation members + sender = db.get(User, sender_id) + sender_name = f"{sender.first_name} {sender.last_name}" if sender else "Someone" + + member_stmt = select(ConversationMember).where(ConversationMember.conversation_id == conversation_id) + members = db.scalars(member_stmt).all() + + content_hint = message.content[:50] if message.content else "sent an attachment" + notification_message = f"{sender_name}: {content_hint}" + + for member in members: + if member.user_id != sender_id: + notification_data = NotificationCreate( + recipient_id=member.user_id, + type=NotificationType.MESSAGE, + title="New Message", + message=notification_message, + action_url=f"/messages/{conversation_id}", + conversation_id=conversation_id, + message_id=db_message.id + ) + NotificationService.create_notification( + db=db, + recipient_id=member.user_id, + sender_id=sender_id, + notification=notification_data + ) + return db_message @staticmethod diff --git a/backend/app/services/notification_service.py b/backend/app/services/notification_service.py index f36910c8..34ecb7d6 100644 --- a/backend/app/services/notification_service.py +++ b/backend/app/services/notification_service.py @@ -26,6 +26,30 @@ def create_notification( notification: NotificationCreate, ) -> Notification: + # Check for existing unread duplicate notification + stmt = select(Notification).where( + Notification.recipient_id == recipient_id, + Notification.type == notification.type, + Notification.is_read.is_(False), + ) + if sender_id is not None: + stmt = stmt.where(Notification.sender_id == sender_id) + if notification.project_id is not None: + stmt = stmt.where(Notification.project_id == notification.project_id) + if notification.conversation_id is not None: + stmt = stmt.where(Notification.conversation_id == notification.conversation_id) + if notification.application_id is not None: + stmt = stmt.where(Notification.application_id == notification.application_id) + + existing = db.scalars(stmt).first() + if existing: + existing.message = notification.message + existing.title = notification.title + existing.created_at = datetime.utcnow() + db.commit() + db.refresh(existing) + return existing + db_notification = Notification( recipient_id=recipient_id, sender_id=sender_id, diff --git a/backend/app/tests/test_notifications.py b/backend/app/tests/test_notifications.py new file mode 100644 index 00000000..c7cfb109 --- /dev/null +++ b/backend/app/tests/test_notifications.py @@ -0,0 +1,224 @@ +import pytest +import uuid +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from fastapi.testclient import TestClient + +from app.database.base import Base +from app.database.session import get_db +from app.dependencies import get_current_user +from app.main import app + +# Import all models to register on Base.metadata +from app.models.user import User +from app.models.project import Project, ProjectStage, ProjectVisibility +from app.models.follower import Follower # noqa: F401 +from app.models.conversation import Conversation, ConversationType +from app.models.conversation_member import ConversationMember +from app.models.message import Message, MessageType # noqa: F401 +from app.models.notification import Notification, NotificationType # noqa: F401 +from app.models.application import Application, ApplicationStatus # noqa: F401 +from app.models.builder_flare import BuilderFlare, FlareStatus +from app.models.project_member import ProjectMember, MemberRole + +from app.services.follower_service import FollowerService +from app.services.message_service import MessageService +from app.services.application_service import ApplicationService +from app.services.notification_service import NotificationService +from app.schemas.message import MessageCreate +from app.schemas.application import ApplicationCreate + +from sqlalchemy.pool import StaticPool + +# Setup in-memory SQLite database +engine = create_engine( + "sqlite:///:memory:", + connect_args={"check_same_thread": False}, + poolclass=StaticPool, +) +TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + +Base.metadata.create_all(bind=engine) + +@pytest.fixture(scope="function") +def db(): + # Recreate schema for clean database per test + Base.metadata.drop_all(bind=engine) + Base.metadata.create_all(bind=engine) + db = TestingSessionLocal() + try: + yield db + finally: + db.close() + +@pytest.fixture(scope="function") +def client(db): + def override_get_db(): + try: + yield db + finally: + pass + app.dependency_overrides[get_db] = override_get_db + yield TestClient(app) + app.dependency_overrides.clear() + +def create_test_user(db, email, username): + user = User( + first_name="Test", + last_name="User", + username=username, + email=email, + password_hash="hashed_password", + is_active=True, + is_verified=True, + is_superuser=False + ) + db.add(user) + db.commit() + db.refresh(user) + return user + +def create_test_project(db, owner_id): + project = Project( + owner_id=owner_id, + title="Test Project", + slug=f"test-project-{uuid.uuid4().hex[:6]}", + description="A cool test project", + stage=ProjectStage.IDEA, + visibility=ProjectVisibility.PUBLIC + ) + db.add(project) + db.commit() + db.refresh(project) + return project + +def test_follow_notification(db): + user1 = create_test_user(db, "user1@example.com", "user1") + user2 = create_test_user(db, "user2@example.com", "user2") + + # User 1 follows User 2 + FollowerService.follow_user(db, follower_id=user1.id, following_id=user2.id) + + # Check notification triggered + notifications = NotificationService.list_notifications(db, recipient_id=user2.id) + assert len(notifications) == 1 + notification = notifications[0] + assert notification.type == NotificationType.FOLLOW + assert notification.recipient_id == user2.id + assert notification.sender_id == user1.id + assert "started following you" in notification.message + + # Test duplicate prevention (sending again should reuse/update instead of creating new row) + # We delete follower relationship first to allow refollow if needed, or trigger manually + from app.schemas.notification import NotificationCreate + notification_data = NotificationCreate( + recipient_id=user2.id, + type=NotificationType.FOLLOW, + title="New Follower", + message="Test User started following you." + ) + NotificationService.create_notification(db, recipient_id=user2.id, sender_id=user1.id, notification=notification_data) + + notifications = NotificationService.list_notifications(db, recipient_id=user2.id) + # Still only 1 unread follow notification + assert len(notifications) == 1 + +def test_message_notification(db): + user1 = create_test_user(db, "user1@example.com", "user1") + user2 = create_test_user(db, "user2@example.com", "user2") + + # Create conversation and add members + conv = Conversation(type=ConversationType.DIRECT, created_by=user1.id) + db.add(conv) + db.commit() + db.refresh(conv) + + member1 = ConversationMember(conversation_id=conv.id, user_id=user1.id) + member2 = ConversationMember(conversation_id=conv.id, user_id=user2.id) + db.add_all([member1, member2]) + db.commit() + + # User 1 sends message to conversation + msg_create = MessageCreate(content="Hello there!", type=MessageType.TEXT) + MessageService.send_message(db, conversation_id=conv.id, sender_id=user1.id, message=msg_create) + + # User 2 should get notification, User 1 should not + notif_user2 = NotificationService.list_notifications(db, recipient_id=user2.id) + assert len(notif_user2) == 1 + assert notif_user2[0].type == NotificationType.MESSAGE + assert notif_user2[0].sender_id == user1.id + + notif_user1 = NotificationService.list_notifications(db, recipient_id=user1.id) + assert len(notif_user1) == 0 + +def test_application_notifications(db): + owner = create_test_user(db, "owner@example.com", "owner") + applicant = create_test_user(db, "applicant@example.com", "applicant") + project = create_test_project(db, owner.id) + + flare = BuilderFlare( + project_id=project.id, + created_by=owner.id, + title="Frontend Developer", + description="Looking for react developer", + role="Frontend", + status=FlareStatus.OPEN + ) + db.add(flare) + db.commit() + db.refresh(flare) + + # Applicant submits application + app_create = ApplicationCreate(message="I want to join") + application = ApplicationService.create_application( + db, applicant_id=applicant.id, project_id=project.id, flare_id=flare.id, application=app_create + ) + + # Accept application + ApplicationService.accept_application(db, application) + notifs = NotificationService.list_notifications(db, recipient_id=applicant.id) + assert len(notifs) == 1 + assert notifs[0].type == NotificationType.APPLICATION_ACCEPTED + assert notifs[0].sender_id == owner.id + + # Reset notifications and test reject + db.delete(notifs[0]) + db.commit() + + ApplicationService.reject_application(db, application) + notifs = NotificationService.list_notifications(db, recipient_id=applicant.id) + assert len(notifs) == 1 + assert notifs[0].type == NotificationType.APPLICATION_REJECTED + +def test_project_invite_endpoint_and_notification(db, client): + owner = create_test_user(db, "owner@example.com", "owner") + invitee = create_test_user(db, "invitee@example.com", "invitee") + project = create_test_project(db, owner.id) + + # Authenticate as owner + app.dependency_overrides[get_current_user] = lambda: owner + + # Post project invite + response = client.post(f"/api/projects/projects/{project.id}/invite/{invitee.id}") + assert response.status_code == 201 + assert response.json()["message"] == "User invited successfully" + + # Check project member is created with is_active = False + from sqlalchemy import and_, select + stmt = select(ProjectMember).where( + and_( + ProjectMember.project_id == project.id, + ProjectMember.user_id == invitee.id + ) + ) + member = db.scalar(stmt) + assert member is not None + assert member.is_active is False + assert member.role == MemberRole.MEMBER + + # Check notification was created for invitee + notifs = NotificationService.list_notifications(db, recipient_id=invitee.id) + assert len(notifs) == 1 + assert notifs[0].type == NotificationType.PROJECT_INVITE + assert notifs[0].sender_id == owner.id + assert "invited to join" in notifs[0].message diff --git a/backend/logs/devlink.log b/backend/logs/devlink.log deleted file mode 100644 index dbd06f18..00000000 --- a/backend/logs/devlink.log +++ /dev/null @@ -1,273 +0,0 @@ -[2026-06-27 04:31:37] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:31:38] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:31:38] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:32:06] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:32:07] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:32:07] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:34:03] [INFO] [watchfiles.main] 4 changes detected -[2026-06-27 04:34:04] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:34:04] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:36:47] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:36:48] [INFO] [watchfiles.main] 5 changes detected -[2026-06-27 04:36:48] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:38:11] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:38:12] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:38:12] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:38:24] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:38:25] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:38:25] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:39:06] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:39:06] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:39:47] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:39:48] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:39:48] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:40:13] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:40:14] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:40:14] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:40:56] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:40:56] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:41:06] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:41:06] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:41:07] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:41:08] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:41:08] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:41:26] [INFO] [watchfiles.main] 4 changes detected -[2026-06-27 04:41:26] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:42:24] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:42:24] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:42:25] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:42:25] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:42:43] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:42:44] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:42:44] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:43:12] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:43:13] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:43:13] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:43:33] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:43:34] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:43:34] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:43:38] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:43:38] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:43:39] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:43:39] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:44:49] [INFO] [watchfiles.main] 4 changes detected -[2026-06-27 04:44:50] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:44:50] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:46:30] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:46:31] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:46:32] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:46:32] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:46:52] [INFO] [watchfiles.main] 3 changes detected -[2026-06-27 04:46:52] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:46:53] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:47:07] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:47:07] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:47:23] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:47:24] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:47:24] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:47:33] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:47:33] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:47:34] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:47:34] [INFO] [watchfiles.main] 5 changes detected -[2026-06-27 04:48:31] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:48:32] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:48:33] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:48:33] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:48:37] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:48:38] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:48:38] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:48:54] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:48:54] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:48:58] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:48:58] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:48:59] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:48:59] [INFO] [watchfiles.main] 5 changes detected -[2026-06-27 04:49:35] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:49:36] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:49:37] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:49:37] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:49:43] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:49:43] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:50:00] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:50:00] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:50:08] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:50:09] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:50:09] [INFO] [watchfiles.main] 3 changes detected -[2026-06-27 04:50:09] [INFO] [watchfiles.main] 4 changes detected -[2026-06-27 04:50:51] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:50:51] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:50:59] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:50:59] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:51:15] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:51:15] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:51:21] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:51:22] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:51:22] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:51:22] [INFO] [watchfiles.main] 6 changes detected -[2026-06-27 04:51:57] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:51:58] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:51:58] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:52:06] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:52:06] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:52:25] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:52:25] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:52:30] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:52:31] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:52:31] [INFO] [watchfiles.main] 3 changes detected -[2026-06-27 04:52:32] [INFO] [watchfiles.main] 4 changes detected -[2026-06-27 04:52:32] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:53:11] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:53:11] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:53:22] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:53:23] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:53:24] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:53:24] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:53:36] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:53:37] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:53:37] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:53:40] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:53:41] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:53:41] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:53:41] [INFO] [watchfiles.main] 6 changes detected -[2026-06-27 04:54:21] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:54:22] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:54:22] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:54:34] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:54:34] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:54:47] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:54:47] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:54:56] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:54:56] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:54:57] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:54:57] [INFO] [watchfiles.main] 4 changes detected -[2026-06-27 04:54:58] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:54:58] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:55:24] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:55:24] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:55:25] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:55:26] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:55:26] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:55:34] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:55:34] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:55:51] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:55:51] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:55:55] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:55:55] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:55:56] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:55:56] [INFO] [watchfiles.main] 5 changes detected -[2026-06-27 04:57:18] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:57:19] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:57:20] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:57:21] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:57:22] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:57:22] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:57:26] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:57:26] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:57:54] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:57:54] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:57:58] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:57:58] [INFO] [watchfiles.main] 3 changes detected -[2026-06-27 04:57:59] [INFO] [watchfiles.main] 4 changes detected -[2026-06-27 04:57:59] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:58:52] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:58:53] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:58:54] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:58:54] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:59:08] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:59:08] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:59:38] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:59:39] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:59:39] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:59:42] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:59:42] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 04:59:42] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 04:59:43] [INFO] [watchfiles.main] 4 changes detected -[2026-06-27 04:59:43] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:00:48] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:00:49] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:00:49] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:00:50] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:00:50] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:01:00] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:01:01] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:01:01] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:01:25] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:01:25] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:01:29] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 05:01:29] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:01:30] [INFO] [watchfiles.main] 4 changes detected -[2026-06-27 05:01:31] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 05:01:31] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:02:15] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:02:15] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:02:16] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:02:17] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:02:17] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:02:24] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:02:25] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:02:25] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:02:52] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:02:53] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:02:54] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:02:54] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:03:03] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 05:03:03] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:03:03] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 05:03:04] [INFO] [watchfiles.main] 4 changes detected -[2026-06-27 05:03:05] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:03:05] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:04:14] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:04:15] [INFO] [watchfiles.main] 3 changes detected -[2026-06-27 05:04:15] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:04:16] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:04:24] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:04:24] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:04:46] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:04:46] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:04:55] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 05:04:56] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:04:56] [INFO] [watchfiles.main] 3 changes detected -[2026-06-27 05:04:56] [INFO] [watchfiles.main] 3 changes detected -[2026-06-27 05:04:57] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:04:57] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:05:31] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:05:32] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:05:32] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:05:33] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:05:33] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:05:49] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:05:50] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:05:50] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:06:03] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:06:04] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:06:04] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:06:11] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 05:06:11] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:06:12] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 05:06:12] [INFO] [watchfiles.main] 5 changes detected -[2026-06-27 05:07:26] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 05:07:26] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:07:33] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:07:33] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:07:52] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:07:52] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:08:00] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 05:08:00] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:08:00] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 05:08:01] [INFO] [watchfiles.main] 4 changes detected -[2026-06-27 05:08:01] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:08:45] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 05:08:45] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:08:55] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:08:56] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:08:57] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:08:57] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:09:18] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:09:18] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:09:25] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 05:09:25] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:09:26] [INFO] [watchfiles.main] 2 changes detected -[2026-06-27 05:09:26] [INFO] [watchfiles.main] 4 changes detected -[2026-06-27 05:09:27] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:09:28] [INFO] [watchfiles.main] 1 change detected -[2026-06-27 05:09:28] [INFO] [watchfiles.main] 1 change detected From c9779c50e7a0bc3d4b06bb00f474c9fd948049a1 Mon Sep 17 00:00:00 2001 From: Arpit Singh Tomar Date: Sat, 11 Jul 2026 15:50:25 +0530 Subject: [PATCH 2/2] feat: add shareable public portfolio pages --- docs/public_portfolio_documentation.md | 91 + frontend/package-lock.json | 3654 +++++++---------- frontend/src/mocks/seed.ts | 12 +- frontend/src/routeTree.gen.ts | 21 + .../src/routes/_app.profile.$username.tsx | 52 +- .../src/routes/_app.projects.$projectId.tsx | 15 +- frontend/src/routes/portfolio.$username.tsx | 1232 ++++++ frontend/src/services/index.ts | 13 +- 8 files changed, 2876 insertions(+), 2214 deletions(-) create mode 100644 docs/public_portfolio_documentation.md create mode 100644 frontend/src/routes/portfolio.$username.tsx diff --git a/docs/public_portfolio_documentation.md b/docs/public_portfolio_documentation.md new file mode 100644 index 00000000..28e3adbd --- /dev/null +++ b/docs/public_portfolio_documentation.md @@ -0,0 +1,91 @@ +# DevLink Shareable Public Portfolio Pages Documentation + +This document consolidates all plans, walkthroughs, troubleshooting fixes, and test results for the **Shareable Public Portfolio Pages** feature implemented today. + +--- + +## 1. Overview & Goal + +The goal was to build a beautiful, interactive, and shareable public portfolio page for every builder on DevLink. This portfolio lives outside the main dashboard application shell, making it a perfect personal landing page that developers can link to in their CVs, social bios, or GitHub profiles. + +### Key Features: +1. **Standalone Route (`/portfolio/$username`):** A standalone route that bypasses the sidebar and dashboard layouts. +2. **5 Premium Visual Themes:** + - **Modern Neon (Dark):** Soft purple/violet neon accent glows and grids. + - **Minimalist Warm (Light):** Serene stone background, elegant serif typography. + - **Cyberpunk Console (Retro):** Monospace font, green/pink console retro borders, scanline overlays. + - **Glassmorphism (Frosted):** Frosted glass panels on top of a multi-color mesh gradient backdrop. + - **Slate Pro (Sleek):** Modern slate-gray dark design with emerald borders and geometric layout. +3. **Live Template Customizer Panel:** A floating widget allowing users to change layouts, choose accents, toggle layout sections (Projects, thoughts/flares, or hiring form), and save their default preferences. +4. **Hiring Lead/Contact Form:** Direct contact form that routes client inquiries straight to the builder's DevLink notifications. + +--- + +## 2. Completed Checklist + +- [x] Integrate "Shareable Portfolio" dashboard link/card in user profile screen ([_app.profile.$username.tsx](file:///c:/Users/singh/OneDrive/Desktop/ECSOC2026/devlink/frontend/src/routes/_app.profile.$username.tsx)) +- [x] Implement the standalone route ([portfolio.$username.tsx](file:///c:/Users/singh/OneDrive/Desktop/ECSOC2026/devlink/frontend/src/routes/portfolio.$username.tsx)) with 5 custom templates +- [x] Build the Customizer Panel for template, accent, and section display controls +- [x] Code the contact/hiring form with mock notification delivery to `localStorage` +- [x] Troubleshoot and resolve TypeScript compilation / route generation issues +- [x] Run local servers (backend & frontend) and verify the portfolio page functions cleanly + +--- + +## 3. Implementation Details + +### Standalone Route +- Defined route `Route = createFileRoute("/portfolio/$username")` directly under `src/routes/` to skip the `_app` shell template. +- Loads data dynamically: fetches the builder info, filters matching projects (where the project owner handle matches), and loads flares created by the developer. + +### Integrated Banner +- Placed on the main profile screen ([_app.profile.$username.tsx](file:///c:/Users/singh/OneDrive/Desktop/ECSOC2026/devlink/frontend/src/routes/_app.profile.$username.tsx)). +- Gives developers direct controls: **View Public Page** and **Copy Link**. +- Offers visitors a prominent button to view the builder's external showcase. + +### Notification Sync +- Integrated form submissions directly with `localStorage` (stored under `devlink-notifications`). +- The dashboard notifications resolver automatically prepends these simulated recruiter messages, making them display as real-time notifications in the developer's main feed. + +--- + +## 4. Troubleshooting & Route Compilation Fixes + +Today we encountered and resolved a critical issue where the newly added route `/portfolio/$username` was not registered, resulting in the TypeScript error: +`Argument of type '"/portfolio/$username"' is not assignable to parameter of type 'keyof FileRoutesByPath | undefined'`. + +Here is the root cause analysis and resolution: + +### Root Cause 1: Duplicate Import Syntax Error +In [\_app.projects.$projectId.tsx](file:///c:/Users/singh/OneDrive/Desktop/ECSOC2026/devlink/frontend/src/routes/_app.projects.$projectId.tsx), duplicate import statements for `ArrowLeft`, `useState`, `cn`, `builders`, and `activity` caused the TypeScript generator to crash: +`SyntaxError: Identifier 'ArrowLeft' has already been declared`. + +* **Resolution:** Merged and cleaned up the import declarations at the top of the file. + +### Root Cause 2: Broken HTML/JSX Markup +In the same project detail file [\_app.projects.$projectId.tsx](file:///c:/Users/singh/OneDrive/Desktop/ECSOC2026/devlink/frontend/src/routes/_app.projects.$projectId.tsx), a duplicate stats block was inserted without matching closing tags: +`SyntaxError: Expected corresponding JSX closing tag for
`. + +* **Resolution:** Cleaned up the nested layout, removed the duplicated block, and balanced the tags correctly. + +### Root Cause 3: Mock Data Type Mismatch +In [seed.ts](file:///c:/Users/singh/OneDrive/Desktop/ECSOC2026/devlink/frontend/src/mocks/seed.ts), project status fields were using invalid string values (e.g. `"active"`, `"planning"`, `"shipped"`) instead of matching the strict union definition: `status: "recruiting" | "in-progress" | "completed" | "archived"`. + +* **Resolution:** Mapped all mock project statuses to their valid type values: + - `"active"` -> `"in-progress"` + - `"planning"` -> `"recruiting"` + - `"shipped"` -> `"completed"` + +After executing these fixes, running `npx @tanstack/router-cli generate` successfully regenerated the routing tree [routeTree.gen.ts](file:///c:/Users/singh/OneDrive/Desktop/ECSOC2026/devlink/frontend/src/routeTree.gen.ts) and resolved all TypeScript compilation issues. + +--- + +## 5. Manual & E2E Testing Summary + +* **Vite Dev Server Port:** Frontend verified running successfully on `http://localhost:8080/`. +* **Target Portfolio Tested:** `http://localhost:8080/portfolio/priya_dev` +* **Verification Results:** + 1. The portfolio loads stand-alone without the sidebar navigation dashboard. + 2. Priya Sharma's description, skills stack, matching projects, and flares display correctly. + 3. Customization panel operates as expected and stores settings under local storage. + 4. Submitting the recruitment/contact form successfully pushes simulated notifications into the builder's notifications feed. diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 7bdbe075..b9427d33 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -86,19 +86,6 @@ "vite": "^8.0.16" } }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@babel/code-frame": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", @@ -127,7 +114,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -381,6 +367,27 @@ "integrity": "sha512-lwYN/vDPeNRULcepoE/LO2Pgx+7/RV+S9ARfbc9lr2DtGkOD7pAiruHvbR1RX3Qyf6ja47EWJDMsNK5vK08DJg==", "license": "MIT" }, + "node_modules/@emnapi/core": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", + "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", + "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emnapi/wasi-threads": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", @@ -475,9 +482,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", - "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", + "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", "dev": true, "license": "MIT", "dependencies": { @@ -487,7 +494,7 @@ "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", + "js-yaml": "^4.3.0", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, @@ -512,9 +519,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", - "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", "dev": true, "license": "MIT", "engines": { @@ -549,31 +556,31 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", - "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.11" + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", - "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.5", - "@floating-ui/utils": "^0.2.11" + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", - "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.7.6" + "@floating-ui/dom": "^1.8.0" }, "peerDependencies": { "react": ">=16.8.0", @@ -581,9 +588,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", - "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", "license": "MIT" }, "node_modules/@fontsource/inter": { @@ -719,12 +726,12 @@ } }, "node_modules/@lottiefiles/dotlottie-react": { - "version": "0.19.7", - "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.19.7.tgz", - "integrity": "sha512-uozfELOplVo0PwD2E3yy9IndpjKVa4oWErDWFos3cHaqwsUrRLlJNpRDM8aFsWdw5e3N3/GHbKcsGxSeytsPWg==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.19.9.tgz", + "integrity": "sha512-G07YYM5CLOJrqmNglsMvxlVVV4dsjJvC+S2sdtL101LoWOC9rTPxUb1GCyuTTMF3qhxgIXdylCciVHQnF1nU0A==", "license": "MIT", "dependencies": { - "@lottiefiles/dotlottie-web": "0.76.0" + "@lottiefiles/dotlottie-web": "0.77.1" }, "engines": { "node": ">=18.17.0", @@ -735,9 +742,9 @@ } }, "node_modules/@lottiefiles/dotlottie-web": { - "version": "0.76.0", - "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.76.0.tgz", - "integrity": "sha512-uWJ86UJM6hjN4MY2aGSyyFcRQEAM4B9qDCnb/336dHab1zE6nyOF45b90t8xesZPwNtP/2moNGMrMQ1UJW6+lQ==", + "version": "0.77.1", + "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.77.1.tgz", + "integrity": "sha512-WHRQMyACH9VFCk3MI54IuqrTu5pbTnTrvQoJoyH76P6WHhkcNH+lINn3LduhbEciqI+DRKgdM4MwtOPoN2GbDA==", "license": "MIT", "engines": { "node": ">=18.17.0", @@ -745,9 +752,9 @@ } }, "node_modules/@lovable.dev/vite-plugin-dev-server-bridge": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@lovable.dev/vite-plugin-dev-server-bridge/-/vite-plugin-dev-server-bridge-1.0.2.tgz", - "integrity": "sha512-1c4XLFkpS614VxPyq+IX0us52vm5JWxdO1NfG2L1FjH0asKvHNu5//6wpnKHWmx60Y4HR1gcLaIiLACXIdeFyg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lovable.dev/vite-plugin-dev-server-bridge/-/vite-plugin-dev-server-bridge-1.1.0.tgz", + "integrity": "sha512-NuIYWHEPRve+BMW9SyGFFQdigP7bcLvlVf7lW9LZHjBQveGp6vP3aaWzWUr2oP3WiLgBzr1gmw2pq7AcAHT+PQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -760,9 +767,9 @@ } }, "node_modules/@lovable.dev/vite-plugin-hmr-gate": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@lovable.dev/vite-plugin-hmr-gate/-/vite-plugin-hmr-gate-1.1.1.tgz", - "integrity": "sha512-ySRUzOoGQYhj4Pd9EjaA7i1+2RiaS5lSVZasun72wVZZmJfFIciGYGQQDUu88HISn4icz0sugQxFRJGCNlTggg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@lovable.dev/vite-plugin-hmr-gate/-/vite-plugin-hmr-gate-1.1.2.tgz", + "integrity": "sha512-m3tOTEm78rPAFq6+ELNMS10pX786mFLdRYFnU/xIra+aJSSalnueVhdeIgmictfoqBQw8GZLgmpeASOXVI6w9g==", "dev": true, "license": "MIT", "peerDependencies": { @@ -775,16 +782,16 @@ } }, "node_modules/@lovable.dev/vite-tanstack-config": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@lovable.dev/vite-tanstack-config/-/vite-tanstack-config-2.6.4.tgz", - "integrity": "sha512-eav5blPqeu6n054y+7UtbtwIOiIexB2U7gGvHJIo2rsLyDFkJL1QL3qKnmmax1FLIProfoYXuC0lq1QczFR+dw==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@lovable.dev/vite-tanstack-config/-/vite-tanstack-config-2.7.2.tgz", + "integrity": "sha512-TwCXJNeCoUMvK3xWTOYAsUk+FpMKgQjKNPnyqsaCpHyHT8l7giEApRNXBXmSy9KJ+Ri8eZed6Exe0ID+Tg9VPA==", "dev": true, "license": "MIT", "dependencies": { "@lovable.dev/vite-plugin-dev-server-bridge": "^1.0.2", "@lovable.dev/vite-plugin-hmr-gate": "^1.1.1", - "lightningcss": "^1.30.0", - "lovable-tagger": "1.2.0" + "@tanstack/devtools-vite": "^0.8.1", + "lightningcss": "^1.30.0" }, "peerDependencies": { "@tailwindcss/vite": ">=4.0.0", @@ -818,44 +825,6 @@ "@emnapi/runtime": "^1.7.1" } }, - "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/@oozcitak/dom": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-2.0.2.tgz", @@ -904,215 +873,420 @@ "node": ">=20.0" } }, - "node_modules/@oxc-project/types": { - "version": "0.137.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.137.0.tgz", - "integrity": "sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==", + "node_modules/@oxc-parser/binding-android-arm-eabi": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.120.0.tgz", + "integrity": "sha512-WU3qtINx802wOl8RxAF1v0VvmC2O4D9M8Sv486nLeQ7iPHVmncYZrtBhB4SYyX+XZxj2PNnCcN+PW21jHgiOxg==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@pkgr/core": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", - "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", + "node_modules/@oxc-parser/binding-android-arm64": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.120.0.tgz", + "integrity": "sha512-SEf80EHdhlbjZEgzeWm0ZA/br4GKMenDW3QB/gtyeTV1gStvvZeFi40ioHDZvds2m4Z9J1bUAUL8yn1/+A6iGg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@radix-ui/number": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.2.tgz", - "integrity": "sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig==", - "license": "MIT" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", - "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-accordion": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.15.tgz", - "integrity": "sha512-24Zz/0SYx8F2bSVThBnQrdJs2VbKelyuJordcFRRdA0fRAhrq/wSegGCqaQz34VQoiWqSMGYCYXEhynLSlyQlg==", + "node_modules/@oxc-parser/binding-darwin-arm64": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.120.0.tgz", + "integrity": "sha512-xVrrbCai8R8CUIBu3CjryutQnEYhZqs1maIqDvtUCFZb8vY33H7uh9mHpL3a0JBIKoBUKjPH8+rzyAeXnS2d6A==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collapsible": "1.1.15", - "@radix-ui/react-collection": "1.1.11", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@radix-ui/react-alert-dialog": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.18.tgz", - "integrity": "sha512-6c2cXpNlAgHDhKguK24XcWHHayMpK+lk7/WwBXBco+ZJ4Dv7xP++GBM280KgTD/HCRu3jSdfe8WQiZssonYaIA==", + "node_modules/@oxc-parser/binding-darwin-x64": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.120.0.tgz", + "integrity": "sha512-xyHBbnJ6mydnQUH7MAcafOkkrNzQC6T+LXgDH/3InEq2BWl/g424IMRiJVSpVqGjB+p2bd0h0WRR8iIwzjU7rw==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dialog": "1.1.18", - "@radix-ui/react-primitive": "2.1.7" - }, - "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 - } + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.11.tgz", - "integrity": "sha512-Kdil9BB1rIFC/khmf4hC35bn8701AJcizTU7G7cUbEbk5XqqbjDuHW60uUfKqO5WojjZcbAW51Q7P0hRmMLw8A==", + "node_modules/@oxc-parser/binding-freebsd-x64": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.120.0.tgz", + "integrity": "sha512-UMnVRllquXUYTeNfFKmxTTEdZ/ix1nLl0ducDzMSREoWYGVIHnOOxoKMWlCOvRr9Wk/HZqo2rh1jeumbPGPV9A==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.7" - }, - "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 - } + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@radix-ui/react-aspect-ratio": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.11.tgz", - "integrity": "sha512-IUAhIVpBUvP5NNICjlaB1OFmtRLGqQqTF3ZOSGPoq3XeLXRFtHiWTRxSVEULgOd9GQR2c7tsYqDnhUennapZnw==", + "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.120.0.tgz", + "integrity": "sha512-tkvn2CQ7QdcsMnpfiX3fd3wA3EFsWKYlcQzq9cFw/xc89Al7W6Y4O0FgLVkVQpo0Tnq/qtE1XfkJOnRRA9S/NA==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.7" - }, - "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 - } + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@radix-ui/react-avatar": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.2.1.tgz", - "integrity": "sha512-+8PWoLLZv3AVb5m0pvoiOca/bQGzc9vPVb+982HB2x3Un0DpYEPM3zLMl4oqRpBsocJuNqLkiv/HXTnTrlwr4g==", + "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.120.0.tgz", + "integrity": "sha512-WN5y135Ic42gQDk9grbwY9++fDhqf8knN6fnP+0WALlAUh4odY/BDK1nfTJRSfpJD9P3r1BwU0m3pW2DU89whQ==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-is-hydrated": "0.1.1", - "@radix-ui/react-use-layout-effect": "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 - } + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@radix-ui/react-checkbox": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.6.tgz", - "integrity": "sha512-eUEUoGMDpfkgHWSE97ZZaUJtzR1M7EKnNIpD1Q16+8JR9NWghcaqMulx9PuCQ720w0UclfYn6FEbCdd5Hx087g==", + "node_modules/@oxc-parser/binding-linux-arm64-gnu": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.120.0.tgz", + "integrity": "sha512-1GgQBCcXvFMw99EPdMy+4NZ3aYyXsxjf9kbUUg8HuAy3ZBXzOry5KfFEzT9nqmgZI1cuetvApkiJBZLAPo8uaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-use-size": "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" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-musl": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.120.0.tgz", + "integrity": "sha512-gmMQ70gsPdDBgpcErvJEoWNBr7bJooSLlvOBVBSGfOzlP5NvJ3bFvnUeZZ9d+dPrqSngtonf7nyzWUTUj/U+lw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-ppc64-gnu": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.120.0.tgz", + "integrity": "sha512-T/kZuU0ajop0xhzVMwH5r3srC9Nqup5HaIo+3uFjIN5uPxa0LvSxC1ZqP4aQGJVW5G0z8/nCkjIfSMS91P/wzw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.120.0.tgz", + "integrity": "sha512-vn21KXLAXzaI3N5CZWlBr1iWeXLl9QFIMor7S1hUjUGTeUuWCoE6JZB040/ZNDwf+JXPX8Ao9KbmJq9FMC2iGw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-riscv64-musl": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.120.0.tgz", + "integrity": "sha512-SUbUxlar007LTGmSLGIC5x/WJvwhdX+PwNzFJ9f/nOzZOrCFbOT4ikt7pJIRg1tXVsEfzk5mWpGO1NFiSs4PIw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-s390x-gnu": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.120.0.tgz", + "integrity": "sha512-hYiPJTxyfJY2+lMBFk3p2bo0R9GN+TtpPFlRqVchL1qvLG+pznstramHNvJlw9AjaoRUHwp9IKR7UZQnRPGjgQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-gnu": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.120.0.tgz", + "integrity": "sha512-q+5jSVZkprJCIy3dzJpApat0InJaoxQLsJuD6DkX8hrUS61z2lHQ1Fe9L2+TYbKHXCLWbL0zXe7ovkIdopBGMQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-musl": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.120.0.tgz", + "integrity": "sha512-D9QDDZNnH24e7X4ftSa6ar/2hCavETfW3uk0zgcMIrZNy459O5deTbWrjGzZiVrSWigGtlQwzs2McBP0QsfV1w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-openharmony-arm64": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.120.0.tgz", + "integrity": "sha512-TBU8ZwOUWAOUWVfmI16CYWbvh4uQb9zHnGBHsw5Cp2JUVG044OIY1CSHODLifqzQIMTXvDvLzcL89GGdUIqNrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-wasm32-wasi": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.120.0.tgz", + "integrity": "sha512-WG/FOZgDJCpJnuF3ToG/K28rcOmSY7FmFmfBKYb2fmLyhDzPpUldFGV7/Fz4ru0Iz/v4KPmf8xVgO8N3lO4KHA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.15.tgz", - "integrity": "sha512-8A1zibu5skAQ+UVbaeNH5hVMibiFCRJzgMuM14LTWGttnTZKQL9jwYnhAbHRuxrtCqPXa4JvvnVUq1pTNgyZYw==", + "node_modules/@oxc-parser/binding-win32-arm64-msvc": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.120.0.tgz", + "integrity": "sha512-1T0HKGcsz/BKo77t7+89L8Qvu4f9DoleKWHp3C5sJEcbCjDOLx3m9m722bWZTY+hANlUEs+yjlK+lBFsA+vrVQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-win32-ia32-msvc": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.120.0.tgz", + "integrity": "sha512-L7vfLzbOXsjBXV0rv/6Y3Jd9BRjPeCivINZAqrSyAOZN3moCopDN+Psq9ZrGNZtJzP8946MtlRFZ0Als0wBCOw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-win32-x64-msvc": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.120.0.tgz", + "integrity": "sha512-ys+upfqNtSu58huAhJMBKl3XCkGzyVFBlMlGPzHeFKgpFF/OdgNs1MMf8oaJIbgMH8ZxgGF7qfue39eJohmKIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.120.0.tgz", + "integrity": "sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@pkgr/core": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", + "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.2.tgz", + "integrity": "sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.5.tgz", + "integrity": "sha512-d86WIWFYNtGA0H/d8exstrTRTp7eWJYlYJbtNofxr/3ljupZYn6EFDG/Qgu/0Kc8v7yMUxySagqJsL1+PdYjWg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.16.tgz", + "integrity": "sha512-BpZJNmetujnGgUI6OX0jEhEmlA46WPqgub8Rv09Kyquwd0cc1ndMKpiPYCjmBU6KSSRPAMtgLpEoZSG/tdNIWQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collapsible": "1.1.16", + "@radix-ui/react-collection": "1.1.12", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -1129,16 +1303,17 @@ } } }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.11.tgz", - "integrity": "sha512-djW9+zeg137KQdlPtmE8xnaD+K2rcXXMWFrSg0hsmYZ6HRbdTA7tDHFgpaW9+huWVEu0RCabL+985T4TA0BE7g==", + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.19.tgz", + "integrity": "sha512-FA7n1f6D/DwGE0+AWxiY5LacNbbExQuEgMubeG06idEaH+mSLuf9dp/qBNqOnvbTQ+4gZ2ue1RATF1Ub91Mg5g==", "license": "MIT", "dependencies": { + "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0" + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-dialog": "1.1.19", + "@radix-ui/react-primitive": "2.1.7" }, "peerDependencies": { "@types/react": "*", @@ -1155,47 +1330,36 @@ } } }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", - "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.11.tgz", + "integrity": "sha512-Kdil9BB1rIFC/khmf4hC35bn8701AJcizTU7G7cUbEbk5XqqbjDuHW60uUfKqO5WojjZcbAW51Q7P0hRmMLw8A==", "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "dependencies": { + "@radix-ui/react-primitive": "2.1.7" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", - "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", - "license": "MIT", "peerDependencies": { "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "@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-context-menu": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.3.2.tgz", - "integrity": "sha512-qzsA/ZPhF6yMxBOTIk1nlCkoy2mswSbwYL+ErBa2iP0s4WWrlxmczArYqMcpVfEjmM7KJj/ADPXky0yZfbSxtQ==", + "node_modules/@radix-ui/react-aspect-ratio": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.11.tgz", + "integrity": "sha512-IUAhIVpBUvP5NNICjlaB1OFmtRLGqQqTF3ZOSGPoq3XeLXRFtHiWTRxSVEULgOd9GQR2c7tsYqDnhUennapZnw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-menu": "2.1.19", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/react-primitive": "2.1.7" }, "peerDependencies": { "@types/react": "*", @@ -1212,21 +1376,191 @@ } } }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.18.tgz", - "integrity": "sha512-apa28mldjMgORmE6g/w3sCcA0Y9UAVeeDVoozN4i7kOw12mLl9RBchfzK3Nn6qxOWjrZhK1Lfy7f07kyzxtnBw==", + "node_modules/@radix-ui/react-avatar": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.2.2.tgz", + "integrity": "sha512-sST0qh8GzOB7besQ3tMLWLyngnRuSk0gc/Hm+667KYKQFCt6Y6ZXv25WlqM7dIDK54ULCh5+CHmk4LIolzfz+A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-is-hydrated": "0.1.1", + "@radix-ui/react-use-layout-effect": "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-checkbox": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.7.tgz", + "integrity": "sha512-JroKHfQBfh+fDuzpPsBC+pESkhuq8ql4hljTguz8MWnS35cISr3d/Jhl9kYrB44FlDtxCArYdDvTx+BSsJ64rQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-presence": "1.1.7", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-previous": "1.1.2", + "@radix-ui/react-use-size": "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-collapsible": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.16.tgz", + "integrity": "sha512-opfXRe6nnzyGmCDPx+l1Aqo/RbqWtQal2FnsBqF9hhePp6j0LsRoBaRxcMOlTv+uYTJVtWYZKg9t9wTe+BA/ZA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-presence": "1.1.7", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-layout-effect": "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-collection": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.12.tgz", + "integrity": "sha512-nb67INpE0IahJKN7EYPp9m9YGwYeKlnzxT3MwXVkgCskaSJia97kG4T0ywpjNUSSnoJk/uvk12V8vbrEHEj+/Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-slot": "1.3.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-compose-refs": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", + "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", + "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.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.0.tgz", + "integrity": "sha512-fOE+JtN9rygNZkCnHRBEP0TAvLldlhyOxMsbwFvTP4nAs+nBmfnna+o/Zski2wkmY1YMrFC0aSzsHoLY47iLrg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.3.3.tgz", + "integrity": "sha512-PS+gKE0z2prJ74Y0sM+brAGK4mYOHIR7TlcV5EJgUQ6E0xMvyswkK2X4yRqyganrzsRL+WCSKAPu0NQITICRWg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-menu": "2.1.20", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-controllable-state": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.19.tgz", + "integrity": "sha512-+HhbN2+YtkRgVirjZ2afMeutQRuGOrdkWR5+EFC58SJojGmtyNQwYzgi6tHBpOxvFHefMtPeHdgtjz0BOGxFQg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", + "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.14", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-dismissable-layer": "1.1.15", "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.11", + "@radix-ui/react-focus-scope": "1.1.12", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-controllable-state": "1.2.3", @@ -1264,12 +1598,12 @@ } }, "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.14.tgz", - "integrity": "sha512-4lUhWTWAjbDIqFrAPWJ3WqBOpO5YchVZ88X3nh6H9Lu5AFi5nCUeTPj3D8FSDmabmFeRe9ME0BDA4MwKTha5GQ==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.15.tgz", + "integrity": "sha512-b0XaRlzn2QKuo10XyNgi2DAJDf5XC9d1nD3FJcuvCjbR7+4Ad28zmZsLsqx+hvDEzMnRuZaZxZm9gYObV6RmRA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", + "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", @@ -1291,16 +1625,16 @@ } }, "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.19", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.19.tgz", - "integrity": "sha512-HZccBkbK0LOi8nYKIp5jll/zIRW0cCOmG6WWyqsSpmXCU+ZlcBbTqIwlBvPCu886C5RVu6c/kHV7xSP8IgYNHw==", + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.20.tgz", + "integrity": "sha512-slfm+rRaZRuQBvHq60lXvSVUPhid0IPtjSZzIuUlWZMUs01iYZNlGS3mJgRD3ChLQVBAYlKiL/tFyWGX+dz8Xw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", + "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-menu": "2.1.19", + "@radix-ui/react-menu": "2.1.20", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3" }, @@ -1335,9 +1669,9 @@ } }, "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.11.tgz", - "integrity": "sha512-Mn88Vg2whaRocGJNOH+DKFqYm6ySFPQaiwHNxZPyjn99B52KAEJWWY9NP83+nWdk2HM3rdov+STu9AG471Rt9w==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.12.tgz", + "integrity": "sha512-jjk/lqTeNL0azUx5ZYzVrl4NgaDIrdzTNE4mABV9yBFI7FQqN7pIgzV1bTleUezP2QiTGA1BFTqY8MegDgWX9A==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.3", @@ -1360,18 +1694,18 @@ } }, "node_modules/@radix-ui/react-hover-card": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.18.tgz", - "integrity": "sha512-rt+Fx4HoCeEwFL2IdoV2QaPltqDLlzxN77i9nwB3Y70scFlfAHh1QCdE2TXKuFJtA1TNygb0oivnFBZifgtZOw==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.19.tgz", + "integrity": "sha512-2KTgMLQtKvicznQgbindEI2RZ3QbDIwU5gabjUPwFJsormjGDz+rUvO4NANmYwzEEpTcTONUt33vBHIfTIVSfw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", + "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.14", - "@radix-ui/react-popper": "1.3.2", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-dismissable-layer": "1.1.15", + "@radix-ui/react-popper": "1.3.3", "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3" }, @@ -1432,25 +1766,25 @@ } }, "node_modules/@radix-ui/react-menu": { - "version": "2.1.19", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.19.tgz", - "integrity": "sha512-Mht9BVd1AIsNFVQr4KG3bIK7XQn5IXF0TL/2ObsrzOdc1loaly/+kBDL5roSCYn8j8XZkvpOD0WYLz2FQtH1Eg==", + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.20.tgz", + "integrity": "sha512-VsUrXxFe9d2ScbZF0fR/oPR1+qjyeLs5p0jzG8h90puMoA9bq4SirYlXbE+USRg9Q2qTeJSFNqjw2nts8jJe4w==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.11", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collection": "1.1.12", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.14", + "@radix-ui/react-dismissable-layer": "1.1.15", "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.11", + "@radix-ui/react-focus-scope": "1.1.12", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.2", + "@radix-ui/react-popper": "1.3.3", "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.14", + "@radix-ui/react-roving-focus": "1.1.15", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-callback-ref": "1.1.2", "aria-hidden": "^1.2.4", @@ -1472,20 +1806,20 @@ } }, "node_modules/@radix-ui/react-menubar": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.19.tgz", - "integrity": "sha512-Glt6mebxcgQvLeVkH3HiqV5bgQubE+31ELxLs7q0GlYI5k0XYkOkeuPrhXoylxK8eufvIt9CJjzY1TfFMXK3qw==", + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.20.tgz", + "integrity": "sha512-gzFZvybgmwYsFBWDqanycIoEYnhyk8MMnuLamdFVHUZYGp4COM+sqXiwbnn0VMWqGLeeU7GV7jm+dXRa+Wufag==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.11", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collection": "1.1.12", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-menu": "2.1.19", + "@radix-ui/react-menu": "2.1.20", "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.14", + "@radix-ui/react-roving-focus": "1.1.15", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { @@ -1504,19 +1838,19 @@ } }, "node_modules/@radix-ui/react-navigation-menu": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.17.tgz", - "integrity": "sha512-fYeYQvbeNn5AQk2RBbpO7koLm2YbS00UYxC/IL2sgLlninEH5UNIv+X3E0KJ1Vy4WIo+dhN9w8GNqSHhbHWCIg==", + "version": "1.2.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.18.tgz", + "integrity": "sha512-K9HiuxZ6xCwSaHcIuUpxyhy4w5gpwzWjh9dHTSbMN3Ix4qAyVObS9RlU3zMycb0PO3v9Tpk0BXMwWvXOUbVXew==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.11", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collection": "1.1.12", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.14", + "@radix-ui/react-dismissable-layer": "1.1.15", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-controllable-state": "1.2.3", @@ -1540,21 +1874,21 @@ } }, "node_modules/@radix-ui/react-popover": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.18.tgz", - "integrity": "sha512-qdXDes+eHlnMUGlBAAAe5EG7oOQvqsXuq4mq585diMudg80iB+jHbsSeG3+Q4eWNsogNyhqU2p/3i+Y0iEepqg==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.19.tgz", + "integrity": "sha512-jkrTdQVxnIB8fpn0NyyxW9CTB5aCXZZelVz5z+Xmii6g5WxMqS3fInNslZ63puP39+Puu4jYohUK31y3dT87gQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", + "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.14", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-dismissable-layer": "1.1.15", "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.11", + "@radix-ui/react-focus-scope": "1.1.12", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.2", + "@radix-ui/react-popper": "1.3.3", "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-controllable-state": "1.2.3", @@ -1577,15 +1911,15 @@ } }, "node_modules/@radix-ui/react-popper": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.2.tgz", - "integrity": "sha512-3QXNeMkdshed1MR3LNoiCirBywRFPkD8ETJa/HlPuLwSajaQixf2ro+isoDNJlGABg9ug41XuZpINZJIle4XWg==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.3.tgz", + "integrity": "sha512-mS7dGpyjv6b+gsDjLF7e0ia1W4Im1B1hSCy2yuXlHuvnZxHKagfDaobt/KAKt27EpZMit2pss8eJBVyVjEWM+g==", "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.11", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.2", @@ -1633,9 +1967,9 @@ } }, "node_modules/@radix-ui/react-presence": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", - "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.7.tgz", + "integrity": "sha512-zBZ4QM5XG3JRanDmqXYf3MD6th4AFXFmgU6KNMFzUaV6F3uw9I5/zjMUvFriSEn5ewo1nxuibvyxJdmLlDcslA==", "license": "MIT", "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" @@ -1679,12 +2013,12 @@ } }, "node_modules/@radix-ui/react-progress": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.11.tgz", - "integrity": "sha512-KqiGJcFaZDc+BvveAgU3ZhACg2MvSUDrCBx4lRR/ZVRNal0bvt8lBpvnSkep9heeOuF8Qfw3fszLDX4OpQ2NVw==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.12.tgz", + "integrity": "sha512-ZPHyI0JyzoH/rP0tq2uRaIZTj/4s8+kAbqPz+e2N8+ejHvwPJ889dHhqn+vh7PNvNeq+boAoH9yzqeoShzwF2w==", "license": "MIT", "dependencies": { - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-primitive": "2.1.7" }, "peerDependencies": { @@ -1703,18 +2037,18 @@ } }, "node_modules/@radix-ui/react-radio-group": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.4.2.tgz", - "integrity": "sha512-W8Uo9riHnlzLLWy+r2mVHUyuEWqD/+be4PZzbEvaGoFSBDHkm+GYWjtcE6u3AmPKNyfanWpnVfpZ2GqPCdzzsw==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.4.3.tgz", + "integrity": "sha512-WwZFjWV4s3aC1QtR3k04R+oANHtX2q6fgKlc7MCEiDNlnTxCZ3H8k3mHtEgVlOejystwk1WQgarQhNOQZ2bK1g==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", + "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.14", + "@radix-ui/react-roving-focus": "1.1.15", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-previous": "1.1.2", "@radix-ui/react-use-size": "1.1.2" @@ -1735,20 +2069,22 @@ } }, "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.14.tgz", - "integrity": "sha512-8Qcnx9447tx/aCBgw6Jenfqg4Skq+vqab9mCBmuGNipIS5YXvL275wbKEu7+ICYHIlAPgCduUMJH1XOYewKF6Q==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.15.tgz", + "integrity": "sha512-40svmmugfM3mUN7VUDGVE1tQGOhyi8enlGD0CNJEcMM36C1f71PKM21DFgNHUfem0XnA+d8H8oN3Z9ZpJjSslg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.11", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collection": "1.1.12", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-is-hydrated": "0.1.1", + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -1766,17 +2102,17 @@ } }, "node_modules/@radix-ui/react-scroll-area": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.13.tgz", - "integrity": "sha512-7tncSubo2G0UY1e8rk+72qe3XRzrGnOLtZQ1PL1KoBfRUNX0NrJT5akb+0kfwSCc3gVR4wdHqyhAQBDpDNOwDw==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.14.tgz", + "integrity": "sha512-bBODCWZK7JTbQLHs0uIP4f73wIWatakK4OS33UzkR1x897wu0PuO658a3f+6P2GEGyDzGYMuHRatMVoAk9WZTw==", "license": "MIT", "dependencies": { "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.4", + "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.2" @@ -1797,24 +2133,24 @@ } }, "node_modules/@radix-ui/react-select": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.2.tgz", - "integrity": "sha512-brXD6C/V0fVK0DDbscLVw6LsXrjQ+ay8jdOBaN+tLb4vsHsAMm6Gt6eT77wHX1Eq8GPtD5rJ+RxFtfDozsb4+Q==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.3.tgz", + "integrity": "sha512-L5RQTXz6Anxsf9CCv+pTgiAsUpyVj7rJxsGtmhFaEOJ++cVfXucv4qWfsIO0AIB4NAhi3yovWGVMKKS1Xf1Wrg==", "license": "MIT", "dependencies": { "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.11", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collection": "1.1.12", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.14", + "@radix-ui/react-dismissable-layer": "1.1.15", "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.11", + "@radix-ui/react-focus-scope": "1.1.12", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.2", + "@radix-ui/react-popper": "1.3.3", "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-callback-ref": "1.1.2", @@ -1864,16 +2200,16 @@ } }, "node_modules/@radix-ui/react-slider": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.4.2.tgz", - "integrity": "sha512-qt5C1ppJz66aUDrH1VccjPrq7aFchK0wBrn6xsxlCHNUyE57dRRQ7lp1QFpF7OscMexZF8MCGBTVBlENHPkNiA==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.4.3.tgz", + "integrity": "sha512-CWVVj+XaTom0SKCqw1EUgb0NuiLwS+N3OFG73mVEezKEjgNIvZiu0EevMelSSU+CbX3owbqJweG2gPU31WGC5A==", "license": "MIT", "dependencies": { "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.11", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collection": "1.1.12", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3", @@ -1915,14 +2251,14 @@ } }, "node_modules/@radix-ui/react-switch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.3.2.tgz", - "integrity": "sha512-tgRBI3DdNwAJYE4BBZyZcz/HRRCvAsPkRvG1wvKc+41tBGMxPn/a87T/wikXAvyDypNQ9kaZwHbeZe+veHCGpA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.3.3.tgz", + "integrity": "sha512-1+mlB4/lxJfk5tgJ4g+R5mUCbRpPE1T9+UsEyeLYbGgMtwiMgmuTnfKz4Mw1nHALHjuwyxw4MLd4cSHn6pNSlQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", + "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-previous": "1.1.2", @@ -1944,18 +2280,18 @@ } }, "node_modules/@radix-ui/react-tabs": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.16.tgz", - "integrity": "sha512-v3Ab2l7z6U7tRB4xA0IyKdq0OsqaO1o9ZjsIEoKKnSZ/l96mZz8aCTX0NCXw+YVHJXr8Km4d+Mn6/Q8YjXa+gw==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.17.tgz", + "integrity": "sha512-nRyXnrAVCwjeXcHbvEbLS6ndbTeKHG1RqCP4A8Gw5L4cemDzPXdD8rAmr6wet0v57R69wGvuIIsFjHSVkZiMzQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.14", + "@radix-ui/react-roving-focus": "1.1.15", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { @@ -1974,12 +2310,12 @@ } }, "node_modules/@radix-ui/react-toggle": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.13.tgz", - "integrity": "sha512-bI2ILJrzwgmAsH05TsJ9pVrzqQwAip7OM2/krqAdYn0R16bl86UPWbe5VPHsALat0EnqpV01cGtkleaUKPNdNg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.14.tgz", + "integrity": "sha512-QI/hB65XKWACA66P64A+aHxtLUgHJeJLkaQa+awUNXT6T3swndtY5DojeHA+vldrTspMTtFBd7HfZ9QGbM1Qrw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", + "@radix-ui/primitive": "1.1.5", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3" }, @@ -1999,17 +2335,17 @@ } }, "node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.14.tgz", - "integrity": "sha512-TK1vusNKb8IRhF23FTbRgUNZ9zfs5rGIyI7LfR3h26p9LrQ060i0uW9QWeD8baZMddaaP0DBGlIa6pbZG+mitg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.15.tgz", + "integrity": "sha512-gIC5Q+Xljg7lmUdzSuDoy0t97yZn1sZl00Ra37ZvKrYdWnQLU6sWLd09yG8cIB9jUAlQfHgJ2ACAG00MFwsqSQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-context": "1.1.4", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-context": "1.2.0", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.14", - "@radix-ui/react-toggle": "1.1.13", + "@radix-ui/react-roving-focus": "1.1.15", + "@radix-ui/react-toggle": "1.1.14", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { @@ -2028,19 +2364,19 @@ } }, "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.11.tgz", - "integrity": "sha512-8XZ6Py3y3W2nEzAUGCN5cfVKaUi+CVApcz1d6lrNVVf2hvYEixMRkq8k9ggPKnQUpRRuOV5avt8uvxViH2jLwA==", + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.12.tgz", + "integrity": "sha512-U3HoftgWnmla78vzQbLvKKb7bUYJxoiiqYFzp1wu/TBMyDqMZSuCl3aRICsD6EfVEwcJD2mumGDGUXLFVqQHKA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", + "@radix-ui/primitive": "1.1.5", "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.14", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-dismissable-layer": "1.1.15", "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.2", + "@radix-ui/react-popper": "1.3.3", "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.6", + "@radix-ui/react-presence": "1.1.7", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-controllable-state": "1.2.3", @@ -2224,9 +2560,9 @@ "license": "MIT" }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.3.tgz", - "integrity": "sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", + "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", "cpu": [ "arm64" ], @@ -2240,9 +2576,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.3.tgz", - "integrity": "sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", "cpu": [ "arm64" ], @@ -2256,9 +2592,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.3.tgz", - "integrity": "sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", "cpu": [ "x64" ], @@ -2272,9 +2608,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.3.tgz", - "integrity": "sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", + "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", "cpu": [ "x64" ], @@ -2288,9 +2624,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.3.tgz", - "integrity": "sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", + "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", "cpu": [ "arm" ], @@ -2304,12 +2640,15 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.3.tgz", - "integrity": "sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2320,12 +2659,15 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.3.tgz", - "integrity": "sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", "cpu": [ "arm64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2336,12 +2678,15 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.3.tgz", - "integrity": "sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", + "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", "cpu": [ "ppc64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2352,12 +2697,15 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.3.tgz", - "integrity": "sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", + "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", "cpu": [ "s390x" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2368,12 +2716,15 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.3.tgz", - "integrity": "sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2384,12 +2735,15 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.3.tgz", - "integrity": "sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", "cpu": [ "x64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2400,9 +2754,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.3.tgz", - "integrity": "sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", + "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", "cpu": [ "arm64" ], @@ -2416,9 +2770,9 @@ } }, "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.3.tgz", - "integrity": "sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", + "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", "cpu": [ "wasm32" ], @@ -2455,9 +2809,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.3.tgz", - "integrity": "sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", "cpu": [ "arm64" ], @@ -2471,9 +2825,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.3.tgz", - "integrity": "sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", "cpu": [ "x64" ], @@ -2633,6 +2987,9 @@ "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2649,6 +3006,9 @@ "cpu": [ "arm64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2665,6 +3025,9 @@ "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2681,6 +3044,9 @@ "cpu": [ "x64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2756,7 +3122,6 @@ "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.2.tgz", "integrity": "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==", "license": "MIT", - "peer": true, "dependencies": { "@tailwindcss/node": "4.3.2", "@tailwindcss/oxide": "4.3.2", @@ -2766,6 +3131,86 @@ "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, + "node_modules/@tanstack/devtools-client": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@tanstack/devtools-client/-/devtools-client-0.0.8.tgz", + "integrity": "sha512-cG3iZkGWCwN330bLBKa8+9r4Of2AXNoz2zUqcsy/4XsD3105ghVBx78cGyvJj9fSclNomPxoqAnDGXXhg1WLvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tanstack/devtools-event-client": "^0.5.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/devtools-event-bus": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@tanstack/devtools-event-bus/-/devtools-event-bus-0.4.2.tgz", + "integrity": "sha512-2LHzhwBFlKHCcklsQrGe8TeyjHd4XAF8nuCO6wHmva5fePUkJUULbu6CsCNAlGlCi0KkEsMXZSvRdR4HgMq4yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ws": "^8.18.3" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/devtools-event-client": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@tanstack/devtools-event-client/-/devtools-event-client-0.5.0.tgz", + "integrity": "sha512-H+OH3zC6Vhu/K0NaVfQKknEKawc/+2PT+D3SB3Ox0V8SiMlTo0abbmH2rH0721R2aNYbjdMXA1oENOd8E2UVoA==", + "dev": true, + "license": "MIT", + "bin": { + "intent": "bin/intent.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/devtools-vite": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@tanstack/devtools-vite/-/devtools-vite-0.8.1.tgz", + "integrity": "sha512-oQxOo0fI0bwhHtw/psFlIR0OS/bsKrirBxwnw2vuhCM4bjt3k4EZZsW/lvZ1+Vpouhts7LSyvngnxvGXbQ1sUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tanstack/devtools-client": "0.0.8", + "@tanstack/devtools-event-bus": "0.4.2", + "chalk": "^5.6.2", + "launch-editor": "^2.11.1", + "magic-string": "^0.30.0", + "oxc-parser": "^0.120.0", + "picomatch": "^4.0.3" + }, + "bin": { + "intent": "bin/intent.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/@tanstack/history": { "version": "1.162.0", "resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.162.0.tgz", @@ -2806,14 +3251,14 @@ } }, "node_modules/@tanstack/react-router": { - "version": "1.170.16", - "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.170.16.tgz", - "integrity": "sha512-w6eq1IJklujs1tESazaK/FxH0+H2l8vm/QPuu1cD3oRW/ubgKneQpd7b64ti/8gUyEimzimJQZDmJr6YHfP5+g==", + "version": "1.170.17", + "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.170.17.tgz", + "integrity": "sha512-ppLkjCfSMaeug9rmFRYzOd4TIqWV+yTE7tzIny7alJsSnM7w4lzEZm6eqCehG0SPetpZ0R3K+UnanSmBgOAVcQ==", "license": "MIT", "dependencies": { "@tanstack/history": "1.162.0", "@tanstack/react-store": "^0.9.3", - "@tanstack/router-core": "1.171.13", + "@tanstack/router-core": "1.171.14", "isbot": "^5.1.22" }, "engines": { @@ -2829,20 +3274,19 @@ } }, "node_modules/@tanstack/react-start": { - "version": "1.168.26", - "resolved": "https://registry.npmjs.org/@tanstack/react-start/-/react-start-1.168.26.tgz", - "integrity": "sha512-ZzNecqKWC0p2643/kIcFUdsMrXZ8A4dXm4Yfe9zV/Y0u14MtSkh/Sk76RQYIU5S84VyDyKhHo0Ffh8HQbLdvFw==", + "version": "1.168.27", + "resolved": "https://registry.npmjs.org/@tanstack/react-start/-/react-start-1.168.27.tgz", + "integrity": "sha512-rdGFDqfCW71gyofyAxaYxhelNKmeVjpmbpm0uFYbNHORCa///4aBxi7B7ecShibKv9O4GfJ66MPX5F0ozbm+ig==", "license": "MIT", - "peer": true, "dependencies": { - "@tanstack/react-router": "1.170.16", - "@tanstack/react-start-client": "1.168.14", - "@tanstack/react-start-rsc": "0.1.25", - "@tanstack/react-start-server": "1.167.20", + "@tanstack/react-router": "1.170.17", + "@tanstack/react-start-client": "1.168.15", + "@tanstack/react-start-rsc": "0.1.26", + "@tanstack/react-start-server": "1.167.21", "@tanstack/router-utils": "1.162.2", - "@tanstack/start-client-core": "1.170.12", - "@tanstack/start-plugin-core": "1.171.18", - "@tanstack/start-server-core": "1.169.15", + "@tanstack/start-client-core": "1.170.13", + "@tanstack/start-plugin-core": "1.171.19", + "@tanstack/start-server-core": "1.169.16", "pathe": "^2.0.3" }, "engines": { @@ -2871,14 +3315,14 @@ } }, "node_modules/@tanstack/react-start-client": { - "version": "1.168.14", - "resolved": "https://registry.npmjs.org/@tanstack/react-start-client/-/react-start-client-1.168.14.tgz", - "integrity": "sha512-oaz43fdOhBWfOPsdLkp3IejwYEXRyeaZ4CYexOPZx3eVXzm4LLozvNkkkBE9aje1sM5MVC2Yo6+cyv2HdVzkHQ==", + "version": "1.168.15", + "resolved": "https://registry.npmjs.org/@tanstack/react-start-client/-/react-start-client-1.168.15.tgz", + "integrity": "sha512-pW50PHvadgi50iNCw6deUOvqc9rzs30SstyFZY2tcS9z1XlqTlELSvGowjxdu2m0ymtqm1emj1jau1iP7+3+PQ==", "license": "MIT", "dependencies": { - "@tanstack/react-router": "1.170.16", - "@tanstack/router-core": "1.171.13", - "@tanstack/start-client-core": "1.170.12" + "@tanstack/react-router": "1.170.17", + "@tanstack/router-core": "1.171.14", + "@tanstack/start-client-core": "1.170.13" }, "engines": { "node": ">=22.12.0" @@ -2893,19 +3337,19 @@ } }, "node_modules/@tanstack/react-start-rsc": { - "version": "0.1.25", - "resolved": "https://registry.npmjs.org/@tanstack/react-start-rsc/-/react-start-rsc-0.1.25.tgz", - "integrity": "sha512-Rwm6cjcS148y2XAebr8jyrwU0SqsRSkW4/CuXesoHg+G3IOnVRHV0HOylJfnznUTVuH1nVhfQRPI5uWPJaw2TA==", + "version": "0.1.26", + "resolved": "https://registry.npmjs.org/@tanstack/react-start-rsc/-/react-start-rsc-0.1.26.tgz", + "integrity": "sha512-+FMm3qtT1gWsl0i5sG/Q70mh1k7tzZUsPBaqbg4v34zVJZ+XGn1mJb34x2w7z1M0/e7co6GkZfV8BRpczrs8UA==", "license": "MIT", "dependencies": { - "@tanstack/react-router": "1.170.16", - "@tanstack/router-core": "1.171.13", + "@tanstack/react-router": "1.170.17", + "@tanstack/router-core": "1.171.14", "@tanstack/router-utils": "1.162.2", - "@tanstack/start-client-core": "1.170.12", + "@tanstack/start-client-core": "1.170.13", "@tanstack/start-fn-stubs": "1.162.0", - "@tanstack/start-plugin-core": "1.171.18", - "@tanstack/start-server-core": "1.169.15", - "@tanstack/start-storage-context": "1.167.15", + "@tanstack/start-plugin-core": "1.171.19", + "@tanstack/start-server-core": "1.169.16", + "@tanstack/start-storage-context": "1.167.16", "pathe": "^2.0.3" }, "engines": { @@ -2935,14 +3379,14 @@ } }, "node_modules/@tanstack/react-start-server": { - "version": "1.167.20", - "resolved": "https://registry.npmjs.org/@tanstack/react-start-server/-/react-start-server-1.167.20.tgz", - "integrity": "sha512-hg9xVI6yNDu+6NCalKz1h3Ea18HZEUu35i/ZMJz1WadwqcArLMp41nM1GNhOAtGIdpycrp9tT7ccqc9zuRMRpQ==", + "version": "1.167.21", + "resolved": "https://registry.npmjs.org/@tanstack/react-start-server/-/react-start-server-1.167.21.tgz", + "integrity": "sha512-puJ7eFxaLuDzeM/tiLDJaXCA4uK+PZnEOoIC73zipsFqx865MGzrRS/GSZxeVxjavC5iHU+ZwC+rgI0qYSol1A==", "license": "MIT", "dependencies": { - "@tanstack/react-router": "1.170.16", - "@tanstack/router-core": "1.171.13", - "@tanstack/start-server-core": "1.169.15" + "@tanstack/react-router": "1.170.17", + "@tanstack/router-core": "1.171.14", + "@tanstack/start-server-core": "1.169.16" }, "engines": { "node": ">=22.12.0" @@ -2975,9 +3419,9 @@ } }, "node_modules/@tanstack/router-core": { - "version": "1.171.13", - "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.171.13.tgz", - "integrity": "sha512-+NOwEj1kO/6IGmpHRIZHasYxYWpyBQGNIZAST9aNrk9Q3YlU9SgqVnl1pbLa9qAKfeNdXQIRve0RQb/0kyDeDA==", + "version": "1.171.14", + "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.171.14.tgz", + "integrity": "sha512-Mo3hwx0qB0cJsVYGDjG0+Ouf7VV74h/vsoDMGztdlyzDanp4gBA2s7IVvm6hFrmQM6GpD9F0Z7SqD7OldfLE7g==", "license": "MIT", "dependencies": { "@tanstack/history": "1.162.0", @@ -2994,13 +3438,13 @@ } }, "node_modules/@tanstack/router-generator": { - "version": "1.167.17", - "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.167.17.tgz", - "integrity": "sha512-xtB9tB2Ws0tWR6Pi7nc3Qk9IYgoh1mQCKWjHqIl9tf6BNUpKoqniJoPAQ4+LGrK8FeZYU0o0p/qlZEyj9FAulA==", + "version": "1.167.18", + "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.167.18.tgz", + "integrity": "sha512-kFvM4caRds9Q3EXg64bZubJ6rbDxyV0YDSBSGvOGzmKspQPdz5Xrh0uj5T1Ov8avUUg+c761u04VQAaEzSBXRw==", "license": "MIT", "dependencies": { "@babel/types": "^7.28.5", - "@tanstack/router-core": "1.171.13", + "@tanstack/router-core": "1.171.14", "@tanstack/router-utils": "1.162.2", "@tanstack/virtual-file-routes": "1.162.0", "jiti": "^2.7.0", @@ -3026,16 +3470,16 @@ } }, "node_modules/@tanstack/router-plugin": { - "version": "1.168.18", - "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.168.18.tgz", - "integrity": "sha512-MofS28/axfnfnhOD2RSgJEaU882aX5RsAzhGz5Vc4XhAmvCjy919u9JrNs4QsTWFbTD1P7IJ8WFlFVsrg0pStg==", + "version": "1.168.19", + "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.168.19.tgz", + "integrity": "sha512-aFglwLc+bbPTgZlkXn3PvOwpjJAfgUyPGSuql4MP3XrqTTh6WkBiy2RYb6oaG5h0s7EKwivEuq85K3Y4V0Mt1g==", "license": "MIT", "dependencies": { "@babel/core": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", - "@tanstack/router-core": "1.171.13", - "@tanstack/router-generator": "1.167.17", + "@tanstack/router-core": "1.171.14", + "@tanstack/router-generator": "1.167.18", "@tanstack/router-utils": "1.162.2", "chokidar": "^5.0.0", "unplugin": "^3.0.0", @@ -3050,7 +3494,7 @@ }, "peerDependencies": { "@rsbuild/core": ">=1.0.2 || ^2.0.0", - "@tanstack/react-router": "^1.170.15", + "@tanstack/react-router": "^1.170.17", "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0", "vite-plugin-solid": "^2.11.10 || ^3.0.0-0", "webpack": ">=5.92.0" @@ -3106,14 +3550,14 @@ } }, "node_modules/@tanstack/start-client-core": { - "version": "1.170.12", - "resolved": "https://registry.npmjs.org/@tanstack/start-client-core/-/start-client-core-1.170.12.tgz", - "integrity": "sha512-gwtZRMPUIAxmDV2AIQUhC0kSW262SV7BkHXEgy5B1woHQdrdsELuGOdJwdweLxrjyefORxk+9MYGqDY0Cxn0bw==", + "version": "1.170.13", + "resolved": "https://registry.npmjs.org/@tanstack/start-client-core/-/start-client-core-1.170.13.tgz", + "integrity": "sha512-o37M3msIK5ec87kPrIYJWXb1XPnjIe5/jrkGLXiXpFuVL99z7mhoBCzftKtVPtzqI8EElnRE/VGFYT9BHNnWcw==", "license": "MIT", "dependencies": { - "@tanstack/router-core": "1.171.13", + "@tanstack/router-core": "1.171.14", "@tanstack/start-fn-stubs": "1.162.0", - "@tanstack/start-storage-context": "1.167.15", + "@tanstack/start-storage-context": "1.167.16", "seroval": "^1.5.4" }, "engines": { @@ -3138,19 +3582,19 @@ } }, "node_modules/@tanstack/start-plugin-core": { - "version": "1.171.18", - "resolved": "https://registry.npmjs.org/@tanstack/start-plugin-core/-/start-plugin-core-1.171.18.tgz", - "integrity": "sha512-weuOOjRD03BiKcF9NYKL5QADEQOp3yGHb0qIsOX42ENz5XUE4in2fXcVYHjSwwpzs+XGhWIFLp5J385pOVPuZQ==", + "version": "1.171.19", + "resolved": "https://registry.npmjs.org/@tanstack/start-plugin-core/-/start-plugin-core-1.171.19.tgz", + "integrity": "sha512-+fpW3Z/2vPT8HDV1c5p2WC6/g2k/AV/ujdJVDcn/VFd+gXRtzSX1D/LfozlaDbhDoEsqOnAk/mGwjg60JkUA2Q==", "license": "MIT", "dependencies": { "@babel/code-frame": "7.27.1", "@babel/core": "^7.28.5", "@babel/types": "^7.28.5", - "@tanstack/router-core": "1.171.13", - "@tanstack/router-generator": "1.167.17", - "@tanstack/router-plugin": "1.168.18", + "@tanstack/router-core": "1.171.14", + "@tanstack/router-generator": "1.167.18", + "@tanstack/router-plugin": "1.168.19", "@tanstack/router-utils": "1.162.2", - "@tanstack/start-server-core": "1.169.15", + "@tanstack/start-server-core": "1.169.16", "exsolve": "^1.0.7", "lightningcss": "^1.32.0", "pathe": "^2.0.3", @@ -3208,15 +3652,15 @@ } }, "node_modules/@tanstack/start-server-core": { - "version": "1.169.15", - "resolved": "https://registry.npmjs.org/@tanstack/start-server-core/-/start-server-core-1.169.15.tgz", - "integrity": "sha512-V8ie2G2Ecb3Nklk8/QuKzulxb+tDUqgz6rjJe8Isdp4iKVXZu/TscItkUP/4Q5Bu7W4gUy3P25O6soC1oW1SXQ==", + "version": "1.169.16", + "resolved": "https://registry.npmjs.org/@tanstack/start-server-core/-/start-server-core-1.169.16.tgz", + "integrity": "sha512-lvAjQpH3nHJtd4xy0iHIaWbsTbyN9EBxuYCxbtXH0EpeBQPg+TCPhu9GQC9WbbA1rE//s82CpE55oYDQMqkU5A==", "license": "MIT", "dependencies": { "@tanstack/history": "1.162.0", - "@tanstack/router-core": "1.171.13", - "@tanstack/start-client-core": "1.170.12", - "@tanstack/start-storage-context": "1.167.15", + "@tanstack/router-core": "1.171.14", + "@tanstack/start-client-core": "1.170.13", + "@tanstack/start-storage-context": "1.167.16", "fetchdts": "^0.1.6", "h3-v2": "npm:h3@2.0.1-rc.20", "seroval": "^1.5.4" @@ -3230,12 +3674,12 @@ } }, "node_modules/@tanstack/start-storage-context": { - "version": "1.167.15", - "resolved": "https://registry.npmjs.org/@tanstack/start-storage-context/-/start-storage-context-1.167.15.tgz", - "integrity": "sha512-Jy0q4vdG6pv76N92+X+ag3fuOV2zINQagYyMN1/es7tPI1vzpKECIU8AqHqzI6ahkwaph7XDvmfUkiLJ3i4LOA==", + "version": "1.167.16", + "resolved": "https://registry.npmjs.org/@tanstack/start-storage-context/-/start-storage-context-1.167.16.tgz", + "integrity": "sha512-zTegxlij4BC1DbCrC6rsVlMOQVMzOuG5IllacZEkrUdhiFwMIMYpk0VWGH+d0ucx5RBkmv8e8GNX3AOVBWclfg==", "license": "MIT", "dependencies": { - "@tanstack/router-core": "1.171.13" + "@tanstack/router-core": "1.171.14" }, "engines": { "node": ">=22.12.0" @@ -3411,9 +3855,9 @@ } }, "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", "license": "MIT", "dependencies": { "@types/unist": "*" @@ -3442,12 +3886,11 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.20.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.0.tgz", - "integrity": "sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==", + "version": "22.20.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", + "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -3457,7 +3900,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -3468,7 +3910,6 @@ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "devOptional": true, "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -3480,17 +3921,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.62.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.62.1.tgz", - "integrity": "sha512-4EQM77WgVNxj7OkL/5b/D/xZsw00G577+UriYTC7JF5opcF3T2AuoeY7ueLaZgSVjSgCS6yOAJB5bRGLPSJUzA==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.63.0.tgz", + "integrity": "sha512-rvwSgqT+DHpWdzfSzPatRLm02a0GlESt++9iy3hLCDY4BgkaLcl8LBi9Yh7XGFBpwcBE/K3024QuXWTpbz4FfQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.62.1", - "@typescript-eslint/type-utils": "8.62.1", - "@typescript-eslint/utils": "8.62.1", - "@typescript-eslint/visitor-keys": "8.62.1", + "@typescript-eslint/scope-manager": "8.63.0", + "@typescript-eslint/type-utils": "8.63.0", + "@typescript-eslint/utils": "8.63.0", + "@typescript-eslint/visitor-keys": "8.63.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -3503,15 +3944,15 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.62.1", + "@typescript-eslint/parser": "^8.63.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", "dev": true, "license": "MIT", "engines": { @@ -3519,17 +3960,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.62.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.62.1.tgz", - "integrity": "sha512-sPhE4iHuJDSvoAiec+Ro8JyXw8f0ql13HFR82P99nCm9GwTEKG0KYLvDe6REk8BCXuit6vJAv/Yxg5ABaNS2rA==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.63.0.tgz", + "integrity": "sha512-gwh4gvvlaVDKKxyfxMG+Gnu1u9X0OQBwyGLkbwB65dIzBKnxeRiJlNFqlI3zwVhNXJIs6qV7mlFCn/BIajlVig==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.62.1", - "@typescript-eslint/types": "8.62.1", - "@typescript-eslint/typescript-estree": "8.62.1", - "@typescript-eslint/visitor-keys": "8.62.1", + "@typescript-eslint/scope-manager": "8.63.0", + "@typescript-eslint/types": "8.63.0", + "@typescript-eslint/typescript-estree": "8.63.0", + "@typescript-eslint/visitor-keys": "8.63.0", "debug": "^4.4.3" }, "engines": { @@ -3545,14 +3985,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.62.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.62.1.tgz", - "integrity": "sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.63.0.tgz", + "integrity": "sha512-e5dh0/UI0ok53AlZ5wRkXCB32z/f2jUZqPR/ygAw5WYaSw8j9EoJWlS7wQjr/dmOaqWjnPIn2m+HhVPCMWGZVQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.62.1", - "@typescript-eslint/types": "^8.62.1", + "@typescript-eslint/tsconfig-utils": "^8.63.0", + "@typescript-eslint/types": "^8.63.0", "debug": "^4.4.3" }, "engines": { @@ -3567,14 +4007,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.62.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.62.1.tgz", - "integrity": "sha512-r4d249KbQ1SFdpeStvob8Ih6aPPIzfqllPVOtvhve6ZcpuVcYo5/7zUWckKpHE7StASX4kTKZTLf0WQm/wPkcg==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.63.0.tgz", + "integrity": "sha512-uUyfMWCnDSN8bCpcrY8nGP2BLkQ9Xn0GsipcONcpIDWhwhO4ZSyHvyS14U3X75mzxWxL3I2UZIrenTzdzcJO8A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.62.1", - "@typescript-eslint/visitor-keys": "8.62.1" + "@typescript-eslint/types": "8.63.0", + "@typescript-eslint/visitor-keys": "8.63.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3585,9 +4025,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.62.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.62.1.tgz", - "integrity": "sha512-xadytJqX9vJVQ2fdQjkcIVigwaOJNWkpjdLt6cEQ+xPnrI1fkp+/jZE/I97k9KUjqtpd25i0HeyZf3T6dutv2g==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.63.0.tgz", + "integrity": "sha512-sUAbkulqBAsncKnbRP3+7CtQFRKicexnj7ZwNC6ddCR7EmrXvjvdCYMJbUIqMd6lwoEriZjwLo08aS5tSjVMHg==", "dev": true, "license": "MIT", "engines": { @@ -3602,15 +4042,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.62.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.62.1.tgz", - "integrity": "sha512-aXM5xlqXiTxPibXB93cLAURfT3rlizf7uMXISCXy66Isr/9hISJx3yDsKl0L7lKa51b8JpFuNKby0/O0pEm9jg==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.63.0.tgz", + "integrity": "sha512-Nzzh/OGxVCOjObjaj1CQF2RUasyYy2Jfuh+zZ3PjLzG2fYRriAiZLib9UKtO+CpQAS3YHiAS+ckZDclwqI1TPA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.62.1", - "@typescript-eslint/typescript-estree": "8.62.1", - "@typescript-eslint/utils": "8.62.1", + "@typescript-eslint/types": "8.63.0", + "@typescript-eslint/typescript-estree": "8.63.0", + "@typescript-eslint/utils": "8.63.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -3627,9 +4067,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.62.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.62.1.tgz", - "integrity": "sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.63.0.tgz", + "integrity": "sha512-xyLtl9DUBBFrcJS4x2pIqGLH68/tC2uOa4Z7pUteW09D3bXnnXUom4dyPikzWgB7llmIc1zoeI3aoUdC4rPK/Q==", "dev": true, "license": "MIT", "engines": { @@ -3641,16 +4081,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.62.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.62.1.tgz", - "integrity": "sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.63.0.tgz", + "integrity": "sha512-ygBkU+B7ex5UI/gKhaqexWev79uISfIv7XQCRNYO/jmD8rGLPyWLAb3KMRT6nd8Gt9bmUBi9+iX6tBdYfOY81Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.62.1", - "@typescript-eslint/tsconfig-utils": "8.62.1", - "@typescript-eslint/types": "8.62.1", - "@typescript-eslint/visitor-keys": "8.62.1", + "@typescript-eslint/project-service": "8.63.0", + "@typescript-eslint/tsconfig-utils": "8.63.0", + "@typescript-eslint/types": "8.63.0", + "@typescript-eslint/visitor-keys": "8.63.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -3721,16 +4161,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.62.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.62.1.tgz", - "integrity": "sha512-sHtbPfuKNZCG+ih8SyjjucqRntSVmp8XgL5u6o9mAhiSn8ds5o/M/XdM0abweme2Tln3szOstOrZ9OXitvPh0g==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.63.0.tgz", + "integrity": "sha512-fUKaeAvrTuQg/Tgt3nliAUSZHJM6DlCcfyEmxCvlX8kieWSStBX+5O5Fnidtc3i2JrH+9c/GL4RY2iasd/GPTA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.62.1", - "@typescript-eslint/types": "8.62.1", - "@typescript-eslint/typescript-estree": "8.62.1" + "@typescript-eslint/scope-manager": "8.63.0", + "@typescript-eslint/types": "8.63.0", + "@typescript-eslint/typescript-estree": "8.63.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3745,13 +4185,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.62.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.62.1.tgz", - "integrity": "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.63.0.tgz", + "integrity": "sha512-UexrHGnGTpbuQHct2ExOc2ZcFbGUS9FOesCxxqdBGcpI1BxYu/LZ6U8Aq6/72XtF/qRBk9nhuGHFJIXXMhPMdw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/types": "8.63.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -3776,9 +4216,9 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", - "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", "license": "ISC" }, "node_modules/@vitejs/plugin-react": { @@ -3787,7 +4227,6 @@ "integrity": "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.29.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", @@ -3809,7 +4248,6 @@ "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3869,47 +4307,6 @@ "node": ">=14" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true, - "license": "MIT" - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -3958,9 +4355,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.40", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz", - "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==", + "version": "2.10.42", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz", + "integrity": "sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -3969,23 +4366,10 @@ "node": ">=6.0.0" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -3993,23 +4377,10 @@ "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.28.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", - "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.5.tgz", + "integrity": "sha512-Cu2E6QejHWzuDMTkuwgpABFgDfZrXLQq5V13YOACZx4mFAG4IwGTbTfHPMr4WtxlHoXSM8FIuRwYYCz5XiabaQ==", "funding": [ { "type": "opencollective", @@ -4025,12 +4396,11 @@ } ], "license": "MIT", - "peer": true, "dependencies": { - "baseline-browser-mapping": "^2.10.38", - "caniuse-lite": "^1.0.30001799", - "electron-to-chromium": "^1.5.376", - "node-releases": "^2.0.48", + "baseline-browser-mapping": "^2.10.42", + "caniuse-lite": "^1.0.30001800", + "electron-to-chromium": "^1.5.387", + "node-releases": "^2.0.50", "update-browserslist-db": "^1.2.3" }, "bin": { @@ -4050,20 +4420,10 @@ "node": ">=6" } }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/caniuse-lite": { - "version": "1.0.30001800", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001800.tgz", - "integrity": "sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==", + "version": "1.0.30001803", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001803.tgz", + "integrity": "sha512-g/uHREV2ZpK9qMalCsWaxmA6ol+DX8GYhuf3T40RKoP+oL7vhRJh8LNt73PCjpnR6l14FzfPrB5Yux4PKm2meg==", "funding": [ { "type": "opencollective", @@ -4091,17 +4451,13 @@ } }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" @@ -4229,16 +4585,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4284,12 +4630,11 @@ } }, "node_modules/crossws": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.4.7.tgz", - "integrity": "sha512-N+BXE5AetLJ3/glz4DYLirKApAWg+V2guueoMenvAGVvqF/IA1PAzMYqYS+UfBkdz3tDXoQIevDaaxLy1Ch/4w==", + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.4.9.tgz", + "integrity": "sha512-iWx+1OMSG2aOHpjyf9AESOzkwsVdS49cXM9dVrI2PDhxU5l2RIWE/KG56gk4BbAnsMoycvniJ9OnOxO9LRzHVA==", "devOptional": true, "license": "MIT", - "peer": true, "peerDependencies": { "srvx": ">=0.11.5" }, @@ -4299,19 +4644,6 @@ } } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", @@ -4461,7 +4793,6 @@ "integrity": "sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "@electric-sql/pglite": "*", "@libsql/client": "*", @@ -4571,13 +4902,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/diff": { "version": "8.0.4", "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", @@ -4587,13 +4911,6 @@ "node": ">=0.3.1" } }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "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", @@ -4605,17 +4922,16 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.383", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.383.tgz", - "integrity": "sha512-I2484/KkAvl8lm9VyjH2JnbOIV0d/UCqT7gbzs6l+o6Vmn9wgB66uVcKX+Vk6HrXtY6fbWTOEXuv8waDTuFNCw==", + "version": "1.5.389", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.389.tgz", + "integrity": "sha512-cEto7aeOqBfU1D+c5py5pE+ooscKE75JifxLBdFUZsqAxRS6y7kebtxAZvICszSl05gPjYHDTjY+lXpyGvpJbg==", "license": "ISC" }, "node_modules/embla-carousel": { "version": "8.6.0", "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/embla-carousel-react": { "version": "8.6.0", @@ -4653,16 +4969,16 @@ } }, "node_modules/env-runner": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/env-runner/-/env-runner-0.1.15.tgz", - "integrity": "sha512-Xiu7VUW1jlwEiZSGWJ5Wuv9D4iSC2JwIB3Bb/RI+1DBSCeCrCpdAwRvsi3e52wETPUBkV61b0Ixfi593hQmQ6w==", + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/env-runner/-/env-runner-0.1.16.tgz", + "integrity": "sha512-2LRJM4P2KLX6J83QZZrMqvgCDt/D5ea7wPcI3yYiy5cG/9rX5QwdwZFx0D7ktWnjdRyZxYjttGGorb5nFqb1CA==", "dev": true, "license": "MIT", "dependencies": { - "crossws": "^0.4.6", + "crossws": "^0.4.8", "exsolve": "^1.1.0", - "httpxy": "^0.5.3", - "srvx": "^0.11.17" + "httpxy": "^0.5.4", + "srvx": "^0.11.19" }, "bin": { "env-runner": "dist/cli.mjs" @@ -4688,16 +5004,6 @@ } } }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -4721,20 +5027,19 @@ } }, "node_modules/eslint": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", - "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.5", - "@eslint/js": "9.39.4", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -4787,7 +5092,6 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", - "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -4882,6 +5186,23 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -4989,44 +5310,14 @@ "license": "Apache-2.0" }, "node_modules/fast-equals": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", - "integrity": "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.1.tgz", + "integrity": "sha512-DjlFSM5Pk9cGcL0q5QXl66eGzx0N6szNgaswwc5ZphlBohjTVJSnGgI+rJVOgOi65qUoQnDZN4nDqi33udtydQ==", "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", @@ -5041,16 +5332,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -5087,19 +5368,6 @@ "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", @@ -5179,16 +5447,6 @@ "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==", - "dev": true, - "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", @@ -5246,14 +5504,14 @@ "license": "ISC" }, "node_modules/h3": { - "version": "2.0.1-rc.22", - "resolved": "https://registry.npmjs.org/h3/-/h3-2.0.1-rc.22.tgz", - "integrity": "sha512-Esv0DMIuPkCTSWCA0vO73vcTqwzH1wjSrAO1TXNu/K3up1sZHa9EKMapbmxCDYBeymC3fVTk4qxp7ogQWQ+KgA==", + "version": "2.0.1-rc.24", + "resolved": "https://registry.npmjs.org/h3/-/h3-2.0.1-rc.24.tgz", + "integrity": "sha512-saxpbF+/oPUCVvdkrcjiXhH5b7US1tul9qe0w9t6FMMBXYeuTB1tPxSEY8AFsA6g9sT8VmQGN7jERxdX5ew1Ow==", "dev": true, "license": "MIT", "dependencies": { - "rou3": "^0.8.1", - "srvx": "^0.11.15" + "rou3": "^0.9.1", + "srvx": "^0.11.21" }, "bin": { "h3": "bin/h3.mjs" @@ -5262,7 +5520,7 @@ "node": ">=20.11.1" }, "peerDependencies": { - "crossws": "^0.4.1" + "crossws": "^0.4.9" }, "peerDependenciesMeta": { "crossws": { @@ -5295,6 +5553,13 @@ } } }, + "node_modules/h3/node_modules/rou3": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/rou3/-/rou3-0.9.1.tgz", + "integrity": "sha512-z/sSmzvtwMDDnxsPVhfWMuG6F6mbmhFDXoVqLmMfbpDD9qfV3GDmSQpf0+W296/ZDIpW2wcMmBfpVFzcnOi/nA==", + "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", @@ -5305,19 +5570,6 @@ "node": ">=8" } }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/hast-util-sanitize": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-5.0.2.tgz", @@ -5391,9 +5643,9 @@ } }, "node_modules/httpxy": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.5.4.tgz", - "integrity": "sha512-URfeibL0kTH6VuIxxaJDXWQWEk8fKr+9L8MGv6CuAiNy0fGnoVhWbXBvJR1mkdsvCDUxvhX9cW60k2AhtH5s6w==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.5.5.tgz", + "integrity": "sha512-uDjmnPyp1q4Sgzf3w+J/Fc6UqcCEj0x4Wjp7OqK5dGhNeDgpyrAmnS6ey8QWrX3SWDon2DMKf9sBa5X9+CVyMA==", "dev": true, "license": "MIT" }, @@ -5483,35 +5735,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-decimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", @@ -5555,16 +5778,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "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/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", @@ -5578,9 +5791,9 @@ } }, "node_modules/isbot": { - "version": "5.1.44", - "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.44.tgz", - "integrity": "sha512-PGEHtwMnKbZpeSEXW2Utx+/JWed7dp6DiH0WWg33vGSDA7RUvpUeJSVlLrVkQ1RCpvDOUc/eH9ql7VsdbBZ8pA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.2.0.tgz", + "integrity": "sha512-gbZiGCb4B5xaoxg9mS7koAyRdvJnArk10VLSHOgz6rtBG93/pi1xOFaVvXMKZ7JXgyZ8zAbNRK5uIBdIUTFSqw==", "license": "Unlicense", "engines": { "node": ">=18" @@ -5685,6 +5898,17 @@ "json-buffer": "3.0.1" } }, + "node_modules/launch-editor": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz", + "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.4" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -5775,879 +5999,261 @@ "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.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "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.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "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.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "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.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "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.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "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.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "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.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "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.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "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/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "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/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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/lottie-react": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lottie-react/-/lottie-react-2.4.1.tgz", - "integrity": "sha512-LQrH7jlkigIIv++wIyrOYFLHSKQpEY4zehPicL9bQsrt1rnoKRYCYgpCUe5maqylNtacy58/sQDZTkwMcTRxZw==", - "license": "MIT", - "dependencies": { - "lottie-web": "^5.10.2" - }, - "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/lottie-web": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.13.0.tgz", - "integrity": "sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==", - "license": "MIT" - }, - "node_modules/lovable-tagger": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/lovable-tagger/-/lovable-tagger-1.2.0.tgz", - "integrity": "sha512-L7Qvc51gYlJSdvdIbUrUw/gsG9JFGBWOmW9vbVYwW7sBnI436p4M50aTh3wpBrdfdR38tHavUSNYLxCm8FBesw==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "tailwindcss": "^3.4.17" - }, - "peerDependencies": { - "vite": ">=5.0.0 <9.0.0" - } - }, - "node_modules/lovable-tagger/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/lovable-tagger/node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/lovable-tagger/node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/lovable-tagger/node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/lovable-tagger/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/lovable-tagger/node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/lovable-tagger/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/lovable-tagger/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/lovable-tagger/node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/lovable-tagger/node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/lovable-tagger/node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/lovable-tagger/node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/lovable-tagger/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/lovable-tagger/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/lovable-tagger/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/lovable-tagger/node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/lovable-tagger/node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/lovable-tagger/node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ - "netbsd" + "darwin" ], "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/lovable-tagger/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", "cpu": [ "x64" ], - "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ - "netbsd" + "freebsd" ], "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/lovable-tagger/node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", "cpu": [ - "arm64" + "arm" ], - "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/lovable-tagger/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", "cpu": [ - "x64" + "arm64" ], - "dev": true, - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "MPL-2.0", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/lovable-tagger/node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", "cpu": [ "arm64" ], - "dev": true, - "license": "MIT", + "libc": [ + "musl" + ], + "license": "MPL-2.0", "optional": true, "os": [ - "openharmony" + "linux" ], "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/lovable-tagger/node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", "cpu": [ "x64" ], - "dev": true, - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "MPL-2.0", "optional": true, "os": [ - "sunos" + "linux" ], "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/lovable-tagger/node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", "cpu": [ - "arm64" + "x64" ], - "dev": true, - "license": "MIT", + "libc": [ + "musl" + ], + "license": "MPL-2.0", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/lovable-tagger/node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", "cpu": [ - "ia32" + "arm64" ], - "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/lovable-tagger/node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", "cpu": [ "x64" ], - "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=18" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/lovable-tagger/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "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": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">= 8.10.0" + "node": ">=10" }, "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lovable-tagger/node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" }, - "node_modules/lovable-tagger/node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/lovable-tagger/node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "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", - "bin": { - "jiti": "bin/jiti.js" - } + "license": "MIT" }, - "node_modules/lovable-tagger/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", "license": "MIT", - "engines": { - "node": ">=8.6" - }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/lovable-tagger/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, + "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": { - "picomatch": "^2.2.1" + "js-tokens": "^3.0.0 || ^4.0.0" }, - "engines": { - "node": ">=8.10.0" + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/lovable-tagger/node_modules/tailwindcss": { - "version": "3.4.19", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", - "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", - "dev": true, + "node_modules/lottie-react": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lottie-react/-/lottie-react-2.4.1.tgz", + "integrity": "sha512-LQrH7jlkigIIv++wIyrOYFLHSKQpEY4zehPicL9bQsrt1rnoKRYCYgpCUe5maqylNtacy58/sQDZTkwMcTRxZw==", "license": "MIT", "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.7", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" + "lottie-web": "^5.10.2" }, - "engines": { - "node": ">=14.0.0" + "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/lottie-web": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.13.0.tgz", + "integrity": "sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==", + "license": "MIT" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -6967,16 +6573,6 @@ "url": "https://opencollective.com/unified" } }, - "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/micromark": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", @@ -7540,33 +7136,6 @@ ], "license": "MIT" }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", @@ -7601,18 +7170,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, "node_modules/nanoid": { "version": "3.3.15", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", @@ -7639,9 +7196,9 @@ "license": "MIT" }, "node_modules/nf3": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/nf3/-/nf3-0.3.18.tgz", - "integrity": "sha512-lFvZrVZXN4FQYoV1iGiZ5RAzfzjbjQvm0MBdLvQKqvnOfkh09btu1tzI/RdIKrdIoRKL12XYlwdbcB0QwM3m6Q==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/nf3/-/nf3-0.3.21.tgz", + "integrity": "sha512-DJ1Ss/jfUdqETSbouezgAyh6NmD3r2NnpX7Vhwz7nPTc8TvqFddJ/tMgYDwhWU4H/vTOUXDYG3sWsB9vGBX/HA==", "dev": true, "license": "MIT" }, @@ -7651,7 +7208,6 @@ "integrity": "sha512-ffaSHK00a7YDlDizoEHwcxPwpQpdBRRA8k42ymTsRnfl3ipGeKgv4gnPr6DgmCNTo4tYVPK3bHBEv1gNhWpo/A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "consola": "^3.4.2", "crossws": "^0.4.5", @@ -7712,13 +7268,11 @@ } }, "node_modules/nitro/node_modules/lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", - "dev": true, + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "extraneous": true, "license": "BlueOak-1.0.0", - "optional": true, - "peer": true, "engines": { "node": "20 || >=22" } @@ -7827,24 +7381,14 @@ } }, "node_modules/node-releases": { - "version": "2.0.50", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", - "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", "license": "MIT", "engines": { "node": ">=18" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -7854,16 +7398,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/ocache": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/ocache/-/ocache-0.1.5.tgz", @@ -7879,8 +7413,7 @@ "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-2.0.0-alpha.3.tgz", "integrity": "sha512-zpYTCs2byOuft65vI3z43Dd6iSdFbOZZLb9/d21aCpx2rGastVU9dOCv0lu4ykc1Ur1anAYjDi3SUvR0vq50JA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ohash": { "version": "2.0.11", @@ -7907,6 +7440,44 @@ "node": ">= 0.8.0" } }, + "node_modules/oxc-parser": { + "version": "0.120.0", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.120.0.tgz", + "integrity": "sha512-WyPWZlcIm+Fkte63FGfgFB8mAAk33aH9h5N9lphXVOHSXEBFFsmYdOBedVKly363aWABjZdaj/m9lBfEY4wt+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "^0.120.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-parser/binding-android-arm-eabi": "0.120.0", + "@oxc-parser/binding-android-arm64": "0.120.0", + "@oxc-parser/binding-darwin-arm64": "0.120.0", + "@oxc-parser/binding-darwin-x64": "0.120.0", + "@oxc-parser/binding-freebsd-x64": "0.120.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.120.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.120.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.120.0", + "@oxc-parser/binding-linux-arm64-musl": "0.120.0", + "@oxc-parser/binding-linux-ppc64-gnu": "0.120.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.120.0", + "@oxc-parser/binding-linux-riscv64-musl": "0.120.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.120.0", + "@oxc-parser/binding-linux-x64-gnu": "0.120.0", + "@oxc-parser/binding-linux-x64-musl": "0.120.0", + "@oxc-parser/binding-openharmony-arm64": "0.120.0", + "@oxc-parser/binding-wasm32-wasi": "0.120.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.120.0", + "@oxc-parser/binding-win32-ia32-msvc": "0.120.0", + "@oxc-parser/binding-win32-x64-msvc": "0.120.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -7997,13 +7568,6 @@ "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==", - "dev": true, - "license": "MIT" - }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -8017,9 +7581,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "license": "MIT", "engines": { "node": ">=12" @@ -8028,26 +7592,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/postcss": { "version": "8.5.16", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", @@ -8067,7 +7611,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", @@ -8077,140 +7620,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", - "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", - "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -8222,11 +7631,10 @@ } }, "node_modules/prettier": { - "version": "3.9.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.4.tgz", - "integrity": "sha512-yWG/o/4oJfo036EKAfK6ACAoDOfHeRHx4tuxkfBZiauURiaSmYwlpOr5LQqKtIkRD2z1PLteme2WoxEnj4tHTg==", + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.5.tgz", + "integrity": "sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==", "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -8287,33 +7695,11 @@ "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.2.7", "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -8345,7 +7731,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -8354,11 +7739,10 @@ } }, "node_modules/react-hook-form": { - "version": "7.80.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.80.0.tgz", - "integrity": "sha512-4P+fk6oXsxY+6xSj7Euhc2sumQD8zQqCuVHoJwoyp9EchP+IUW9OESB7uHFJOKsIBQ4MQqYE84INJFqUCYNoOg==", + "version": "7.81.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.81.0.tgz", + "integrity": "sha512-ocbmr2p5KBMoAfj4WCUvped33lVi1Kd5DuDUvQDnB6VEAacOjPI/jMbtDdbhco4y9ct4xUuCmMY0b/C9L0QHjw==", "license": "MIT", - "peer": true, "engines": { "node": ">=18.0.0" }, @@ -8461,9 +7845,9 @@ } }, "node_modules/react-resizable-panels": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-4.12.0.tgz", - "integrity": "sha512-t/Gp57qSCxGQ52ckhz+8lM7dnuymeU95TEzl2U203qEbGkSLHrtm7US2/ANzq/zOlja3CwPTAfCDuh1unv9mfw==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-4.12.1.tgz", + "integrity": "sha512-ElE/UpOvMLRWtAqbCgyizHXcbws8RPMyN3cBqmdY17Nxr5f01+DEwzOLqhgcy68GSnjtIUFgKWKl8aIgx5aypQ==", "license": "MIT", "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -8523,16 +7907,6 @@ "react-dom": ">=16.6.0" } }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, "node_modules/readdirp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", @@ -8659,28 +8033,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -8691,25 +8043,13 @@ "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/rolldown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.3.tgz", - "integrity": "sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", "license": "MIT", - "peer": true, "dependencies": { - "@oxc-project/types": "=0.137.0", + "@oxc-project/types": "=0.139.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -8719,21 +8059,30 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.1.3", - "@rolldown/binding-darwin-arm64": "1.1.3", - "@rolldown/binding-darwin-x64": "1.1.3", - "@rolldown/binding-freebsd-x64": "1.1.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.1.3", - "@rolldown/binding-linux-arm64-gnu": "1.1.3", - "@rolldown/binding-linux-arm64-musl": "1.1.3", - "@rolldown/binding-linux-ppc64-gnu": "1.1.3", - "@rolldown/binding-linux-s390x-gnu": "1.1.3", - "@rolldown/binding-linux-x64-gnu": "1.1.3", - "@rolldown/binding-linux-x64-musl": "1.1.3", - "@rolldown/binding-openharmony-arm64": "1.1.3", - "@rolldown/binding-wasm32-wasi": "1.1.3", - "@rolldown/binding-win32-arm64-msvc": "1.1.3", - "@rolldown/binding-win32-x64-msvc": "1.1.3" + "@rolldown/binding-android-arm64": "1.1.5", + "@rolldown/binding-darwin-arm64": "1.1.5", + "@rolldown/binding-darwin-x64": "1.1.5", + "@rolldown/binding-freebsd-x64": "1.1.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", + "@rolldown/binding-linux-arm64-gnu": "1.1.5", + "@rolldown/binding-linux-arm64-musl": "1.1.5", + "@rolldown/binding-linux-ppc64-gnu": "1.1.5", + "@rolldown/binding-linux-s390x-gnu": "1.1.5", + "@rolldown/binding-linux-x64-gnu": "1.1.5", + "@rolldown/binding-linux-x64-musl": "1.1.5", + "@rolldown/binding-openharmony-arm64": "1.1.5", + "@rolldown/binding-wasm32-wasi": "1.1.5", + "@rolldown/binding-win32-arm64-msvc": "1.1.5", + "@rolldown/binding-win32-x64-msvc": "1.1.5" + } + }, + "node_modules/rolldown/node_modules/@oxc-project/types": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" } }, "node_modules/rolldown/node_modules/@rolldown/pluginutils": { @@ -8748,30 +8097,6 @@ "integrity": "sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==", "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.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", @@ -8788,19 +8113,18 @@ } }, "node_modules/seroval": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.5.4.tgz", - "integrity": "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.5.5.tgz", + "integrity": "sha512-bSjOuPcwPKLSJNhr9+bZxA20nQxVle5J5MNsYRVE6cIg7KpRLXGupymePavu0jrxlPiPsr4xGZSB8yUY2sH2sw==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" } }, "node_modules/seroval-plugins": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.5.4.tgz", - "integrity": "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.5.5.tgz", + "integrity": "sha512-+BDhqYM6CEn3x09v44dpa9p6974FuUB2dxk+Ctn04k0cO1Zt6QODTXfmEZK0eBaTe/fJBvP4NMGuNJ+R8T+QMg==", "license": "MIT", "engines": { "node": ">=10" @@ -8832,6 +8156,19 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", + "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/sonner": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", @@ -8871,9 +8208,9 @@ } }, "node_modules/srvx": { - "version": "0.11.18", - "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.11.18.tgz", - "integrity": "sha512-7/EW5sPdC1bU7iq1tgTvCZqUQDkJdsqIVzYqBv7SuBfQQ10oWkKj4KYNOw0H4Ig26bXuUYDA7XTKxB+/HC5SRw==", + "version": "0.11.21", + "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.11.21.tgz", + "integrity": "sha512-GWTHjKMeekX8CwJf4VU9Oo6mJpSGaflGMddbCvR+Cmmh9sslRMiGbAoqqZacE0r1ncARh6buCEETr2W52F8b1w==", "license": "MIT", "bin": { "srvx": "bin/srvx.mjs" @@ -8927,29 +8264,6 @@ "inline-style-parser": "0.2.7" } }, - "node_modules/sucrase": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "tinyglobby": "^0.2.11", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8963,19 +8277,6 @@ "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/synckit": { "version": "0.11.13", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", @@ -9021,29 +8322,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/tiny-invariant": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", @@ -9066,19 +8344,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "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/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -9112,13 +8377,6 @@ "typescript": ">=4.8.4" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/tsconfck": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", @@ -9174,7 +8432,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9184,16 +8441,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.62.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.62.1.tgz", - "integrity": "sha512-vymnnM5g0AKQDSAyfP12nMIBvgwgA42syg74kkuZ4x1VuTzwQKwc5h9rGxeShCjny5o+zWAb6OEoz7XLgrIkIw==", + "version": "8.63.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.63.0.tgz", + "integrity": "sha512-xgwXyzG4sK9ALkBxbyGkTMMOS+imnW65iPhxCQMK83KhxyoDNW7l+IDqEf9vMdoUidHpOoS967RCq4eMiTexwQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.62.1", - "@typescript-eslint/parser": "8.62.1", - "@typescript-eslint/typescript-estree": "8.62.1", - "@typescript-eslint/utils": "8.62.1" + "@typescript-eslint/eslint-plugin": "8.63.0", + "@typescript-eslint/parser": "8.63.0", + "@typescript-eslint/typescript-estree": "8.63.0", + "@typescript-eslint/utils": "8.63.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9463,13 +8720,6 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, "node_modules/vaul": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", @@ -9534,16 +8784,15 @@ } }, "node_modules/vite": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.2.tgz", - "integrity": "sha512-6YYPbRXTxx6bRXmOn7XdnQAy5DQNHhDgtjhDHI13oe4pY93kkcdGJWxpGwOm++/Wh0QpQhDrpIoVMrmrsI5AGQ==", + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz", + "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==", "license": "MIT", - "peer": true, "dependencies": { "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", + "picomatch": "^4.0.5", "postcss": "^8.5.16", - "rolldown": "~1.1.3", + "rolldown": "~1.1.4", "tinyglobby": "^0.2.17" }, "bin": { @@ -9616,7 +8865,6 @@ "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-6.1.1.tgz", "integrity": "sha512-2cihq7zliibCCZ8P9cKJrQBkfgdvcFkOOc3Y02o3GWUDLgqjWsZudaoiuOwO/gzTzy17cS5F7ZPo4bsnS4DGkg==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.1.1", "globrex": "^0.1.2", @@ -9677,6 +8925,28 @@ "node": ">=0.10.0" } }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "dev": true, + "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/xmlbuilder2": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-4.0.3.tgz", diff --git a/frontend/src/mocks/seed.ts b/frontend/src/mocks/seed.ts index 26882a3d..d45e1e7b 100644 --- a/frontend/src/mocks/seed.ts +++ b/frontend/src/mocks/seed.ts @@ -121,12 +121,12 @@ export const builders: Builder[] = [ ]; export const projects: Project[] = [ - { id: "p1", name: "AI Chatbot", description: "Multi-agent customer support bot for SaaS.", stack: ["React", "Node.js", "MongoDB"], owner: "Nancy Patel", members: 4, stars: 24, forks: 12, progress: 75, status: "active", icon: "๐Ÿค–", language: "JavaScript", difficulty: "intermediate", remote: true, paid: true, openSource: false, ai: true, web: true, frontend: true, backend: true }, - { id: "p2", name: "AI SaaS Platform", description: "Full-stack platform with billing and dashboards.", stack: ["Next.js", "Python", "PostgreSQL"], owner: "Nancy Patel", members: 6, stars: 18, forks: 8, progress: 40, status: "active", icon: "โœจ", language: "Python", difficulty: "advanced", remote: true, paid: true, openSource: false, ai: true, web: true, frontend: true, backend: true }, - { id: "p3", name: "DevOps Dashboard", description: "K8s deploy monitoring with drift detection.", stack: ["Docker", "Kubernetes", "AWS"], owner: "Nancy Patel", members: 3, stars: 16, forks: 6, progress: 60, status: "active", icon: "๐Ÿš€", language: "Go", difficulty: "advanced", remote: true, paid: false, openSource: false, ai: false, web: true, backend: true }, - { id: "p4", name: "Blockchain Wallet", description: "Non-custodial multi-chain wallet.", stack: ["Solidity", "Web3", "React"], owner: "Nancy Patel", members: 5, stars: 14, forks: 7, progress: 25, status: "planning", icon: "๐Ÿช™", language: "TypeScript", difficulty: "advanced", remote: true, paid: false, openSource: true, ai: false, web: true, mobile: true, frontend: true }, - { id: "p5", name: "React Component Library", description: "Accessible component library with docs.", stack: ["TypeScript", "Tailwind", "Storybook"], owner: "Nancy Patel", members: 2, stars: 12, forks: 5, progress: 90, status: "active", icon: "๐Ÿงฉ", language: "TypeScript", difficulty: "beginner", remote: true, paid: false, openSource: true, ai: false, web: true, frontend: true }, - { id: "p6", name: "Open Source CRM", description: "Lightweight CRM with pipelines and reports.", stack: ["React", "Node.js", "MongoDB"], owner: "Community", members: 8, stars: 240, forks: 96, progress: 100, status: "shipped", icon: "๐Ÿ“‡", language: "JavaScript", difficulty: "intermediate", remote: false, paid: false, openSource: true, ai: false, web: true, frontend: true, backend: true }, + { id: "p1", name: "AI Chatbot", description: "Multi-agent customer support bot for SaaS.", stack: ["React", "Node.js", "MongoDB"], owner: "Nancy Patel", members: 4, stars: 24, forks: 12, progress: 75, status: "in-progress", icon: "๐Ÿค–", language: "JavaScript", difficulty: "intermediate", remote: true, paid: true, openSource: false, ai: true, web: true, frontend: true, backend: true }, + { id: "p2", name: "AI SaaS Platform", description: "Full-stack platform with billing and dashboards.", stack: ["Next.js", "Python", "PostgreSQL"], owner: "Nancy Patel", members: 6, stars: 18, forks: 8, progress: 40, status: "in-progress", icon: "โœจ", language: "Python", difficulty: "advanced", remote: true, paid: true, openSource: false, ai: true, web: true, frontend: true, backend: true }, + { id: "p3", name: "DevOps Dashboard", description: "K8s deploy monitoring with drift detection.", stack: ["Docker", "Kubernetes", "AWS"], owner: "Nancy Patel", members: 3, stars: 16, forks: 6, progress: 60, status: "in-progress", icon: "๐Ÿš€", language: "Go", difficulty: "advanced", remote: true, paid: false, openSource: false, ai: false, web: true, backend: true }, + { id: "p4", name: "Blockchain Wallet", description: "Non-custodial multi-chain wallet.", stack: ["Solidity", "Web3", "React"], owner: "Nancy Patel", members: 5, stars: 14, forks: 7, progress: 25, status: "recruiting", icon: "๐Ÿช™", language: "TypeScript", difficulty: "advanced", remote: true, paid: false, openSource: true, ai: false, web: true, mobile: true, frontend: true }, + { id: "p5", name: "React Component Library", description: "Accessible component library with docs.", stack: ["TypeScript", "Tailwind", "Storybook"], owner: "Nancy Patel", members: 2, stars: 12, forks: 5, progress: 90, status: "in-progress", icon: "๐Ÿงฉ", language: "TypeScript", difficulty: "beginner", remote: true, paid: false, openSource: true, ai: false, web: true, frontend: true }, + { id: "p6", name: "Open Source CRM", description: "Lightweight CRM with pipelines and reports.", stack: ["React", "Node.js", "MongoDB"], owner: "Community", members: 8, stars: 240, forks: 96, progress: 100, status: "completed", icon: "๐Ÿ“‡", language: "JavaScript", difficulty: "intermediate", remote: false, paid: false, openSource: true, ai: false, web: true, frontend: true, backend: true }, ]; export const activity: Activity[] = [ diff --git a/frontend/src/routeTree.gen.ts b/frontend/src/routeTree.gen.ts index 2b5768f8..bfb1fc5f 100644 --- a/frontend/src/routeTree.gen.ts +++ b/frontend/src/routeTree.gen.ts @@ -13,6 +13,7 @@ import { Route as ForgotPasswordRouteImport } from './routes/forgot-password' import { Route as AuthRouteImport } from './routes/auth' import { Route as AppRouteImport } from './routes/_app' import { Route as IndexRouteImport } from './routes/index' +import { Route as PortfolioUsernameRouteImport } from './routes/portfolio.$username' import { Route as AppSettingsRouteImport } from './routes/_app.settings' import { Route as AppSearchRouteImport } from './routes/_app.search' import { Route as AppProjectsRouteImport } from './routes/_app.projects' @@ -48,6 +49,11 @@ const IndexRoute = IndexRouteImport.update({ path: '/', getParentRoute: () => rootRouteImport, } as any) +const PortfolioUsernameRoute = PortfolioUsernameRouteImport.update({ + id: '/portfolio/$username', + path: '/portfolio/$username', + getParentRoute: () => rootRouteImport, +} as any) const AppSettingsRoute = AppSettingsRouteImport.update({ id: '/settings', path: '/settings', @@ -140,6 +146,7 @@ export interface FileRoutesByFullPath { '/projects': typeof AppProjectsRouteWithChildren '/search': typeof AppSearchRoute '/settings': typeof AppSettingsRoute + '/portfolio/$username': typeof PortfolioUsernameRoute '/builders/$builderId': typeof AppBuildersBuilderIdRoute '/messages/$conversationId': typeof AppMessagesConversationIdRoute '/profile/$username': typeof AppProfileUsernameRoute @@ -160,6 +167,7 @@ export interface FileRoutesByTo { '/projects': typeof AppProjectsRouteWithChildren '/search': typeof AppSearchRoute '/settings': typeof AppSettingsRoute + '/portfolio/$username': typeof PortfolioUsernameRoute '/builders/$builderId': typeof AppBuildersBuilderIdRoute '/messages/$conversationId': typeof AppMessagesConversationIdRoute '/profile/$username': typeof AppProfileUsernameRoute @@ -182,6 +190,7 @@ export interface FileRoutesById { '/_app/projects': typeof AppProjectsRouteWithChildren '/_app/search': typeof AppSearchRoute '/_app/settings': typeof AppSettingsRoute + '/portfolio/$username': typeof PortfolioUsernameRoute '/_app/builders/$builderId': typeof AppBuildersBuilderIdRoute '/_app/messages/$conversationId': typeof AppMessagesConversationIdRoute '/_app/profile/$username': typeof AppProfileUsernameRoute @@ -204,6 +213,7 @@ export interface FileRouteTypes { | '/projects' | '/search' | '/settings' + | '/portfolio/$username' | '/builders/$builderId' | '/messages/$conversationId' | '/profile/$username' @@ -224,6 +234,7 @@ export interface FileRouteTypes { | '/projects' | '/search' | '/settings' + | '/portfolio/$username' | '/builders/$builderId' | '/messages/$conversationId' | '/profile/$username' @@ -245,6 +256,7 @@ export interface FileRouteTypes { | '/_app/projects' | '/_app/search' | '/_app/settings' + | '/portfolio/$username' | '/_app/builders/$builderId' | '/_app/messages/$conversationId' | '/_app/profile/$username' @@ -256,6 +268,7 @@ export interface RootRouteChildren { AppRoute: typeof AppRouteWithChildren AuthRoute: typeof AuthRoute ForgotPasswordRoute: typeof ForgotPasswordRoute + PortfolioUsernameRoute: typeof PortfolioUsernameRoute } declare module '@tanstack/react-router' { @@ -288,6 +301,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof IndexRouteImport parentRoute: typeof rootRouteImport } + '/portfolio/$username': { + id: '/portfolio/$username' + path: '/portfolio/$username' + fullPath: '/portfolio/$username' + preLoaderRoute: typeof PortfolioUsernameRouteImport + parentRoute: typeof rootRouteImport + } '/_app/settings': { id: '/_app/settings' path: '/settings' @@ -469,6 +489,7 @@ const rootRouteChildren: RootRouteChildren = { AppRoute: AppRouteWithChildren, AuthRoute: AuthRoute, ForgotPasswordRoute: ForgotPasswordRoute, + PortfolioUsernameRoute: PortfolioUsernameRoute, } export const routeTree = rootRouteImport ._addFileChildren(rootRouteChildren) diff --git a/frontend/src/routes/_app.profile.$username.tsx b/frontend/src/routes/_app.profile.$username.tsx index 25b0bb0c..cb660d00 100644 --- a/frontend/src/routes/_app.profile.$username.tsx +++ b/frontend/src/routes/_app.profile.$username.tsx @@ -1,7 +1,8 @@ -import { createFileRoute, notFound } from "@tanstack/react-router"; +import { createFileRoute, notFound, Link } from "@tanstack/react-router"; import { Card, TagChip, Avatar } from "@/components/shared/primitives"; import { builders, currentUser, projects } from "@/mocks/seed"; import { MapPin, Calendar, Link as LinkIcon } from "lucide-react"; +import { toast } from "sonner"; export const Route = createFileRoute("/_app/profile/$username")({ head: ({ params }) => ({ @@ -23,6 +24,55 @@ function ProfilePage() { return (
+ {me ? ( + +
+
+

+ ๐Ÿš€ Your Shareable Public Portfolio +

+

+ Showcase your projects, skills, and flares with beautiful custom themes, custom layouts, and a direct contact form. +

+
+
+ + View Portfolio + + +
+
+
+ ) : ( + +
+

+ Looking for a more polished, professional view of {b.name}'s work? +

+ + View Public Portfolio + +
+
+ )} +
diff --git a/frontend/src/routes/_app.projects.$projectId.tsx b/frontend/src/routes/_app.projects.$projectId.tsx index 6ef81a33..365a71a8 100644 --- a/frontend/src/routes/_app.projects.$projectId.tsx +++ b/frontend/src/routes/_app.projects.$projectId.tsx @@ -7,12 +7,9 @@ import { useState } from "react"; import { cn } from "@/lib/utils"; import { builders, activity, currentUser } from "@/mocks/seed"; import { Markdown } from "@/components/shared/Markdown"; -import { ArrowLeft, Star, GitFork, Users2, Github } from "lucide-react"; -import { useState } from "react"; -import { cn } from "@/lib/utils"; -import { builders, activity } from "@/mocks/seed"; import { BackButton } from "@/components/shared/BackButton"; + export const Route = createFileRoute("/_app/projects/$projectId")({ head: ({ params }) => ({ meta: [ @@ -97,16 +94,6 @@ function ProjectDetail() { {p.members}
-
- - {p.stars} - - - {p.forks} - - - {p.members} -
diff --git a/frontend/src/routes/portfolio.$username.tsx b/frontend/src/routes/portfolio.$username.tsx new file mode 100644 index 00000000..ac69971d --- /dev/null +++ b/frontend/src/routes/portfolio.$username.tsx @@ -0,0 +1,1232 @@ +import { createFileRoute, notFound, Link } from "@tanstack/react-router"; +import React, { useState, useEffect } from "react"; +import { + MapPin, Calendar, Link as LinkIcon, Github, Twitter, Linkedin, + Briefcase, Mail, Send, Settings, Sparkles, X, ChevronRight, Check, + Award, Eye, MessageSquare, Heart, Globe, ArrowLeft, Terminal, LayoutGrid +} from "lucide-react"; +import { toast } from "sonner"; +import { builders, currentUser, projects as allProjects, flares as allFlares } from "@/mocks/seed"; + +export const Route = createFileRoute("/portfolio/$username")({ + head: ({ params }) => ({ + meta: [ + { title: `@${params.username}'s Public Portfolio โ€” DevLink` }, + { name: "description", content: `Browse projects, skills, and get in touch with @${params.username}.` }, + ], + }), + component: PortfolioPage, +}); + +interface PortfolioPrefs { + theme: "modern" | "warm" | "cyberpunk" | "glass" | "slate"; + accent: "violet" | "emerald" | "amber" | "rose" | "cyan"; + showProjects: boolean; + showFlares: boolean; + showContact: boolean; +} + +const accentConfig = { + violet: { + text: "text-violet-500 dark:text-violet-450", + bg: "bg-violet-600 dark:bg-violet-500", + hoverBg: "hover:bg-violet-750 dark:hover:bg-violet-600", + border: "border-violet-500/30", + ring: "focus:ring-violet-500", + glow: "shadow-violet-500/20", + badge: "bg-violet-500/10 text-violet-600 dark:text-violet-400 border-violet-550/20", + hex: "#8b5cf6", + }, + emerald: { + text: "text-emerald-500 dark:text-emerald-450", + bg: "bg-emerald-600 dark:bg-emerald-500", + hoverBg: "hover:bg-emerald-750 dark:hover:bg-emerald-600", + border: "border-emerald-500/30", + ring: "focus:ring-emerald-500", + glow: "shadow-emerald-500/20", + badge: "bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border-emerald-550/20", + hex: "#10b981", + }, + amber: { + text: "text-amber-600 dark:text-amber-450", + bg: "bg-amber-600 dark:bg-amber-500", + hoverBg: "hover:bg-amber-750 dark:hover:bg-amber-600", + border: "border-amber-500/30", + ring: "focus:ring-amber-500", + glow: "shadow-amber-500/20", + badge: "bg-amber-500/10 text-amber-700 dark:text-amber-400 border-amber-550/20", + hex: "#d97706", + }, + rose: { + text: "text-rose-500 dark:text-rose-450", + bg: "bg-rose-600 dark:bg-rose-500", + hoverBg: "hover:bg-rose-750 dark:hover:bg-rose-600", + border: "border-rose-500/30", + ring: "focus:ring-rose-500", + glow: "shadow-rose-500/20", + badge: "bg-rose-500/10 text-rose-600 dark:text-rose-400 border-rose-550/20", + hex: "#f43f5e", + }, + cyan: { + text: "text-cyan-600 dark:text-cyan-455", + bg: "bg-cyan-600 dark:bg-cyan-500", + hoverBg: "hover:bg-cyan-750 dark:hover:bg-cyan-600", + border: "border-cyan-500/30", + ring: "focus:ring-cyan-500", + glow: "shadow-cyan-500/20", + badge: "bg-cyan-500/10 text-cyan-600 dark:text-cyan-400 border-cyan-550/20", + hex: "#0891b2", + }, +}; + +function PortfolioPage() { + const { username } = Route.useParams(); + const me = username === currentUser.handle; + + // Find builder details + const b = builders.find((x) => x.handle === username) || (me ? { + id: "me", + name: currentUser.name, + handle: currentUser.handle, + role: "Full Stack Developer", + avatar: currentUser.avatar, + country: "India", + yearsExp: 3, + matchScore: 96, + skills: ["React", "Next.js", "TypeScript", "Node.js", "Python", "TailwindCSS"], + online: true, + bio: "Product engineer. Ships fast, sleeps sometimes. Love crafting delightful UX.", + } : null); + + if (!b) throw notFound(); + + // Get matching projects and flares + const userProjects = allProjects.filter(p => p.owner === b.name || p.owner === b.handle); + const displayProjects = userProjects.length > 0 + ? userProjects + : allProjects.filter(p => p.stack.some(skill => b.skills.includes(skill))).slice(0, 4); + + const displayFlares = allFlares.filter(f => f.author.handle === b.handle || f.author.name === b.name); + + // States + const [prefs, setPrefs] = useState(() => { + if (typeof window !== "undefined") { + try { + const stored = localStorage.getItem(`devlink-portfolio-prefs-${username}`); + if (stored) return JSON.parse(stored); + } catch (e) {} + } + return { + theme: "modern", + accent: "violet", + showProjects: true, + showFlares: true, + showContact: true, + }; + }); + + const [customizerOpen, setCustomizerOpen] = useState(false); + const [formData, setFormData] = useState({ name: "", email: "", role: "recruiter", message: "", budget: "" }); + const [submitting, setSubmitting] = useState(false); + + // Read config from URL query parameters (useful for preview links) + useEffect(() => { + if (typeof window !== "undefined") { + const params = new URLSearchParams(window.location.search); + const urlTheme = params.get("theme") as PortfolioPrefs["theme"]; + const urlAccent = params.get("accent") as PortfolioPrefs["accent"]; + const urlProjects = params.get("projects"); + const urlFlares = params.get("flares"); + const urlContact = params.get("contact"); + + if (urlTheme || urlAccent || urlProjects || urlFlares || urlContact) { + setPrefs(prev => ({ + ...prev, + theme: urlTheme || prev.theme, + accent: urlAccent || prev.accent, + showProjects: urlProjects !== null ? urlProjects === "true" : prev.showProjects, + showFlares: urlFlares !== null ? urlFlares === "true" : prev.showFlares, + showContact: urlContact !== null ? urlContact === "true" : prev.showContact, + })); + } + } + }, []); + + const handleSaveDefault = () => { + localStorage.setItem(`devlink-portfolio-prefs-${username}`, JSON.stringify(prefs)); + toast.success("Theme preferences saved as your personal default!"); + }; + + const handleCopyLink = () => { + const url = `${window.location.origin}/portfolio/${username}?theme=${prefs.theme}&accent=${prefs.accent}&projects=${prefs.showProjects}&flares=${prefs.showFlares}&contact=${prefs.showContact}`; + navigator.clipboard.writeText(url); + toast.success("Customized portfolio link copied to clipboard!"); + }; + + const handleContactSubmit = (e: React.FormEvent) => { + e.preventDefault(); + if (!formData.name || !formData.email || !formData.message) { + toast.error("Please fill in all required fields."); + return; + } + setSubmitting(true); + setTimeout(() => { + const budgetText = formData.budget ? ` (Project Budget: $${formData.budget})` : ""; + const newNotification = { + id: `noti-${Date.now()}`, + kind: "invite" as const, + text: `๐Ÿ’ผ Recruitment Inquirer "${formData.name}" sent a portfolio message: "${formData.message}"${budgetText}. Reply to ${formData.email}.`, + ago: "Just now", + unread: true + }; + + try { + const stored = localStorage.getItem("devlink-notifications"); + const currentNotis = stored ? JSON.parse(stored) : []; + localStorage.setItem("devlink-notifications", JSON.stringify([newNotification, ...currentNotis])); + } catch (e) {} + + toast.success("Your message has been sent to " + b.name + "!"); + setFormData({ name: "", email: "", role: "recruiter", message: "", budget: "" }); + setSubmitting(false); + }, 1200); + }; + + const activeAccent = accentConfig[prefs.accent]; + + // ========================================== + // RENDER THEME STYLES + // ========================================== + + // Theme 1: Modern Neon (Dark) + const renderModernNeon = () => ( +
+ {/* Glow auras */} +
+
+ + {/* Decorative Grid Lines */} +
+ +
+
+ + Back to DevLink + +
+ + + Available for hire + +
+
+
+ +
+ {/* Profile Card */} +
+
+ {b.name} +
+
+
+
+

+ {b.name} +

+

{b.role}

+
+ {b.country} + Active Builder + devlink.io/portfolio/{b.handle} +
+
+

{b.bio}

+ +
+
+ + {/* Skills Section */} +
+

Skills & Tech Stack

+
+ {b.skills.map(s => ( + + {s} + + ))} +
+
+ + {/* Projects Section */} + {prefs.showProjects && ( +
+
+

Featured Projects

+ Total Projects ({displayProjects.length}) +
+
+ {displayProjects.map(p => ( +
+
+
+ {p.icon} + + {p.status} + +
+

{p.name}

+

{p.description}

+
+
+
+ {p.stack.slice(0, 3).map(tech => ( + + {tech} + + ))} +
+
+
+ ))} +
+
+ )} + + {/* Flares Section */} + {prefs.showFlares && displayFlares.length > 0 && ( +
+

Latest Dev Thoughts

+
+ {displayFlares.map(f => ( +
+

{f.content}

+
+
+ {f.likes} likes + {f.comments} replies +
+ {f.ago} +
+
+ ))} +
+
+ )} + + {/* Contact Form */} + {prefs.showContact && ( +
+
+

Hire or Message {b.name}

+

Fill out this secure form. Your inquiry will arrive directly in their DevLink notification inbox.

+
+
+
+
+ + setFormData({...formData, name: e.target.value})} + className="w-full text-xs bg-slate-950 border border-slate-800 rounded-lg p-2.5 focus:outline-none focus:border-slate-600 transition-colors" + /> +
+
+ + setFormData({...formData, email: e.target.value})} + className="w-full text-xs bg-slate-950 border border-slate-800 rounded-lg p-2.5 focus:outline-none focus:border-slate-600 transition-colors" + /> +
+
+
+
+ + +
+
+ + setFormData({...formData, budget: e.target.value})} + className="w-full text-xs bg-slate-950 border border-slate-800 rounded-lg p-2.5 focus:outline-none focus:border-slate-600 transition-colors" + /> +
+
+
+ +