From 1d7662840d2957279ee3b54487799a9d8d9d4790 Mon Sep 17 00:00:00 2001 From: Mohammed Sanabani Date: Sun, 14 Dec 2025 22:15:44 +0300 Subject: [PATCH 01/32] fix: remove hard coded api links, add env file. --- backend/routers/projects.py | 192 ++++++++++++------ frontend/.env.development | 1 + frontend/src/core/api/client.js | 2 +- .../admin/components/AdminProjects.jsx | 4 +- .../calendar/components/CalendarEvent.jsx | 3 +- .../components/ProjectShowcaseInfo.jsx | 4 +- 6 files changed, 136 insertions(+), 70 deletions(-) create mode 100644 frontend/.env.development diff --git a/backend/routers/projects.py b/backend/routers/projects.py index 236c28e..69e1c5e 100644 --- a/backend/routers/projects.py +++ b/backend/routers/projects.py @@ -1,39 +1,88 @@ from typing import List, Optional -from fastapi import APIRouter, Depends, HTTPException, UploadFile, Form, Response +from fastapi import ( + APIRouter, + Depends, + HTTPException, + UploadFile, + Form, + Response, + Request +) from sqlmodel import Session, select -from ..database import engine -from ..models import Project, Technology, ProjectTechnologyLink, ProjectRead, Admin -from ..auth import get_current_admin from datetime import date import json +from ..database import engine +from ..models import Project, Technology, ProjectRead, Admin +from ..auth import get_current_admin + router = APIRouter(prefix="/api/v1/projects", tags=["projects"]) + +# ------------------------- +# DB session dependency +# ------------------------- def get_session(): with Session(engine) as session: yield session + +# ------------------------- +# Helper: build background URL safely +# ------------------------- +def project_background_url(request: Request, project_id: int) -> str: + return f"{request.base_url}api/v1/projects/{project_id}/background" + + +# ------------------------- +# GET all projects +# ------------------------- @router.get("/", response_model=List[ProjectRead]) -def get_projects(session: Session = Depends(get_session)): +def get_projects( + request: Request, + session: Session = Depends(get_session) +): projects = session.exec(select(Project)).unique().all() result = [] - for p in projects: - p_dict = p.dict(exclude={"background_image"}) - # Add simulated url field - p_dict["background_image_url"] = f"http://localhost:8000/api/v1/projects/{p.id}/background" if p.background_image else None - p_dict["technologies"] = p.technologies - result.append(p_dict) + + for project in projects: + data = project.dict(exclude={"background_image"}) + data["background_image_url"] = ( + project_background_url(request, project.id) + if project.background_image + else None + ) + data["technologies"] = project.technologies + result.append(data) + return result + +# ------------------------- +# GET project background image +# ------------------------- @router.get("/{project_id}/background") -def get_project_background(project_id: int, session: Session = Depends(get_session)): +def get_project_background( + project_id: int, + session: Session = Depends(get_session) +): project = session.get(Project, project_id) + if not project or not project.background_image: raise HTTPException(status_code=404, detail="Image not found") - return Response(content=project.background_image, media_type="image/png") + return Response( + content=project.background_image, + media_type="image/png" + ) + + +# ------------------------- +# CREATE project +# ------------------------- @router.post("/", response_model=ProjectRead) def create_project( + request: Request, title: str = Form(...), description: str = Form(...), start_date: str = Form(...), @@ -42,64 +91,62 @@ def create_project( github_link: Optional[str] = Form(None), live_demo_link: Optional[str] = Form(None), background_image: Optional[UploadFile] = None, - technology_ids: Optional[str] = Form(None), # Comma separated IDs or JSON string + technology_ids: Optional[str] = Form(None), session: Session = Depends(get_session), current_admin: Admin = Depends(get_current_admin) ): - # Parse dates - s_date = date.fromisoformat(start_date) - e_date = date.fromisoformat(end_date) if end_date else None - - # Handle Image - image_bytes = None - if background_image: - image_bytes = background_image.file.read() - new_project = Project( title=title, description=description, - start_date=s_date, - end_date=e_date, + start_date=date.fromisoformat(start_date), + end_date=date.fromisoformat(end_date) if end_date else None, tags=tags, github_link=github_link, live_demo_link=live_demo_link, - background_image=image_bytes + background_image=background_image.file.read() if background_image else None, ) - # Link Technologies + # Attach technologies if technology_ids: try: - # Expecting JSON list string e.g. "[1, 2]" or comma separated "1,2" - # Let's try JSON first - if technology_ids.strip().startswith("["): - ids = json.loads(technology_ids) - else: - ids = [int(id.strip()) for id in technology_ids.split(",") if id.strip()] - - for t_id in ids: - tech = session.get(Technology, t_id) + ids = ( + json.loads(technology_ids) + if technology_ids.strip().startswith("[") + else [int(i) for i in technology_ids.split(",") if i.strip()] + ) + for tech_id in ids: + tech = session.get(Technology, tech_id) if tech: new_project.technologies.append(tech) except Exception as e: - print(f"Error parsing technology_ids: {e}") + raise HTTPException(status_code=400, detail=f"Invalid technology_ids: {e}") session.add(new_project) session.commit() session.refresh(new_project) - - # Return matched structure - p_dict = new_project.dict(exclude={"background_image"}) - p_dict["background_image_url"] = f"http://localhost:8000/api/v1/projects/{new_project.id}/background" if new_project.background_image else None - return p_dict + data = new_project.dict(exclude={"background_image"}) + data["background_image_url"] = ( + project_background_url(request, new_project.id) + if new_project.background_image + else None + ) + + return data + + +# ------------------------- +# UPDATE project +# ------------------------- @router.put("/{project_id}", response_model=ProjectRead) def update_project( project_id: int, + request: Request, title: Optional[str] = Form(None), description: Optional[str] = Form(None), start_date: Optional[str] = Form(None), - tags: Optional[str] = Form(None), end_date: Optional[str] = Form(None), + tags: Optional[str] = Form(None), github_link: Optional[str] = Form(None), live_demo_link: Optional[str] = Form(None), background_image: Optional[UploadFile] = None, @@ -111,42 +158,56 @@ def update_project( if not project: raise HTTPException(status_code=404, detail="Project not found") - if title: project.title = title - if description: project.description = description - if start_date: project.start_date = date.fromisoformat(start_date) - if end_date is not None: # check for None specifically if clearing is allowed, assuming empty string means clear? or just updates? + if title is not None: + project.title = title + if description is not None: + project.description = description + if start_date is not None: + project.start_date = date.fromisoformat(start_date) + if end_date is not None: project.end_date = date.fromisoformat(end_date) if end_date else None - if tags: project.tags = tags - if github_link is not None: project.github_link = github_link - if live_demo_link is not None: project.live_demo_link = live_demo_link - + if tags is not None: + project.tags = tags + if github_link is not None: + project.github_link = github_link + if live_demo_link is not None: + project.live_demo_link = live_demo_link if background_image: project.background_image = background_image.file.read() - # Update Technologies if provided + # Replace technologies if technology_ids is not None: - project.technologies = [] # Clear existing to replace? Or merge? Usually replace in PUT + project.technologies.clear() try: - if technology_ids.strip().startswith("["): - ids = json.loads(technology_ids) - else: - ids = [int(id.strip()) for id in technology_ids.split(",") if id.strip()] - - for t_id in ids: - tech = session.get(Technology, t_id) + ids = ( + json.loads(technology_ids) + if technology_ids.strip().startswith("[") + else [int(i) for i in technology_ids.split(",") if i.strip()] + ) + for tech_id in ids: + tech = session.get(Technology, tech_id) if tech: project.technologies.append(tech) except Exception as e: - print(f"Error update technology_ids: {e}") + raise HTTPException(status_code=400, detail=f"Invalid technology_ids: {e}") session.add(project) session.commit() session.refresh(project) - - p_dict = project.dict(exclude={"background_image"}) - p_dict["background_image_url"] = f"http://localhost:8000/api/v1/projects/{project.id}/background" if project.background_image else None - return p_dict + data = project.dict(exclude={"background_image"}) + data["background_image_url"] = ( + project_background_url(request, project.id) + if project.background_image + else None + ) + + return data + + +# ------------------------- +# DELETE project +# ------------------------- @router.delete("/{project_id}") def delete_project( project_id: int, @@ -156,6 +217,7 @@ def delete_project( project = session.get(Project, project_id) if not project: raise HTTPException(status_code=404, detail="Project not found") + session.delete(project) session.commit() return {"ok": True} diff --git a/frontend/.env.development b/frontend/.env.development new file mode 100644 index 0000000..bd9648b --- /dev/null +++ b/frontend/.env.development @@ -0,0 +1 @@ +VITE_API_BASE_URL=http://localhost:9000/api/v1 \ No newline at end of file diff --git a/frontend/src/core/api/client.js b/frontend/src/core/api/client.js index e21c4de..3a5aeca 100644 --- a/frontend/src/core/api/client.js +++ b/frontend/src/core/api/client.js @@ -2,7 +2,7 @@ import axios from 'axios'; // Create axios instance with base configuration const client = axios.create({ - baseURL: import.meta.env.VITE_API_URL || 'http://localhost:8000/api/v1', + baseURL: import.meta.env.VITE_API_URL || 'http://localhost:9000/api/v1', timeout: 10000, headers: { 'Content-Type': 'application/json', diff --git a/frontend/src/features/admin/components/AdminProjects.jsx b/frontend/src/features/admin/components/AdminProjects.jsx index def0bcf..f9b0759 100644 --- a/frontend/src/features/admin/components/AdminProjects.jsx +++ b/frontend/src/features/admin/components/AdminProjects.jsx @@ -5,6 +5,8 @@ import { zodResolver } from '@hookform/resolvers/zod'; import { useProjects } from '../hooks/useProjects'; import { projectSchema } from '../schemas'; import { getTechnologies } from '@/core/api/api'; +const API_BASE_URL = import.meta.env.VITE_API_BASE_URL; + const AdminProjects = () => { const { projects, fetchProjects, createProject, updateProject, deleteProject } = useProjects(); @@ -148,7 +150,7 @@ const AdminProjects = () => { }`} >
- {tech.title} e.target.style.display = 'none'} /> + {tech.title} e.target.style.display = 'none'} />
{tech.title} diff --git a/frontend/src/features/calendar/components/CalendarEvent.jsx b/frontend/src/features/calendar/components/CalendarEvent.jsx index 9f94ea5..4788c14 100644 --- a/frontend/src/features/calendar/components/CalendarEvent.jsx +++ b/frontend/src/features/calendar/components/CalendarEvent.jsx @@ -55,10 +55,9 @@ const CalendarEvent = ({ event, index, style, className = "" }) => { className={`absolute h-14 rounded-full shadow-lg flex items-center px-4 gap-3 cursor-pointer hover:scale-105 transition-transform border border-white/20 overflow-hidden ${getEventColor(index)} ${className}`} style={style} > - {event.icon} + {event.icon}
{event.title} - {event.start_date}
); diff --git a/frontend/src/features/projects/components/ProjectShowcaseInfo.jsx b/frontend/src/features/projects/components/ProjectShowcaseInfo.jsx index a68a623..5162efa 100644 --- a/frontend/src/features/projects/components/ProjectShowcaseInfo.jsx +++ b/frontend/src/features/projects/components/ProjectShowcaseInfo.jsx @@ -2,6 +2,8 @@ import React from 'react'; import { Github, ExternalLink } from 'lucide-react'; import { getEventColor } from '@/utils/colors'; import { formatDateRange } from '@/utils/dateUtils'; +const API_BASE_URL = import.meta.env.VITE_API_BASE_URL; + const ProjectShowcaseInfo = ({ project, titleRef, detailsRef }) => { if (!project) return null; @@ -29,7 +31,7 @@ const ProjectShowcaseInfo = ({ project, titleRef, detailsRef }) => {
{tech.title} e.target.style.display = 'none'} From 958e5ed0bfd722805b71d5e5c9d96b123ead7471 Mon Sep 17 00:00:00 2001 From: Mohammed Sanabani Date: Sun, 14 Dec 2025 22:27:20 +0300 Subject: [PATCH 02/32] install deps for gh-pages --- frontend/package-lock.json | 564 +++++++++++++++++++++++++++++++++++++ frontend/package.json | 2 + 2 files changed, 566 insertions(+) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 4481423..f92c37d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -34,6 +34,7 @@ "eslint": "^9.39.1", "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-refresh": "^0.4.24", + "gh-pages": "^6.3.0", "globals": "^16.5.0", "vite": "^7.2.4" } @@ -1035,6 +1036,44 @@ "three": ">= 0.159.0" } }, + "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/@react-spring/animated": { "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", @@ -2019,6 +2058,23 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2093,6 +2149,19 @@ "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.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", @@ -2253,6 +2322,23 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2370,6 +2456,19 @@ "node": ">=8" } }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/draco3d": { "version": "1.5.7", "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", @@ -2397,6 +2496,13 @@ "dev": true, "license": "ISC" }, + "node_modules/email-addresses": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz", + "integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==", + "dev": true, + "license": "MIT" + }, "node_modules/enhanced-resolve": { "version": "5.18.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", @@ -2710,6 +2816,36 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -2724,6 +2860,16 @@ "dev": true, "license": "MIT" }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -2760,6 +2906,65 @@ "node": ">=16.0.0" } }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2834,6 +3039,21 @@ "node": ">= 6" } }, + "node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2904,6 +3124,29 @@ "node": ">= 0.4" } }, + "node_modules/gh-pages": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-6.3.0.tgz", + "integrity": "sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.4", + "commander": "^13.0.0", + "email-addresses": "^5.0.0", + "filenamify": "^4.3.0", + "find-cache-dir": "^3.3.1", + "fs-extra": "^11.1.1", + "globby": "^11.1.0" + }, + "bin": { + "gh-pages": "bin/gh-pages.js", + "gh-pages-clean": "bin/gh-pages-clean.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -2930,6 +3173,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/glsl-noise": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", @@ -3118,6 +3382,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", @@ -3226,6 +3500,19 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -3581,6 +3868,22 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -3590,6 +3893,16 @@ "node": ">= 0.4" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/meshline": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", @@ -3605,6 +3918,33 @@ "integrity": "sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==", "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.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -3737,6 +4077,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -3769,6 +4119,16 @@ "node": ">=8" } }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -3787,6 +4147,75 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -3868,6 +4297,27 @@ "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": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -4034,6 +4484,17 @@ "node": ">=4" } }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rollup": { "version": "4.53.3", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", @@ -4075,6 +4536,30 @@ "fsevents": "~2.3.2" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -4121,6 +4606,16 @@ "node": ">=8" } }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -4169,6 +4664,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4284,6 +4802,42 @@ "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-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/troika-three-text": { "version": "0.52.4", "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.52.4.tgz", @@ -4364,6 +4918,16 @@ "node": ">= 0.8.0" } }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", diff --git a/frontend/package.json b/frontend/package.json index 2fff868..e44bf2c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -3,6 +3,7 @@ "private": true, "version": "0.0.0", "type": "module", + "homepage": "https://username.github.io", "scripts": { "dev": "vite --host", "build": "vite build", @@ -36,6 +37,7 @@ "eslint": "^9.39.1", "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-refresh": "^0.4.24", + "gh-pages": "^6.3.0", "globals": "^16.5.0", "vite": "^7.2.4" } From 5f5986b2a12409c3da836900953efed7e7e97890 Mon Sep 17 00:00:00 2001 From: Mohammed Sanabani Date: Sun, 14 Dec 2025 22:57:30 +0300 Subject: [PATCH 03/32] Deploy frontend for GitHub Pages --- frontend/package.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index e44bf2c..c49ffee 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -3,12 +3,15 @@ "private": true, "version": "0.0.0", "type": "module", - "homepage": "https://username.github.io", + "homepage": "https://ms16Dev.github.io", + "repository": "https://github.com/ms16Dev/ms16Dev.github.io.git", "scripts": { "dev": "vite --host", "build": "vite build", "lint": "eslint .", - "preview": "vite preview" + "preview": "vite preview", + "predeploy": "npm run build", + "deploy": "gh-pages -d dist" }, "dependencies": { "@hookform/resolvers": "^5.2.2", From 92de52f362c7aec42aaa1af005e1b94d741ac08a Mon Sep 17 00:00:00 2001 From: Mohammed Sanabani Date: Sun, 14 Dec 2025 22:58:21 +0300 Subject: [PATCH 04/32] Deploy frontend for GitHub Pages --- assets/index-DztlSfwB.css | 1 + assets/index-sP2MAb9l.js | 3748 ++++++++++++++++++++++++++++++ assets/vanta.net.min-CL7-u4Uz.js | 1 + index.html | 14 + vite.svg | 1 + 5 files changed, 3765 insertions(+) create mode 100644 assets/index-DztlSfwB.css create mode 100644 assets/index-sP2MAb9l.js create mode 100644 assets/vanta.net.min-CL7-u4Uz.js create mode 100644 index.html create mode 100644 vite.svg diff --git a/assets/index-DztlSfwB.css b/assets/index-DztlSfwB.css new file mode 100644 index 0000000..2f2c564 --- /dev/null +++ b/assets/index-DztlSfwB.css @@ -0,0 +1 @@ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-scroll-snap-strictness:proximity;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-700:oklch(55.3% .195 38.402);--color-amber-500:oklch(76.9% .188 70.08);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-emerald-500:oklch(69.6% .17 162.48);--color-teal-500:oklch(70.4% .14 182.503);--color-cyan-500:oklch(71.5% .143 215.221);--color-sky-500:oklch(68.5% .169 237.323);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-indigo-500:oklch(58.5% .233 277.117);--color-violet-500:oklch(60.6% .25 292.717);--color-purple-500:oklch(62.7% .265 303.9);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-pink-500:oklch(65.6% .241 354.308);--color-rose-500:oklch(64.5% .246 16.439);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-gray-900:oklch(21% .034 264.665);--color-stone-500:oklch(55.3% .013 58.071);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-4xl:56rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tighter:-.05em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--ease-out:cubic-bezier(0,0,.2,1);--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--animate-bounce:bounce 1s infinite;--blur-sm:8px;--blur-md:12px;--blur-lg:16px;--blur-xl:24px;--blur-2xl:40px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-primary:rgb(var(--primary));--color-secondary:rgb(var(--secondary));--color-surface:rgb(var(--surface));--color-text:rgb(var(--text));--color-muted:rgb(var(--muted-text));--color-accent:rgb(var(--accent));--color-glass:rgb(var(--glass)/var(--glass-alpha));--color-glass-strong:rgb(var(--glass)/var(--glass-strong-alpha))}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-3{top:calc(var(--spacing)*3)}.top-3\.5{top:calc(var(--spacing)*3.5)}.top-4{top:calc(var(--spacing)*4)}.top-20{top:calc(var(--spacing)*20)}.top-24{top:calc(var(--spacing)*24)}.top-full{top:100%}.-right-10{right:calc(var(--spacing)*-10)}.right-2{right:calc(var(--spacing)*2)}.right-3{right:calc(var(--spacing)*3)}.right-4{right:calc(var(--spacing)*4)}.right-8{right:calc(var(--spacing)*8)}.-bottom-8{bottom:calc(var(--spacing)*-8)}.-bottom-10{bottom:calc(var(--spacing)*-10)}.bottom-6{bottom:calc(var(--spacing)*6)}.bottom-8{bottom:calc(var(--spacing)*8)}.bottom-10{bottom:calc(var(--spacing)*10)}.bottom-12{bottom:calc(var(--spacing)*12)}.bottom-32{bottom:calc(var(--spacing)*32)}.left-0{left:calc(var(--spacing)*0)}.left-1\/2{left:50%}.left-3{left:calc(var(--spacing)*3)}.left-4{left:calc(var(--spacing)*4)}.left-8{left:calc(var(--spacing)*8)}.left-10{left:calc(var(--spacing)*10)}.left-14{left:calc(var(--spacing)*14)}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.order-1{order:1}.order-2{order:2}.order-3{order:3}.col-span-4{grid-column:span 4/span 4}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-auto{margin-inline:auto}.my-24{margin-block:calc(var(--spacing)*24)}.-mt-16{margin-top:calc(var(--spacing)*-16)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-8{margin-top:calc(var(--spacing)*8)}.mt-12{margin-top:calc(var(--spacing)*12)}.mt-16{margin-top:calc(var(--spacing)*16)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.ml-5{margin-left:calc(var(--spacing)*5)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.\!h-24{height:calc(var(--spacing)*24)!important}.h-1{height:calc(var(--spacing)*1)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-6{height:calc(var(--spacing)*6)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-20{height:calc(var(--spacing)*20)}.h-30{height:calc(var(--spacing)*30)}.h-32{height:calc(var(--spacing)*32)}.h-48{height:calc(var(--spacing)*48)}.h-\[650px\]{height:650px}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.min-h-screen{min-height:100vh}.\!w-24{width:calc(var(--spacing)*24)!important}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-1\/3{width:33.3333%}.w-3{width:calc(var(--spacing)*3)}.w-3\/4{width:75%}.w-5\/6{width:83.3333%}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-16{width:calc(var(--spacing)*16)}.w-24{width:calc(var(--spacing)*24)}.w-26{width:calc(var(--spacing)*26)}.w-32{width:calc(var(--spacing)*32)}.w-48{width:calc(var(--spacing)*48)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[210mm\]{max-width:210mm}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-\[24px\]{min-width:24px}.min-w-\[180px\]{min-width:180px}.min-w-\[300px\]{min-width:300px}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.origin-bottom{transform-origin:bottom}.origin-left{transform-origin:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-2{rotate:2deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-bounce{animation:var(--animate-bounce)}.animate-pulse{animation:var(--animate-pulse)}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.snap-x{scroll-snap-type:x var(--tw-scroll-snap-strictness)}.snap-start{scroll-snap-align:start}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-12{gap:calc(var(--spacing)*12)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-b-4{border-bottom-style:var(--tw-border-style);border-bottom-width:4px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-accent{border-color:var(--color-accent)}.border-accent\/20{border-color:color-mix(in srgb,rgb(var(--accent))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-accent\/20{border-color:color-mix(in oklab,var(--color-accent)20%,transparent)}}.border-accent\/50{border-color:color-mix(in srgb,rgb(var(--accent))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-accent\/50{border-color:color-mix(in oklab,var(--color-accent)50%,transparent)}}.border-blue-900{border-color:var(--color-blue-900)}.border-red-200{border-color:var(--color-red-200)}.border-secondary{border-color:var(--color-secondary)}.border-secondary\/30{border-color:color-mix(in srgb,rgb(var(--secondary))30%,transparent)}@supports (color:color-mix(in lab,red,red)){.border-secondary\/30{border-color:color-mix(in oklab,var(--color-secondary)30%,transparent)}}.border-slate-200{border-color:var(--color-slate-200)}.border-transparent{border-color:#0000}.border-white{border-color:var(--color-white)}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.border-white\/20{border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.border-white\/30{border-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.border-white\/30{border-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.bg-accent{background-color:var(--color-accent)}.bg-accent\/10{background-color:color-mix(in srgb,rgb(var(--accent))10%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-accent\/10{background-color:color-mix(in oklab,var(--color-accent)10%,transparent)}}.bg-accent\/20{background-color:color-mix(in srgb,rgb(var(--accent))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-accent\/20{background-color:color-mix(in oklab,var(--color-accent)20%,transparent)}}.bg-accent\/30{background-color:color-mix(in srgb,rgb(var(--accent))30%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-accent\/30{background-color:color-mix(in oklab,var(--color-accent)30%,transparent)}}.bg-accent\/80{background-color:color-mix(in srgb,rgb(var(--accent))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-accent\/80{background-color:color-mix(in oklab,var(--color-accent)80%,transparent)}}.bg-amber-500{background-color:var(--color-amber-500)}.bg-black{background-color:var(--color-black)}.bg-black\/5{background-color:#0000000d}@supports (color:color-mix(in lab,red,red)){.bg-black\/5{background-color:color-mix(in oklab,var(--color-black)5%,transparent)}}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black)10%,transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black)30%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black)40%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black)80%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-cyan-500{background-color:var(--color-cyan-500)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-fuchsia-500{background-color:var(--color-fuchsia-500)}.bg-glass{background-color:var(--color-glass)}.bg-green-500{background-color:var(--color-green-500)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-orange-500{background-color:var(--color-orange-500)}.bg-pink-500{background-color:var(--color-pink-500)}.bg-primary{background-color:var(--color-primary)}.bg-primary\/20{background-color:color-mix(in srgb,rgb(var(--primary))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/20{background-color:color-mix(in oklab,var(--color-primary)20%,transparent)}}.bg-primary\/40{background-color:color-mix(in srgb,rgb(var(--primary))40%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/40{background-color:color-mix(in oklab,var(--color-primary)40%,transparent)}}.bg-purple-500{background-color:var(--color-purple-500)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-500{background-color:var(--color-red-500)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-secondary{background-color:var(--color-secondary)}.bg-secondary\/20{background-color:color-mix(in srgb,rgb(var(--secondary))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-secondary\/20{background-color:color-mix(in oklab,var(--color-secondary)20%,transparent)}}.bg-secondary\/30{background-color:color-mix(in srgb,rgb(var(--secondary))30%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-secondary\/30{background-color:color-mix(in oklab,var(--color-secondary)30%,transparent)}}.bg-sky-500{background-color:var(--color-sky-500)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-stone-500\/40{background-color:#79716b66}@supports (color:color-mix(in lab,red,red)){.bg-stone-500\/40{background-color:color-mix(in oklab,var(--color-stone-500)40%,transparent)}}.bg-surface{background-color:var(--color-surface)}.bg-surface\/20{background-color:color-mix(in srgb,rgb(var(--surface))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-surface\/20{background-color:color-mix(in oklab,var(--color-surface)20%,transparent)}}.bg-surface\/50{background-color:color-mix(in srgb,rgb(var(--surface))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-surface\/50{background-color:color-mix(in oklab,var(--color-surface)50%,transparent)}}.bg-surface\/60{background-color:color-mix(in srgb,rgb(var(--surface))60%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-surface\/60{background-color:color-mix(in oklab,var(--color-surface)60%,transparent)}}.bg-surface\/90{background-color:color-mix(in srgb,rgb(var(--surface))90%,transparent)}@supports (color:color-mix(in lab,red,red)){.bg-surface\/90{background-color:color-mix(in oklab,var(--color-surface)90%,transparent)}}.bg-teal-500{background-color:var(--color-teal-500)}.bg-transparent{background-color:#0000}.bg-violet-500{background-color:var(--color-violet-500)}.bg-white{background-color:var(--color-white)}.bg-white\/5{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.bg-white\/5{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.bg-white\/10{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.bg-white\/20{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.bg-white\/20{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.bg-white\/30{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.bg-white\/30{background-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.bg-white\/40{background-color:#fff6}@supports (color:color-mix(in lab,red,red)){.bg-white\/40{background-color:color-mix(in oklab,var(--color-white)40%,transparent)}}.bg-white\/50{background-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.bg-white\/50{background-color:color-mix(in oklab,var(--color-white)50%,transparent)}}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-blue-600{--tw-gradient-from:var(--color-blue-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-primary{--tw-gradient-from:var(--color-primary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-900{--tw-gradient-from:var(--color-red-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.via-red-800{--tw-gradient-via:var(--color-red-800);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-secondary{--tw-gradient-via:var(--color-secondary);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-accent{--tw-gradient-to:var(--color-accent);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-800{--tw-gradient-to:var(--color-blue-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-orange-700{--tw-gradient-to:var(--color-orange-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-secondary{--tw-gradient-to:var(--color-secondary);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.p-10{padding:calc(var(--spacing)*10)}.px-0{padding-inline:calc(var(--spacing)*0)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-10{padding-block:calc(var(--spacing)*10)}.ps-2{padding-inline-start:calc(var(--spacing)*2)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-6{padding-top:calc(var(--spacing)*6)}.pt-8{padding-top:calc(var(--spacing)*8)}.pt-24{padding-top:calc(var(--spacing)*24)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pb-8{padding-bottom:calc(var(--spacing)*8)}.pl-10{padding-left:calc(var(--spacing)*10)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[15vw\]{font-size:15vw}.text-\[150px\]{font-size:150px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tighter{--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.text-accent{color:var(--color-accent)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-800{color:var(--color-blue-800)}.text-blue-900{color:var(--color-blue-900)}.text-green-500{color:var(--color-green-500)}.text-muted{color:var(--color-muted)}.text-primary{color:var(--color-primary)}.text-primary\/30{color:color-mix(in srgb,rgb(var(--primary))30%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-primary\/30{color:color-mix(in oklab,var(--color-primary)30%,transparent)}}.text-primary\/80{color:color-mix(in srgb,rgb(var(--primary))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-primary\/80{color:color-mix(in oklab,var(--color-primary)80%,transparent)}}.text-red-300{color:var(--color-red-300)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-900{color:var(--color-red-900)}.text-secondary{color:var(--color-secondary)}.text-secondary\/80{color:color-mix(in srgb,rgb(var(--secondary))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.text-secondary\/80{color:color-mix(in oklab,var(--color-secondary)80%,transparent)}}.text-slate-200{color:var(--color-slate-200)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-transparent{color:#0000}.text-white{color:var(--color-white)}.text-white\/20{color:#fff3}@supports (color:color-mix(in lab,red,red)){.text-white\/20{color:color-mix(in oklab,var(--color-white)20%,transparent)}}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-white\/50{color:color-mix(in oklab,var(--color-white)50%,transparent)}}.text-white\/60{color:#fff9}@supports (color:color-mix(in lab,red,red)){.text-white\/60{color:color-mix(in oklab,var(--color-white)60%,transparent)}}.text-white\/70{color:#ffffffb3}@supports (color:color-mix(in lab,red,red)){.text-white\/70{color:color-mix(in oklab,var(--color-white)70%,transparent)}}.text-white\/80{color:#fffc}@supports (color:color-mix(in lab,red,red)){.text-white\/80{color:color-mix(in oklab,var(--color-white)80%,transparent)}}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.text-white\/90{color:color-mix(in oklab,var(--color-white)90%,transparent)}}.text-yellow-300{color:var(--color-yellow-300)}.text-yellow-500{color:var(--color-yellow-500)}.uppercase{text-transform:uppercase}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-80{opacity:.8}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_10px_rgba\(var\(--accent\)\,0\.5\)\]{--tw-shadow:0 0 10px var(--tw-shadow-color,rgba(var(--accent),.5));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-accent\/20{--tw-shadow-color:color-mix(in srgb,rgb(var(--accent))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.shadow-accent\/20{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-accent)20%,transparent)var(--tw-shadow-alpha),transparent)}}.shadow-blue-500\/10{--tw-shadow-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.shadow-blue-500\/10{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-blue-500)10%,transparent)var(--tw-shadow-alpha),transparent)}}.shadow-green-500\/10{--tw-shadow-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.shadow-green-500\/10{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-green-500)10%,transparent)var(--tw-shadow-alpha),transparent)}}.shadow-red-500\/10{--tw-shadow-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.shadow-red-500\/10{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-red-500)10%,transparent)var(--tw-shadow-alpha),transparent)}}.shadow-yellow-500\/10{--tw-shadow-color:#edb2001a}@supports (color:color-mix(in lab,red,red)){.shadow-yellow-500\/10{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-yellow-500)10%,transparent)var(--tw-shadow-alpha),transparent)}}.blur-2xl{--tw-blur:blur(var(--blur-2xl));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur-xl{--tw-blur:blur(var(--blur-xl));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-lg{--tw-backdrop-blur:blur(var(--blur-lg));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.backface-hidden{backface-visibility:hidden}@media(hover:hover){.group-hover\:scale-110:is(:where(.group):hover *){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-hover\:border-accent\/50:is(:where(.group):hover *){border-color:color-mix(in srgb,rgb(var(--accent))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.group-hover\:border-accent\/50:is(:where(.group):hover *){border-color:color-mix(in oklab,var(--color-accent)50%,transparent)}}.group-hover\:bg-accent\/20:is(:where(.group):hover *){background-color:color-mix(in srgb,rgb(var(--accent))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.group-hover\:bg-accent\/20:is(:where(.group):hover *){background-color:color-mix(in oklab,var(--color-accent)20%,transparent)}}.group-hover\:text-accent:is(:where(.group):hover *){color:var(--color-accent)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.file\:mr-4::file-selector-button{margin-right:calc(var(--spacing)*4)}.file\:rounded-full::file-selector-button{border-radius:3.40282e38px}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-accent::file-selector-button{background-color:var(--color-accent)}.file\:px-4::file-selector-button{padding-inline:calc(var(--spacing)*4)}.file\:py-2::file-selector-button{padding-block:calc(var(--spacing)*2)}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-semibold::file-selector-button{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.file\:text-white::file-selector-button{color:var(--color-white)}@media(hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:border-accent\/50:hover{border-color:color-mix(in srgb,rgb(var(--accent))50%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:border-accent\/50:hover{border-color:color-mix(in oklab,var(--color-accent)50%,transparent)}}.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-accent\/20:hover{background-color:color-mix(in srgb,rgb(var(--accent))20%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/20:hover{background-color:color-mix(in oklab,var(--color-accent)20%,transparent)}}.hover\:bg-black\/5:hover{background-color:#0000000d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/5:hover{background-color:color-mix(in oklab,var(--color-black)5%,transparent)}}.hover\:bg-glass-strong:hover{background-color:var(--color-glass-strong)}.hover\:bg-muted\/10:hover{background-color:color-mix(in srgb,rgb(var(--muted-text))10%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/10:hover{background-color:color-mix(in oklab,var(--color-muted)10%,transparent)}}.hover\:bg-primary\/80:hover{background-color:color-mix(in srgb,rgb(var(--primary))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/80:hover{background-color:color-mix(in oklab,var(--color-primary)80%,transparent)}}.hover\:bg-stone-500\/80:hover{background-color:#79716bcc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-stone-500\/80:hover{background-color:color-mix(in oklab,var(--color-stone-500)80%,transparent)}}.hover\:bg-surface\/80:hover{background-color:color-mix(in srgb,rgb(var(--surface))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-surface\/80:hover{background-color:color-mix(in oklab,var(--color-surface)80%,transparent)}}.hover\:bg-white\/5:hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/5:hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.hover\:bg-white\/30:hover{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/30:hover{background-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.hover\:bg-white\/50:hover{background-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/50:hover{background-color:color-mix(in oklab,var(--color-white)50%,transparent)}}.hover\:text-accent\/80:hover{color:color-mix(in srgb,rgb(var(--accent))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:text-accent\/80:hover{color:color-mix(in oklab,var(--color-accent)80%,transparent)}}.hover\:text-primary:hover{color:var(--color-primary)}.hover\:text-primary\/80:hover{color:color-mix(in srgb,rgb(var(--primary))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:text-primary\/80:hover{color:color-mix(in oklab,var(--color-primary)80%,transparent)}}.hover\:text-red-600:hover{color:var(--color-red-600)}.hover\:text-red-700:hover{color:var(--color-red-700)}.hover\:text-secondary:hover{color:var(--color-secondary)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-accent\/25:hover{--tw-shadow-color:color-mix(in srgb,rgb(var(--accent))25%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:shadow-accent\/25:hover{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-accent)25%,transparent)var(--tw-shadow-alpha),transparent)}}.hover\:file\:bg-accent\/80:hover::file-selector-button{background-color:color-mix(in srgb,rgb(var(--accent))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.hover\:file\:bg-accent\/80:hover::file-selector-button{background-color:color-mix(in oklab,var(--color-accent)80%,transparent)}}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-accent:focus{--tw-ring-color:var(--color-accent)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media(hover:hover){.disabled\:hover\:scale-100:disabled:hover{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}}@media(min-width:40rem){.sm\:flex-row{flex-direction:row}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}}@media(min-width:48rem){.md\:right-4{right:calc(var(--spacing)*4)}.md\:right-8{right:calc(var(--spacing)*8)}.md\:left-12{left:calc(var(--spacing)*12)}.md\:left-auto{left:auto}.md\:order-1{order:1}.md\:order-2{order:2}.md\:order-3{order:3}.md\:col-span-2{grid-column:span 2/span 2}.md\:my-0{margin-block:calc(var(--spacing)*0)}.md\:-mt-24{margin-top:calc(var(--spacing)*-24)}.md\:mb-4{margin-bottom:calc(var(--spacing)*4)}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-3\/5{height:60%}.md\:h-8{height:calc(var(--spacing)*8)}.md\:h-12{height:calc(var(--spacing)*12)}.md\:h-\[70vh\]{height:70vh}.md\:h-full{height:100%}.md\:w-1\/5{width:20%}.md\:w-3\/5{width:60%}.md\:w-12{width:calc(var(--spacing)*12)}.md\:w-auto{width:auto}.md\:translate-x-0{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:gap-8{gap:calc(var(--spacing)*8)}.md\:p-4{padding:calc(var(--spacing)*4)}.md\:p-8{padding:calc(var(--spacing)*8)}.md\:px-0{padding-inline:calc(var(--spacing)*0)}.md\:px-4{padding-inline:calc(var(--spacing)*4)}.md\:px-8{padding-inline:calc(var(--spacing)*8)}.md\:px-20{padding-inline:calc(var(--spacing)*20)}.md\:py-1{padding-block:calc(var(--spacing)*1)}.md\:py-4{padding-block:calc(var(--spacing)*4)}.md\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.md\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.md\:text-8xl{font-size:var(--text-8xl);line-height:var(--tw-leading,var(--text-8xl--line-height))}.md\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.md\:text-\[200px\]{font-size:200px}}@media(min-width:64rem){.lg\:text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}}.dark\:border-red-800:where(.dark,.dark *){border-color:var(--color-red-800)}.dark\:border-slate-700:where(.dark,.dark *){border-color:var(--color-slate-700)}.dark\:border-slate-700\/50:where(.dark,.dark *){border-color:#31415880}@supports (color:color-mix(in lab,red,red)){.dark\:border-slate-700\/50:where(.dark,.dark *){border-color:color-mix(in oklab,var(--color-slate-700)50%,transparent)}}.dark\:bg-accent:where(.dark,.dark *){background-color:var(--color-accent)}.dark\:bg-blue-900\/40:where(.dark,.dark *){background-color:#1c398e66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-blue-900\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-blue-900)40%,transparent)}}.dark\:bg-gray-900:where(.dark,.dark *){background-color:var(--color-gray-900)}.dark\:bg-red-900\/20:where(.dark,.dark *){background-color:#82181a33}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-900\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-red-900)20%,transparent)}}.dark\:bg-secondary\/80:where(.dark,.dark *){background-color:color-mix(in srgb,rgb(var(--secondary))80%,transparent)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-secondary\/80:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-secondary)80%,transparent)}}.dark\:bg-slate-700\/40:where(.dark,.dark *){background-color:#31415866}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-700\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-700)40%,transparent)}}.dark\:bg-slate-700\/50:where(.dark,.dark *){background-color:#31415880}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-700\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-700)50%,transparent)}}.dark\:bg-slate-800\/30:where(.dark,.dark *){background-color:#1d293d4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-800\/30:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-800)30%,transparent)}}.dark\:bg-slate-800\/40:where(.dark,.dark *){background-color:#1d293d66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-slate-800\/40:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-slate-800)40%,transparent)}}.dark\:bg-slate-900:where(.dark,.dark *){background-color:var(--color-slate-900)}.dark\:bg-surface:where(.dark,.dark *){background-color:var(--color-surface)}.dark\:bg-white\/10:where(.dark,.dark *){background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:bg-white\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.dark\:text-blue-400:where(.dark,.dark *){color:var(--color-blue-400)}.dark\:text-green-400:where(.dark,.dark *){color:var(--color-green-400)}.dark\:text-primary:where(.dark,.dark *){color:var(--color-primary)}.dark\:text-red-400:where(.dark,.dark *){color:var(--color-red-400)}.dark\:text-slate-200:where(.dark,.dark *){color:var(--color-slate-200)}.dark\:text-slate-300:where(.dark,.dark *){color:var(--color-slate-300)}.dark\:text-slate-400:where(.dark,.dark *){color:var(--color-slate-400)}.dark\:text-white:where(.dark,.dark *){color:var(--color-white)}.dark\:text-yellow-400:where(.dark,.dark *){color:var(--color-yellow-400)}@media(hover:hover){.dark\:hover\:bg-slate-500\/80:where(.dark,.dark *):hover{background-color:#62748ecc}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-slate-500\/80:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-slate-500)80%,transparent)}}.dark\:hover\:bg-slate-600\/40:where(.dark,.dark *):hover{background-color:#45556c66}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-slate-600\/40:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-slate-600)40%,transparent)}}.dark\:hover\:bg-slate-700\/50:where(.dark,.dark *):hover{background-color:#31415880}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-slate-700\/50:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-slate-700)50%,transparent)}}.dark\:hover\:bg-slate-800\/60:where(.dark,.dark *):hover{background-color:#1d293d99}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-slate-800\/60:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-slate-800)60%,transparent)}}.dark\:hover\:bg-white\/5:where(.dark,.dark *):hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/5:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.dark\:hover\:bg-white\/10:where(.dark,.dark *):hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/10:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}}@media print{.print\:hidden{display:none}.print\:bg-white{background-color:var(--color-white)}.print\:p-8{padding:calc(var(--spacing)*8)}.print\:text-blue-900{color:var(--color-blue-900)}.print\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}}:root{--primary:121 113 107;--secondary:87 83 77;--surface:255 255 255;--surface-2:245 245 245;--text:15 23 42;--muted-text:100 116 139;--glass:121 113 107;--glass-alpha:.4;--glass-strong-alpha:.6;--accent:208 135 0;--accent-hover:217 119 6}.dark{--primary:245 250 252;--secondary:226 232 240;--surface:30 41 59;--surface-2:51 65 85;--text:255 255 255;--muted-text:148 163 184;--glass:30 58 138;--glass-alpha:.4;--glass-strong-alpha:.65;--accent:56 189 248;--accent-hover:14 165 233}body{background-color:var(--color-surface);min-height:100vh;color:var(--color-text);margin:0;font-family:Inter,system-ui,Avenir,Helvetica,Arial,sans-serif;transition:background-color .3s,color .3s}#root{width:100%;height:100%}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-scroll-snap-strictness{syntax:"*";inherits:false;initial-value:proximity}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}:root{--swiper-theme-color: #007aff}:host{position:relative;display:block;margin-left:auto;margin-right:auto;z-index:1}.swiper{margin-left:auto;margin-right:auto;position:relative;overflow:hidden;list-style:none;padding:0;z-index:1;display:block}.swiper-vertical>.swiper-wrapper{flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:flex;transition-property:transform;transition-timing-function:var(--swiper-wrapper-transition-timing-function, initial);box-sizing:content-box}.swiper-android .swiper-slide,.swiper-ios .swiper-slide,.swiper-wrapper{transform:translateZ(0)}.swiper-horizontal{touch-action:pan-y}.swiper-vertical{touch-action:pan-x}.swiper-slide{flex-shrink:0;width:100%;height:100%;position:relative;transition-property:transform;display:block}.swiper-slide-invisible-blank{visibility:hidden}.swiper-autoheight,.swiper-autoheight .swiper-slide{height:auto}.swiper-autoheight .swiper-wrapper{align-items:flex-start;transition-property:transform,height}.swiper-backface-hidden .swiper-slide{transform:translateZ(0);backface-visibility:hidden}.swiper-3d.swiper-css-mode .swiper-wrapper{perspective:1200px}.swiper-3d .swiper-wrapper{transform-style:preserve-3d}.swiper-3d{perspective:1200px}.swiper-3d .swiper-slide,.swiper-3d .swiper-cube-shadow{transform-style:preserve-3d}.swiper-css-mode>.swiper-wrapper{overflow:auto;scrollbar-width:none;-ms-overflow-style:none}.swiper-css-mode>.swiper-wrapper::-webkit-scrollbar{display:none}.swiper-css-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:start start}.swiper-css-mode.swiper-horizontal>.swiper-wrapper{scroll-snap-type:x mandatory}.swiper-css-mode.swiper-vertical>.swiper-wrapper{scroll-snap-type:y mandatory}.swiper-css-mode.swiper-free-mode>.swiper-wrapper{scroll-snap-type:none}.swiper-css-mode.swiper-free-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:none}.swiper-css-mode.swiper-centered>.swiper-wrapper:before{content:"";flex-shrink:0;order:9999}.swiper-css-mode.swiper-centered>.swiper-wrapper>.swiper-slide{scroll-snap-align:center center;scroll-snap-stop:always}.swiper-css-mode.swiper-centered.swiper-horizontal>.swiper-wrapper>.swiper-slide:first-child{margin-inline-start:var(--swiper-centered-offset-before)}.swiper-css-mode.swiper-centered.swiper-horizontal>.swiper-wrapper:before{height:100%;min-height:1px;width:var(--swiper-centered-offset-after)}.swiper-css-mode.swiper-centered.swiper-vertical>.swiper-wrapper>.swiper-slide:first-child{margin-block-start:var(--swiper-centered-offset-before)}.swiper-css-mode.swiper-centered.swiper-vertical>.swiper-wrapper:before{width:100%;min-width:1px;height:var(--swiper-centered-offset-after)}.swiper-3d .swiper-slide-shadow,.swiper-3d .swiper-slide-shadow-left,.swiper-3d .swiper-slide-shadow-right,.swiper-3d .swiper-slide-shadow-top,.swiper-3d .swiper-slide-shadow-bottom{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-3d .swiper-slide-shadow{background:#00000026}.swiper-3d .swiper-slide-shadow-left{background-image:linear-gradient(to left,#00000080,#0000)}.swiper-3d .swiper-slide-shadow-right{background-image:linear-gradient(to right,#00000080,#0000)}.swiper-3d .swiper-slide-shadow-top{background-image:linear-gradient(to top,#00000080,#0000)}.swiper-3d .swiper-slide-shadow-bottom{background-image:linear-gradient(to bottom,#00000080,#0000)}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;transform-origin:50%;box-sizing:border-box;border:4px solid var(--swiper-preloader-color, var(--swiper-theme-color));border-radius:50%;border-top-color:transparent}:is(.swiper:not(.swiper-watch-progress),.swiper-watch-progress .swiper-slide-visible) .swiper-lazy-preloader{animation:swiper-preloader-spin 1s infinite linear}.swiper-lazy-preloader-white{--swiper-preloader-color: #fff}.swiper-lazy-preloader-black{--swiper-preloader-color: #000}@keyframes swiper-preloader-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.calendar-slider{-webkit-appearance:none;appearance:none;width:100%;height:8px;background:transparent;cursor:pointer;position:relative;z-index:20}.calendar-slider:focus{outline:none}.calendar-slider::-webkit-slider-runnable-track{width:100%;height:8px;background:rgb(var(--accent));border-radius:9999px;cursor:pointer}.calendar-slider::-webkit-slider-thumb{-webkit-appearance:none;height:48px;width:48px;border-radius:8px;background:rgb(var(--primary));cursor:grab;margin-top:-20px;box-shadow:0 0 20px rgba(var(--accent),.5);border:2px solid rgb(var(--surface));display:flex;align-items:center;justify-content:center;background-image:radial-gradient(circle,rgb(var(--accent)) 40%,transparent 41%);background-size:16px 16px;background-position:center;background-repeat:no-repeat;transition:background-color .3s,border-color .3s}.calendar-slider:active::-webkit-slider-thumb{cursor:grabbing}.calendar-slider::-moz-range-track{width:100%;height:8px;background:rgb(var(--accent));border-radius:9999px;cursor:pointer}.calendar-slider::-moz-range-thumb{height:48px;width:48px;border:none;border-radius:8px;background:rgb(var(--primary));cursor:grab;box-shadow:0 0 20px rgba(var(--accent),.5);border:2px solid rgb(var(--surface));background-image:radial-gradient(circle,rgb(var(--accent)) 40%,transparent 41%);background-size:16px 16px;background-position:center;background-repeat:no-repeat;transition:background-color .3s,border-color .3s}.calendar-slider:active::-moz-range-thumb{cursor:grabbing} diff --git a/assets/index-sP2MAb9l.js b/assets/index-sP2MAb9l.js new file mode 100644 index 0000000..c4b8f2c --- /dev/null +++ b/assets/index-sP2MAb9l.js @@ -0,0 +1,3748 @@ +(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function t(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(i){if(i.ep)return;i.ep=!0;const s=t(i);fetch(i.href,s)}})();function RA(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var A_={exports:{}},Vp={},C_={exports:{}},tn={};var FE;function vN(){if(FE)return tn;FE=1;var n=Symbol.for("react.element"),e=Symbol.for("react.portal"),t=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),o=Symbol.for("react.context"),a=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),h=Symbol.for("react.lazy"),m=Symbol.iterator;function v(j){return j===null||typeof j!="object"?null:(j=m&&j[m]||j["@@iterator"],typeof j=="function"?j:null)}var y={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},_=Object.assign,S={};function x(j,re,ue){this.props=j,this.context=re,this.refs=S,this.updater=ue||y}x.prototype.isReactComponent={},x.prototype.setState=function(j,re){if(typeof j!="object"&&typeof j!="function"&&j!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,j,re,"setState")},x.prototype.forceUpdate=function(j){this.updater.enqueueForceUpdate(this,j,"forceUpdate")};function w(){}w.prototype=x.prototype;function A(j,re,ue){this.props=j,this.context=re,this.refs=S,this.updater=ue||y}var T=A.prototype=new w;T.constructor=A,_(T,x.prototype),T.isPureReactComponent=!0;var L=Array.isArray,D=Object.prototype.hasOwnProperty,z={current:null},O={key:!0,ref:!0,__self:!0,__source:!0};function F(j,re,ue){var ge,Re={},ke=null,Oe=null;if(re!=null)for(ge in re.ref!==void 0&&(Oe=re.ref),re.key!==void 0&&(ke=""+re.key),re)D.call(re,ge)&&!O.hasOwnProperty(ge)&&(Re[ge]=re[ge]);var Je=arguments.length-2;if(Je===1)Re.children=ue;else if(1>>1,re=H[j];if(0>>1;ji(Re,J))kei(Oe,Re)?(H[j]=Oe,H[ke]=J,j=ke):(H[j]=Re,H[ge]=J,j=ge);else if(kei(Oe,J))H[j]=Oe,H[ke]=J,j=ke;else break e}}return q}function i(H,q){var J=H.sortIndex-q.sortIndex;return J!==0?J:H.id-q.id}if(typeof performance=="object"&&typeof performance.now=="function"){var s=performance;n.unstable_now=function(){return s.now()}}else{var o=Date,a=o.now();n.unstable_now=function(){return o.now()-a}}var u=[],d=[],h=1,m=null,v=3,y=!1,_=!1,S=!1,x=typeof setTimeout=="function"?setTimeout:null,w=typeof clearTimeout=="function"?clearTimeout:null,A=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function T(H){for(var q=t(d);q!==null;){if(q.callback===null)r(d);else if(q.startTime<=H)r(d),q.sortIndex=q.expirationTime,e(u,q);else break;q=t(d)}}function L(H){if(S=!1,T(H),!_)if(t(u)!==null)_=!0,ae(D);else{var q=t(d);q!==null&&le(L,q.startTime-H)}}function D(H,q){_=!1,S&&(S=!1,w(F),F=-1),y=!0;var J=v;try{for(T(q),m=t(u);m!==null&&(!(m.expirationTime>q)||H&&!V());){var j=m.callback;if(typeof j=="function"){m.callback=null,v=m.priorityLevel;var re=j(m.expirationTime<=q);q=n.unstable_now(),typeof re=="function"?m.callback=re:m===t(u)&&r(u),T(q)}else r(u);m=t(u)}if(m!==null)var ue=!0;else{var ge=t(d);ge!==null&&le(L,ge.startTime-q),ue=!1}return ue}finally{m=null,v=J,y=!1}}var z=!1,O=null,F=-1,k=5,B=-1;function V(){return!(n.unstable_now()-BH||125j?(H.sortIndex=J,e(d,H),t(u)===null&&H===t(d)&&(S?(w(F),F=-1):S=!0,le(L,J-j))):(H.sortIndex=re,e(u,H),_||y||(_=!0,ae(D))),H},n.unstable_shouldYield=V,n.unstable_wrapCallback=function(H){var q=v;return function(){var J=v;v=q;try{return H.apply(this,arguments)}finally{v=J}}}})(L_)),L_}var jE;function wN(){return jE||(jE=1,P_.exports=xN()),P_.exports}var WE;function SN(){if(WE)return fs;WE=1;var n=iy(),e=wN();function t(l){for(var c="https://reactjs.org/docs/error-decoder.html?invariant="+l,g=1;g"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),u=Object.prototype.hasOwnProperty,d=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,h={},m={};function v(l){return u.call(m,l)?!0:u.call(h,l)?!1:d.test(l)?m[l]=!0:(h[l]=!0,!1)}function y(l,c,g,M){if(g!==null&&g.type===0)return!1;switch(typeof c){case"function":case"symbol":return!0;case"boolean":return M?!1:g!==null?!g.acceptsBooleans:(l=l.toLowerCase().slice(0,5),l!=="data-"&&l!=="aria-");default:return!1}}function _(l,c,g,M){if(c===null||typeof c>"u"||y(l,c,g,M))return!0;if(M)return!1;if(g!==null)switch(g.type){case 3:return!c;case 4:return c===!1;case 5:return isNaN(c);case 6:return isNaN(c)||1>c}return!1}function S(l,c,g,M,C,N,G){this.acceptsBooleans=c===2||c===3||c===4,this.attributeName=M,this.attributeNamespace=C,this.mustUseProperty=g,this.propertyName=l,this.type=c,this.sanitizeURL=N,this.removeEmptyString=G}var x={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(l){x[l]=new S(l,0,!1,l,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(l){var c=l[0];x[c]=new S(c,1,!1,l[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(l){x[l]=new S(l,2,!1,l.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(l){x[l]=new S(l,2,!1,l,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(l){x[l]=new S(l,3,!1,l.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(l){x[l]=new S(l,3,!0,l,null,!1,!1)}),["capture","download"].forEach(function(l){x[l]=new S(l,4,!1,l,null,!1,!1)}),["cols","rows","size","span"].forEach(function(l){x[l]=new S(l,6,!1,l,null,!1,!1)}),["rowSpan","start"].forEach(function(l){x[l]=new S(l,5,!1,l.toLowerCase(),null,!1,!1)});var w=/[\-:]([a-z])/g;function A(l){return l[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(l){var c=l.replace(w,A);x[c]=new S(c,1,!1,l,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(l){var c=l.replace(w,A);x[c]=new S(c,1,!1,l,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(l){var c=l.replace(w,A);x[c]=new S(c,1,!1,l,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(l){x[l]=new S(l,1,!1,l.toLowerCase(),null,!1,!1)}),x.xlinkHref=new S("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(l){x[l]=new S(l,1,!1,l.toLowerCase(),null,!0,!0)});function T(l,c,g,M){var C=x.hasOwnProperty(c)?x[c]:null;(C!==null?C.type!==0:M||!(2ne||C[G]!==N[ne]){var ce=` +`+C[G].replace(" at new "," at ");return l.displayName&&ce.includes("")&&(ce=ce.replace("",l.displayName)),ce}while(1<=G&&0<=ne);break}}}finally{ue=!1,Error.prepareStackTrace=g}return(l=l?l.displayName||l.name:"")?re(l):""}function Re(l){switch(l.tag){case 5:return re(l.type);case 16:return re("Lazy");case 13:return re("Suspense");case 19:return re("SuspenseList");case 0:case 2:case 15:return l=ge(l.type,!1),l;case 11:return l=ge(l.type.render,!1),l;case 1:return l=ge(l.type,!0),l;default:return""}}function ke(l){if(l==null)return null;if(typeof l=="function")return l.displayName||l.name||null;if(typeof l=="string")return l;switch(l){case O:return"Fragment";case z:return"Portal";case k:return"Profiler";case F:return"StrictMode";case Q:return"Suspense";case $:return"SuspenseList"}if(typeof l=="object")switch(l.$$typeof){case V:return(l.displayName||"Context")+".Consumer";case B:return(l._context.displayName||"Context")+".Provider";case W:var c=l.render;return l=l.displayName,l||(l=c.displayName||c.name||"",l=l!==""?"ForwardRef("+l+")":"ForwardRef"),l;case ie:return c=l.displayName||null,c!==null?c:ke(l.type)||"Memo";case ae:c=l._payload,l=l._init;try{return ke(l(c))}catch{}}return null}function Oe(l){var c=l.type;switch(l.tag){case 24:return"Cache";case 9:return(c.displayName||"Context")+".Consumer";case 10:return(c._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return l=c.render,l=l.displayName||l.name||"",c.displayName||(l!==""?"ForwardRef("+l+")":"ForwardRef");case 7:return"Fragment";case 5:return c;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ke(c);case 8:return c===F?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof c=="function")return c.displayName||c.name||null;if(typeof c=="string")return c}return null}function Je(l){switch(typeof l){case"boolean":case"number":case"string":case"undefined":return l;case"object":return l;default:return""}}function nt(l){var c=l.type;return(l=l.nodeName)&&l.toLowerCase()==="input"&&(c==="checkbox"||c==="radio")}function Qe(l){var c=nt(l)?"checked":"value",g=Object.getOwnPropertyDescriptor(l.constructor.prototype,c),M=""+l[c];if(!l.hasOwnProperty(c)&&typeof g<"u"&&typeof g.get=="function"&&typeof g.set=="function"){var C=g.get,N=g.set;return Object.defineProperty(l,c,{configurable:!0,get:function(){return C.call(this)},set:function(G){M=""+G,N.call(this,G)}}),Object.defineProperty(l,c,{enumerable:g.enumerable}),{getValue:function(){return M},setValue:function(G){M=""+G},stopTracking:function(){l._valueTracker=null,delete l[c]}}}}function mt(l){l._valueTracker||(l._valueTracker=Qe(l))}function oe(l){if(!l)return!1;var c=l._valueTracker;if(!c)return!0;var g=c.getValue(),M="";return l&&(M=nt(l)?l.checked?"true":"false":l.value),l=M,l!==g?(c.setValue(l),!0):!1}function Be(l){if(l=l||(typeof document<"u"?document:void 0),typeof l>"u")return null;try{return l.activeElement||l.body}catch{return l.body}}function Ne(l,c){var g=c.checked;return J({},c,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:g??l._wrapperState.initialChecked})}function je(l,c){var g=c.defaultValue==null?"":c.defaultValue,M=c.checked!=null?c.checked:c.defaultChecked;g=Je(c.value!=null?c.value:g),l._wrapperState={initialChecked:M,initialValue:g,controlled:c.type==="checkbox"||c.type==="radio"?c.checked!=null:c.value!=null}}function Ie(l,c){c=c.checked,c!=null&&T(l,"checked",c,!1)}function gt(l,c){Ie(l,c);var g=Je(c.value),M=c.type;if(g!=null)M==="number"?(g===0&&l.value===""||l.value!=g)&&(l.value=""+g):l.value!==""+g&&(l.value=""+g);else if(M==="submit"||M==="reset"){l.removeAttribute("value");return}c.hasOwnProperty("value")?Y(l,c.type,g):c.hasOwnProperty("defaultValue")&&Y(l,c.type,Je(c.defaultValue)),c.checked==null&&c.defaultChecked!=null&&(l.defaultChecked=!!c.defaultChecked)}function rt(l,c,g){if(c.hasOwnProperty("value")||c.hasOwnProperty("defaultValue")){var M=c.type;if(!(M!=="submit"&&M!=="reset"||c.value!==void 0&&c.value!==null))return;c=""+l._wrapperState.initialValue,g||c===l.value||(l.value=c),l.defaultValue=c}g=l.name,g!==""&&(l.name=""),l.defaultChecked=!!l._wrapperState.initialChecked,g!==""&&(l.name=g)}function Y(l,c,g){(c!=="number"||Be(l.ownerDocument)!==l)&&(g==null?l.defaultValue=""+l._wrapperState.initialValue:l.defaultValue!==""+g&&(l.defaultValue=""+g))}var I=Array.isArray;function X(l,c,g,M){if(l=l.options,c){c={};for(var C=0;C"+c.valueOf().toString()+"",c=Ze.firstChild;l.firstChild;)l.removeChild(l.firstChild);for(;c.firstChild;)l.appendChild(c.firstChild)}});function De(l,c){if(c){var g=l.firstChild;if(g&&g===l.lastChild&&g.nodeType===3){g.nodeValue=c;return}}l.textContent=c}var kt={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},jt=["Webkit","ms","Moz","O"];Object.keys(kt).forEach(function(l){jt.forEach(function(c){c=c+l.charAt(0).toUpperCase()+l.substring(1),kt[c]=kt[l]})});function At(l,c,g){return c==null||typeof c=="boolean"||c===""?"":g||typeof c!="number"||c===0||kt.hasOwnProperty(l)&&kt[l]?(""+c).trim():c+"px"}function xt(l,c){l=l.style;for(var g in c)if(c.hasOwnProperty(g)){var M=g.indexOf("--")===0,C=At(g,c[g],M);g==="float"&&(g="cssFloat"),M?l.setProperty(g,C):l[g]=C}}var ct=J({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function It(l,c){if(c){if(ct[l]&&(c.children!=null||c.dangerouslySetInnerHTML!=null))throw Error(t(137,l));if(c.dangerouslySetInnerHTML!=null){if(c.children!=null)throw Error(t(60));if(typeof c.dangerouslySetInnerHTML!="object"||!("__html"in c.dangerouslySetInnerHTML))throw Error(t(61))}if(c.style!=null&&typeof c.style!="object")throw Error(t(62))}}function en(l,c){if(l.indexOf("-")===-1)return typeof c.is=="string";switch(l){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var gn=null;function Ht(l){return l=l.target||l.srcElement||window,l.correspondingUseElement&&(l=l.correspondingUseElement),l.nodeType===3?l.parentNode:l}var $e=null,de=null,Ye=null;function et(l){if(l=bo(l)){if(typeof $e!="function")throw Error(t(280));var c=l.stateNode;c&&(c=df(c),$e(l.stateNode,l.type,c))}}function Ct(l){de?Ye?Ye.push(l):Ye=[l]:de=l}function bt(){if(de){var l=de,c=Ye;if(Ye=de=null,et(l),c)for(l=0;l>>=0,l===0?32:31-(qt(l)/jn|0)|0}var ai=64,Kn=4194304;function Rn(l){switch(l&-l){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return l&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return l&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return l}}function Di(l,c){var g=l.pendingLanes;if(g===0)return 0;var M=0,C=l.suspendedLanes,N=l.pingedLanes,G=g&268435455;if(G!==0){var ne=G&~C;ne!==0?M=Rn(ne):(N&=G,N!==0&&(M=Rn(N)))}else G=g&~C,G!==0?M=Rn(G):N!==0&&(M=Rn(N));if(M===0)return 0;if(c!==0&&c!==M&&(c&C)===0&&(C=M&-M,N=c&-c,C>=N||C===16&&(N&4194240)!==0))return c;if((M&4)!==0&&(M|=g&16),c=l.entangledLanes,c!==0)for(l=l.entanglements,c&=M;0g;g++)c.push(l);return c}function $u(l,c,g){l.pendingLanes|=c,c!==536870912&&(l.suspendedLanes=0,l.pingedLanes=0),l=l.eventTimes,c=31-Gn(c),l[c]=g}function Jy(l,c){var g=l.pendingLanes&~c;l.pendingLanes=c,l.suspendedLanes=0,l.pingedLanes=0,l.expiredLanes&=c,l.mutableReadLanes&=c,l.entangledLanes&=c,c=l.entanglements;var M=l.eventTimes;for(l=l.expirationTimes;0=Br),os=" ",np=!1;function rp(l,c){switch(l){case"keyup":return tp.indexOf(c.keyCode)!==-1;case"keydown":return c.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function $d(l){return l=l.detail,typeof l=="object"&&"data"in l?l.data:null}var aa=!1;function Ag(l,c){switch(l){case"compositionend":return $d(c);case"keypress":return c.which!==32?null:(np=!0,os);case"textInput":return l=c.data,l===os&&np?null:l;default:return null}}function ec(l,c){if(aa)return l==="compositionend"||!ci&&rp(l,c)?(l=Ku(),_i=Zh=As=null,aa=!1,l):null;switch(l){case"paste":return null;case"keypress":if(!(c.ctrlKey||c.altKey||c.metaKey)||c.ctrlKey&&c.altKey){if(c.char&&1=c)return{node:g,offset:c-l};l=M}e:{for(;g;){if(g.nextSibling){g=g.nextSibling;break e}g=g.parentNode}g=void 0}g=tc(g)}}function Ga(l,c){return l&&c?l===c?!0:l&&l.nodeType===3?!1:c&&c.nodeType===3?Ga(l,c.parentNode):"contains"in l?l.contains(c):l.compareDocumentPosition?!!(l.compareDocumentPosition(c)&16):!1:!1}function Hn(){for(var l=window,c=Be();c instanceof l.HTMLIFrameElement;){try{var g=typeof c.contentWindow.location.href=="string"}catch{g=!1}if(g)l=c.contentWindow;else break;c=Be(l.document)}return c}function br(l){var c=l&&l.nodeName&&l.nodeName.toLowerCase();return c&&(c==="input"&&(l.type==="text"||l.type==="search"||l.type==="tel"||l.type==="url"||l.type==="password")||c==="textarea"||l.contentEditable==="true")}function Tr(l){var c=Hn(),g=l.focusedElem,M=l.selectionRange;if(c!==g&&g&&g.ownerDocument&&Ga(g.ownerDocument.documentElement,g)){if(M!==null&&br(g)){if(c=M.start,l=M.end,l===void 0&&(l=c),"selectionStart"in g)g.selectionStart=c,g.selectionEnd=Math.min(l,g.value.length);else if(l=(c=g.ownerDocument||document)&&c.defaultView||window,l.getSelection){l=l.getSelection();var C=g.textContent.length,N=Math.min(M.start,C);M=M.end===void 0?N:Math.min(M.end,C),!l.extend&&N>M&&(C=M,M=N,N=C),C=Ui(g,N);var G=Ui(g,M);C&&G&&(l.rangeCount!==1||l.anchorNode!==C.node||l.anchorOffset!==C.offset||l.focusNode!==G.node||l.focusOffset!==G.offset)&&(c=c.createRange(),c.setStart(C.node,C.offset),l.removeAllRanges(),N>M?(l.addRange(c),l.extend(G.node,G.offset)):(c.setEnd(G.node,G.offset),l.addRange(c)))}}for(c=[],l=g;l=l.parentNode;)l.nodeType===1&&c.push({element:l,left:l.scrollLeft,top:l.scrollTop});for(typeof g.focus=="function"&&g.focus(),g=0;g=document.documentMode,Ks=null,ja=null,nc=null,Ar=!1;function Kd(l,c,g){var M=g.window===g?g.document:g.nodeType===9?g:g.ownerDocument;Ar||Ks==null||Ks!==Be(M)||(M=Ks,"selectionStart"in M&&br(M)?M={start:M.selectionStart,end:M.selectionEnd}:(M=(M.ownerDocument&&M.ownerDocument.defaultView||window).getSelection(),M={anchorNode:M.anchorNode,anchorOffset:M.anchorOffset,focusNode:M.focusNode,focusOffset:M.focusOffset}),nc&&Ha(nc,M)||(nc=M,M=of(ja,"onSelect"),0Cr||(l.current=mp[Cr],mp[Cr]=null,Cr--)}function xn(l,c){Cr++,mp[Cr]=l.current,l.current=c}var To={},Vr=Wn(To),di=Wn(!1),Ao=To;function qa(l,c){var g=l.type.contextTypes;if(!g)return To;var M=l.stateNode;if(M&&M.__reactInternalMemoizedUnmaskedChildContext===c)return M.__reactInternalMemoizedMaskedChildContext;var C={},N;for(N in g)C[N]=c[N];return M&&(l=l.stateNode,l.__reactInternalMemoizedUnmaskedChildContext=c,l.__reactInternalMemoizedMaskedChildContext=C),C}function Jr(l){return l=l.childContextTypes,l!=null}function cc(){An(di),An(Vr)}function gp(l,c,g){if(Vr.current!==To)throw Error(t(168));xn(Vr,c),xn(di,g)}function dc(l,c,g){var M=l.stateNode;if(c=c.childContextTypes,typeof M.getChildContext!="function")return g;M=M.getChildContext();for(var C in M)if(!(C in c))throw Error(t(108,Oe(l)||"Unknown",C));return J({},g,M)}function Za(l){return l=(l=l.stateNode)&&l.__reactInternalMemoizedMergedChildContext||To,Ao=Vr.current,xn(Vr,l),xn(di,di.current),!0}function vp(l,c,g){var M=l.stateNode;if(!M)throw Error(t(169));g?(l=dc(l,c,Ao),M.__reactInternalMemoizedMergedChildContext=l,An(di),An(Vr),xn(Vr,l)):An(di),xn(di,g)}var Ls=null,fc=!1,ff=!1;function hc(l){Ls===null?Ls=[l]:Ls.push(l)}function Dg(l){fc=!0,hc(l)}function eo(){if(!ff&&Ls!==null){ff=!0;var l=0,c=ln;try{var g=Ls;for(ln=1;l>=G,C-=G,qe=1<<32-Gn(c)+C|g<zt?(ti=Lt,Lt=null):ti=Lt.sibling;var pn=Fe(_e,Lt,xe[zt],Xe);if(pn===null){Lt===null&&(Lt=ti);break}l&&Lt&&pn.alternate===null&&c(_e,Lt),fe=N(pn,fe,zt),Pt===null?St=pn:Pt.sibling=pn,Pt=pn,Lt=ti}if(zt===xe.length)return g(_e,Lt),Pn&&Co(_e,zt),St;if(Lt===null){for(;ztzt?(ti=Lt,Lt=null):ti=Lt.sibling;var pu=Fe(_e,Lt,pn.value,Xe);if(pu===null){Lt===null&&(Lt=ti);break}l&&Lt&&pu.alternate===null&&c(_e,Lt),fe=N(pu,fe,zt),Pt===null?St=pu:Pt.sibling=pu,Pt=pu,Lt=ti}if(pn.done)return g(_e,Lt),Pn&&Co(_e,zt),St;if(Lt===null){for(;!pn.done;zt++,pn=xe.next())pn=Ge(_e,pn.value,Xe),pn!==null&&(fe=N(pn,fe,zt),Pt===null?St=pn:Pt.sibling=pn,Pt=pn);return Pn&&Co(_e,zt),St}for(Lt=M(_e,Lt);!pn.done;zt++,pn=xe.next())pn=at(Lt,_e,zt,pn.value,Xe),pn!==null&&(l&&pn.alternate!==null&&Lt.delete(pn.key===null?zt:pn.key),fe=N(pn,fe,zt),Pt===null?St=pn:Pt.sibling=pn,Pt=pn);return l&&Lt.forEach(function(gN){return c(_e,gN)}),Pn&&Co(_e,zt),St}function mr(_e,fe,xe,Xe){if(typeof xe=="object"&&xe!==null&&xe.type===O&&xe.key===null&&(xe=xe.props.children),typeof xe=="object"&&xe!==null){switch(xe.$$typeof){case D:e:{for(var St=xe.key,Pt=fe;Pt!==null;){if(Pt.key===St){if(St=xe.type,St===O){if(Pt.tag===7){g(_e,Pt.sibling),fe=C(Pt,xe.props.children),fe.return=_e,_e=fe;break e}}else if(Pt.elementType===St||typeof St=="object"&&St!==null&&St.$$typeof===ae&&Ep(St)===Pt.type){g(_e,Pt.sibling),fe=C(Pt,xe.props),fe.ref=pc(_e,Pt,xe),fe.return=_e,_e=fe;break e}g(_e,Pt);break}else c(_e,Pt);Pt=Pt.sibling}xe.type===O?(fe=Nc(xe.props.children,_e.mode,Xe,xe.key),fe.return=_e,_e=fe):(Xe=iv(xe.type,xe.key,xe.props,null,_e.mode,Xe),Xe.ref=pc(_e,fe,xe),Xe.return=_e,_e=Xe)}return G(_e);case z:e:{for(Pt=xe.key;fe!==null;){if(fe.key===Pt)if(fe.tag===4&&fe.stateNode.containerInfo===xe.containerInfo&&fe.stateNode.implementation===xe.implementation){g(_e,fe.sibling),fe=C(fe,xe.children||[]),fe.return=_e,_e=fe;break e}else{g(_e,fe);break}else c(_e,fe);fe=fe.sibling}fe=S_(xe,_e.mode,Xe),fe.return=_e,_e=fe}return G(_e);case ae:return Pt=xe._init,mr(_e,fe,Pt(xe._payload),Xe)}if(I(xe))return ht(_e,fe,xe,Xe);if(q(xe))return vt(_e,fe,xe,Xe);mc(_e,xe)}return typeof xe=="string"&&xe!==""||typeof xe=="number"?(xe=""+xe,fe!==null&&fe.tag===6?(g(_e,fe.sibling),fe=C(fe,xe),fe.return=_e,_e=fe):(g(_e,fe),fe=w_(xe,_e.mode,Xe),fe.return=_e,_e=fe),G(_e)):g(_e,fe)}return mr}var Ka=Mp(!0),gc=Mp(!1),Qa=Wn(null),el=null,Po=null,ru=null;function tl(){ru=Po=el=null}function vc(l){var c=Qa.current;An(Qa),l._currentValue=c}function yc(l,c,g){for(;l!==null;){var M=l.alternate;if((l.childLanes&c)!==c?(l.childLanes|=c,M!==null&&(M.childLanes|=c)):M!==null&&(M.childLanes&c)!==c&&(M.childLanes|=c),l===g)break;l=l.return}}function ha(l,c){el=l,ru=Po=null,l=l.dependencies,l!==null&&l.firstContext!==null&&((l.lanes&c)!==0&&(Xt=!0),l.firstContext=null)}function Bi(l){var c=l._currentValue;if(ru!==l)if(l={context:l,memoizedValue:c,next:null},Po===null){if(el===null)throw Error(t(308));Po=l,el.dependencies={lanes:0,firstContext:l}}else Po=Po.next=l;return c}var Lo=null;function bp(l){Lo===null?Lo=[l]:Lo.push(l)}function _c(l,c,g,M){var C=c.interleaved;return C===null?(g.next=g,bp(c)):(g.next=C.next,C.next=g),c.interleaved=g,Ns(l,M)}function Ns(l,c){l.lanes|=c;var g=l.alternate;for(g!==null&&(g.lanes|=c),g=l,l=l.return;l!==null;)l.childLanes|=c,g=l.alternate,g!==null&&(g.childLanes|=c),g=l,l=l.return;return g.tag===3?g.stateNode:null}var yn=!1;function Wt(l){l.updateQueue={baseState:l.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function er(l,c){l=l.updateQueue,c.updateQueue===l&&(c.updateQueue={baseState:l.baseState,firstBaseUpdate:l.firstBaseUpdate,lastBaseUpdate:l.lastBaseUpdate,shared:l.shared,effects:l.effects})}function _n(l,c){return{eventTime:l,lane:c,tag:0,payload:null,callback:null,next:null}}function On(l,c,g){var M=l.updateQueue;if(M===null)return null;if(M=M.shared,(cn&2)!==0){var C=M.pending;return C===null?c.next=c:(c.next=C.next,C.next=c),M.pending=c,Ns(l,g)}return C=M.interleaved,C===null?(c.next=c,bp(M)):(c.next=C.next,C.next=c),M.interleaved=c,Ns(l,g)}function Kr(l,c,g){if(c=c.updateQueue,c!==null&&(c=c.shared,(g&4194240)!==0)){var M=c.lanes;M&=l.pendingLanes,g|=M,c.lanes=g,zl(l,g)}}function nl(l,c){var g=l.updateQueue,M=l.alternate;if(M!==null&&(M=M.updateQueue,g===M)){var C=null,N=null;if(g=g.firstBaseUpdate,g!==null){do{var G={eventTime:g.eventTime,lane:g.lane,tag:g.tag,payload:g.payload,callback:g.callback,next:null};N===null?C=N=G:N=N.next=G,g=g.next}while(g!==null);N===null?C=N=c:N=N.next=c}else C=N=c;g={baseState:M.baseState,firstBaseUpdate:C,lastBaseUpdate:N,shared:M.shared,effects:M.effects},l.updateQueue=g;return}l=g.lastBaseUpdate,l===null?g.firstBaseUpdate=c:l.next=c,g.lastBaseUpdate=c}function Xn(l,c,g,M){var C=l.updateQueue;yn=!1;var N=C.firstBaseUpdate,G=C.lastBaseUpdate,ne=C.shared.pending;if(ne!==null){C.shared.pending=null;var ce=ne,Me=ce.next;ce.next=null,G===null?N=Me:G.next=Me,G=ce;var Ve=l.alternate;Ve!==null&&(Ve=Ve.updateQueue,ne=Ve.lastBaseUpdate,ne!==G&&(ne===null?Ve.firstBaseUpdate=Me:ne.next=Me,Ve.lastBaseUpdate=ce))}if(N!==null){var Ge=C.baseState;G=0,Ve=Me=ce=null,ne=N;do{var Fe=ne.lane,at=ne.eventTime;if((M&Fe)===Fe){Ve!==null&&(Ve=Ve.next={eventTime:at,lane:0,tag:ne.tag,payload:ne.payload,callback:ne.callback,next:null});e:{var ht=l,vt=ne;switch(Fe=c,at=g,vt.tag){case 1:if(ht=vt.payload,typeof ht=="function"){Ge=ht.call(at,Ge,Fe);break e}Ge=ht;break e;case 3:ht.flags=ht.flags&-65537|128;case 0:if(ht=vt.payload,Fe=typeof ht=="function"?ht.call(at,Ge,Fe):ht,Fe==null)break e;Ge=J({},Ge,Fe);break e;case 2:yn=!0}}ne.callback!==null&&ne.lane!==0&&(l.flags|=64,Fe=C.effects,Fe===null?C.effects=[ne]:Fe.push(ne))}else at={eventTime:at,lane:Fe,tag:ne.tag,payload:ne.payload,callback:ne.callback,next:null},Ve===null?(Me=Ve=at,ce=Ge):Ve=Ve.next=at,G|=Fe;if(ne=ne.next,ne===null){if(ne=C.shared.pending,ne===null)break;Fe=ne,ne=Fe.next,Fe.next=null,C.lastBaseUpdate=Fe,C.shared.pending=null}}while(!0);if(Ve===null&&(ce=Ge),C.baseState=ce,C.firstBaseUpdate=Me,C.lastBaseUpdate=Ve,c=C.shared.interleaved,c!==null){C=c;do G|=C.lane,C=C.next;while(C!==c)}else N===null&&(C.shared.lanes=0);Cc|=G,l.lanes=G,l.memoizedState=Ge}}function iu(l,c,g){if(l=c.effects,c.effects=null,l!==null)for(c=0;cg?g:4,l(!0);var M=ol.transition;ol.transition={};try{l(!1),c()}finally{ln=g,ol.transition=M}}function Do(){return Hi().memoizedState}function wf(l,c,g){var M=du(l);if(g={lane:M,action:g,hasEagerState:!1,eagerState:null,next:null},Tc(l))Sf(c,g);else if(g=_c(l,c,g,M),g!==null){var C=Wi();Fo(g,l,M,C),Ef(g,c,M)}}function al(l,c,g){var M=du(l),C={lane:M,action:g,hasEagerState:!1,eagerState:null,next:null};if(Tc(l))Sf(c,C);else{var N=l.alternate;if(l.lanes===0&&(N===null||N.lanes===0)&&(N=c.lastRenderedReducer,N!==null))try{var G=c.lastRenderedState,ne=N(G,g);if(C.hasEagerState=!0,C.eagerState=ne,zi(ne,G)){var ce=c.interleaved;ce===null?(C.next=C,bp(c)):(C.next=ce.next,ce.next=C),c.interleaved=C;return}}catch{}finally{}g=_c(l,c,C,M),g!==null&&(C=Wi(),Fo(g,l,M,C),Ef(g,c,M))}}function Tc(l){var c=l.alternate;return l===Cn||c!==null&&c===Cn}function Sf(l,c){Qr=ks=!0;var g=l.pending;g===null?c.next=c:(c.next=g.next,g.next=c),l.pending=c}function Ef(l,c,g){if((g&4194240)!==0){var M=c.lanes;M&=l.pendingLanes,g|=M,c.lanes=g,zl(l,g)}}var Mf={readContext:Bi,useCallback:Gr,useContext:Gr,useEffect:Gr,useImperativeHandle:Gr,useInsertionEffect:Gr,useLayoutEffect:Gr,useMemo:Gr,useReducer:Gr,useRef:Gr,useState:Gr,useDebugValue:Gr,useDeferredValue:Gr,useTransition:Gr,useMutableSource:Gr,useSyncExternalStore:Gr,useId:Gr,unstable_isNewReconciler:!1},Hg={readContext:Bi,useCallback:function(l,c){return jr().memoizedState=[l,c===void 0?null:c],l},useContext:Bi,useEffect:pi,useImperativeHandle:function(l,c,g){return g=g!=null?g.concat([l]):null,ro(4194308,4,Bg.bind(null,c,l),g)},useLayoutEffect:function(l,c){return ro(4194308,4,l,c)},useInsertionEffect:function(l,c){return ro(4,2,l,c)},useMemo:function(l,c){var g=jr();return c=c===void 0?null:c,l=l(),g.memoizedState=[l,c],l},useReducer:function(l,c,g){var M=jr();return c=g!==void 0?g(c):c,M.memoizedState=M.baseState=c,l={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:l,lastRenderedState:c},M.queue=l,l=l.dispatch=wf.bind(null,Cn,l),[M.memoizedState,l]},useRef:function(l){var c=jr();return l={current:l},c.memoizedState=l},useState:Pp,useDebugValue:_f,useDeferredValue:function(l){return jr().memoizedState=l},useTransition:function(){var l=Pp(!1),c=l[0];return l=r_.bind(null,l[1]),jr().memoizedState=l,[c,l]},useMutableSource:function(){},useSyncExternalStore:function(l,c,g){var M=Cn,C=jr();if(Pn){if(g===void 0)throw Error(t(407));g=g()}else{if(g=c(),ei===null)throw Error(t(349));(Io&30)!==0||yf(M,c,g)}C.memoizedState=g;var N={value:g,getSnapshot:c};return C.queue=N,pi(Og.bind(null,M,N,l),[l]),M.flags|=2048,Ds(9,Mc.bind(null,M,N,g,c),void 0,null),g},useId:function(){var l=jr(),c=ei.identifierPrefix;if(Pn){var g=as,M=qe;g=(M&~(1<<32-Gn(M)-1)).toString(32)+g,c=":"+c+"R"+g,g=ma++,0<\/script>",l=l.removeChild(l.firstChild)):typeof M.is=="string"?l=G.createElement(g,{is:M.is}):(l=G.createElement(g),g==="select"&&(G=l,M.multiple?G.multiple=!0:M.size&&(G.size=M.size))):l=G.createElementNS(l,g),l[pr]=c,l[eu]=M,cE(l,c,!1,!1),c.stateNode=l;e:{switch(G=en(g,M),g){case"dialog":Tn("cancel",l),Tn("close",l),C=M;break;case"iframe":case"object":case"embed":Tn("load",l),C=M;break;case"video":case"audio":for(C=0;CCf&&(c.flags|=128,M=!0,Dp(N,!1),c.lanes=4194304)}else{if(!M)if(l=Is(G),l!==null){if(c.flags|=128,M=!0,g=l.updateQueue,g!==null&&(c.updateQueue=g,c.flags|=4),Dp(N,!0),N.tail===null&&N.tailMode==="hidden"&&!G.alternate&&!Pn)return Mi(c),null}else 2*ot()-N.renderingStartTime>Cf&&g!==1073741824&&(c.flags|=128,M=!0,Dp(N,!1),c.lanes=4194304);N.isBackwards?(G.sibling=c.child,c.child=G):(g=N.last,g!==null?g.sibling=G:c.child=G,N.last=G)}return N.tail!==null?(c=N.tail,N.rendering=c,N.tail=c.sibling,N.renderingStartTime=ot(),c.sibling=null,g=Ln.current,xn(Ln,M?g&1|2:g&1),c):(Mi(c),null);case 22:case 23:return y_(),M=c.memoizedState!==null,l!==null&&l.memoizedState!==null!==M&&(c.flags|=8192),M&&(c.mode&1)!==0?(Os&1073741824)!==0&&(Mi(c),c.subtreeFlags&6&&(c.flags|=8192)):Mi(c),null;case 24:return null;case 25:return null}throw Error(t(156,c.tag))}function YL(l,c){switch(Ro(c),c.tag){case 1:return Jr(c.type)&&cc(),l=c.flags,l&65536?(c.flags=l&-65537|128,c):null;case 3:return pa(),An(di),An(Vr),no(),l=c.flags,(l&65536)!==0&&(l&128)===0?(c.flags=l&-65537|128,c):null;case 5:return su(c),null;case 13:if(An(Ln),l=c.memoizedState,l!==null&&l.dehydrated!==null){if(c.alternate===null)throw Error(t(340));fa()}return l=c.flags,l&65536?(c.flags=l&-65537|128,c):null;case 19:return An(Ln),null;case 4:return pa(),null;case 10:return vc(c.type._context),null;case 22:case 23:return y_(),null;case 24:return null;default:return null}}var qg=!1,bi=!1,JL=typeof WeakSet=="function"?WeakSet:Set,ft=null;function Tf(l,c){var g=l.ref;if(g!==null)if(typeof g=="function")try{g(null)}catch(M){ar(l,c,M)}else g.current=null}function o_(l,c,g){try{g()}catch(M){ar(l,c,M)}}var hE=!1;function KL(l,c){if(Ql=ts,l=Hn(),br(l)){if("selectionStart"in l)var g={start:l.selectionStart,end:l.selectionEnd};else e:{g=(g=l.ownerDocument)&&g.defaultView||window;var M=g.getSelection&&g.getSelection();if(M&&M.rangeCount!==0){g=M.anchorNode;var C=M.anchorOffset,N=M.focusNode;M=M.focusOffset;try{g.nodeType,N.nodeType}catch{g=null;break e}var G=0,ne=-1,ce=-1,Me=0,Ve=0,Ge=l,Fe=null;t:for(;;){for(var at;Ge!==g||C!==0&&Ge.nodeType!==3||(ne=G+C),Ge!==N||M!==0&&Ge.nodeType!==3||(ce=G+M),Ge.nodeType===3&&(G+=Ge.nodeValue.length),(at=Ge.firstChild)!==null;)Fe=Ge,Ge=at;for(;;){if(Ge===l)break t;if(Fe===g&&++Me===C&&(ne=G),Fe===N&&++Ve===M&&(ce=G),(at=Ge.nextSibling)!==null)break;Ge=Fe,Fe=Ge.parentNode}Ge=at}g=ne===-1||ce===-1?null:{start:ne,end:ce}}else g=null}g=g||{start:0,end:0}}else g=null;for(cp={focusedElem:l,selectionRange:g},ts=!1,ft=c;ft!==null;)if(c=ft,l=c.child,(c.subtreeFlags&1028)!==0&&l!==null)l.return=c,ft=l;else for(;ft!==null;){c=ft;try{var ht=c.alternate;if((c.flags&1024)!==0)switch(c.tag){case 0:case 11:case 15:break;case 1:if(ht!==null){var vt=ht.memoizedProps,mr=ht.memoizedState,_e=c.stateNode,fe=_e.getSnapshotBeforeUpdate(c.elementType===c.type?vt:us(c.type,vt),mr);_e.__reactInternalSnapshotBeforeUpdate=fe}break;case 3:var xe=c.stateNode.containerInfo;xe.nodeType===1?xe.textContent="":xe.nodeType===9&&xe.documentElement&&xe.removeChild(xe.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(t(163))}}catch(Xe){ar(c,c.return,Xe)}if(l=c.sibling,l!==null){l.return=c.return,ft=l;break}ft=c.return}return ht=hE,hE=!1,ht}function Op(l,c,g){var M=c.updateQueue;if(M=M!==null?M.lastEffect:null,M!==null){var C=M=M.next;do{if((C.tag&l)===l){var N=C.destroy;C.destroy=void 0,N!==void 0&&o_(c,g,N)}C=C.next}while(C!==M)}}function Zg(l,c){if(c=c.updateQueue,c=c!==null?c.lastEffect:null,c!==null){var g=c=c.next;do{if((g.tag&l)===l){var M=g.create;g.destroy=M()}g=g.next}while(g!==c)}}function a_(l){var c=l.ref;if(c!==null){var g=l.stateNode;switch(l.tag){case 5:l=g;break;default:l=g}typeof c=="function"?c(l):c.current=l}}function pE(l){var c=l.alternate;c!==null&&(l.alternate=null,pE(c)),l.child=null,l.deletions=null,l.sibling=null,l.tag===5&&(c=l.stateNode,c!==null&&(delete c[pr],delete c[eu],delete c[$a],delete c[uf],delete c[cf])),l.stateNode=null,l.return=null,l.dependencies=null,l.memoizedProps=null,l.memoizedState=null,l.pendingProps=null,l.stateNode=null,l.updateQueue=null}function mE(l){return l.tag===5||l.tag===3||l.tag===4}function gE(l){e:for(;;){for(;l.sibling===null;){if(l.return===null||mE(l.return))return null;l=l.return}for(l.sibling.return=l.return,l=l.sibling;l.tag!==5&&l.tag!==6&&l.tag!==18;){if(l.flags&2||l.child===null||l.tag===4)continue e;l.child.return=l,l=l.child}if(!(l.flags&2))return l.stateNode}}function l_(l,c,g){var M=l.tag;if(M===5||M===6)l=l.stateNode,c?g.nodeType===8?g.parentNode.insertBefore(l,c):g.insertBefore(l,c):(g.nodeType===8?(c=g.parentNode,c.insertBefore(l,g)):(c=g,c.appendChild(l)),g=g._reactRootContainer,g!=null||c.onclick!==null||(c.onclick=uc));else if(M!==4&&(l=l.child,l!==null))for(l_(l,c,g),l=l.sibling;l!==null;)l_(l,c,g),l=l.sibling}function u_(l,c,g){var M=l.tag;if(M===5||M===6)l=l.stateNode,c?g.insertBefore(l,c):g.appendChild(l);else if(M!==4&&(l=l.child,l!==null))for(u_(l,c,g),l=l.sibling;l!==null;)u_(l,c,g),l=l.sibling}var mi=null,zo=!1;function lu(l,c,g){for(g=g.child;g!==null;)vE(l,c,g),g=g.sibling}function vE(l,c,g){if(wt&&typeof wt.onCommitFiberUnmount=="function")try{wt.onCommitFiberUnmount(Jn,g)}catch{}switch(g.tag){case 5:bi||Tf(g,c);case 6:var M=mi,C=zo;mi=null,lu(l,c,g),mi=M,zo=C,mi!==null&&(zo?(l=mi,g=g.stateNode,l.nodeType===8?l.parentNode.removeChild(g):l.removeChild(g)):mi.removeChild(g.stateNode));break;case 18:mi!==null&&(zo?(l=mi,g=g.stateNode,l.nodeType===8?lf(l.parentNode,g):l.nodeType===1&&lf(l,g),Ju(l)):lf(mi,g.stateNode));break;case 4:M=mi,C=zo,mi=g.stateNode.containerInfo,zo=!0,lu(l,c,g),mi=M,zo=C;break;case 0:case 11:case 14:case 15:if(!bi&&(M=g.updateQueue,M!==null&&(M=M.lastEffect,M!==null))){C=M=M.next;do{var N=C,G=N.destroy;N=N.tag,G!==void 0&&((N&2)!==0||(N&4)!==0)&&o_(g,c,G),C=C.next}while(C!==M)}lu(l,c,g);break;case 1:if(!bi&&(Tf(g,c),M=g.stateNode,typeof M.componentWillUnmount=="function"))try{M.props=g.memoizedProps,M.state=g.memoizedState,M.componentWillUnmount()}catch(ne){ar(g,c,ne)}lu(l,c,g);break;case 21:lu(l,c,g);break;case 22:g.mode&1?(bi=(M=bi)||g.memoizedState!==null,lu(l,c,g),bi=M):lu(l,c,g);break;default:lu(l,c,g)}}function yE(l){var c=l.updateQueue;if(c!==null){l.updateQueue=null;var g=l.stateNode;g===null&&(g=l.stateNode=new JL),c.forEach(function(M){var C=aN.bind(null,l,M);g.has(M)||(g.add(M),M.then(C,C))})}}function Uo(l,c){var g=c.deletions;if(g!==null)for(var M=0;MC&&(C=G),M&=~N}if(M=C,M=ot()-M,M=(120>M?120:480>M?480:1080>M?1080:1920>M?1920:3e3>M?3e3:4320>M?4320:1960*eN(M/1960))-M,10l?16:l,cu===null)var M=!1;else{if(l=cu,cu=null,ev=0,(cn&6)!==0)throw Error(t(331));var C=cn;for(cn|=4,ft=l.current;ft!==null;){var N=ft,G=N.child;if((ft.flags&16)!==0){var ne=N.deletions;if(ne!==null){for(var ce=0;ceot()-f_?Pc(l,0):d_|=g),ds(l,c)}function LE(l,c){c===0&&((l.mode&1)===0?c=1:(c=Kn,Kn<<=1,(Kn&130023424)===0&&(Kn=4194304)));var g=Wi();l=Ns(l,c),l!==null&&($u(l,c,g),ds(l,g))}function oN(l){var c=l.memoizedState,g=0;c!==null&&(g=c.retryLane),LE(l,g)}function aN(l,c){var g=0;switch(l.tag){case 13:var M=l.stateNode,C=l.memoizedState;C!==null&&(g=C.retryLane);break;case 19:M=l.stateNode;break;default:throw Error(t(314))}M!==null&&M.delete(c),LE(l,g)}var NE;NE=function(l,c,g){if(l!==null)if(l.memoizedProps!==c.pendingProps||di.current)Xt=!0;else{if((l.lanes&g)===0&&(c.flags&128)===0)return Xt=!1,qL(l,c,g);Xt=(l.flags&131072)!==0}else Xt=!1,Pn&&(c.flags&1048576)!==0&&yp(c,pf,c.index);switch(c.lanes=0,c.tag){case 2:var M=c.type;$g(l,c),l=c.pendingProps;var C=qa(c,Vr.current);ha(c,g),C=Sc(null,c,M,l,C,g);var N=Tp();return c.flags|=1,typeof C=="object"&&C!==null&&typeof C.render=="function"&&C.$$typeof===void 0?(c.tag=1,c.memoizedState=null,c.updateQueue=null,Jr(M)?(N=!0,Za(c)):N=!1,c.memoizedState=C.state!==null&&C.state!==void 0?C.state:null,Wt(c),C.updater=bf,c.stateNode=C,C._reactInternals=c,E(c,M,l,g),c=Gt(null,c,M,!0,N,g)):(c.tag=0,Pn&&N&&_p(c),it(null,c,C,g),c=c.child),c;case 16:M=c.elementType;e:{switch($g(l,c),l=c.pendingProps,C=M._init,M=C(M._payload),c.type=M,C=c.tag=uN(M),l=us(M,l),C){case 0:c=tt(null,c,M,l,g);break e;case 1:c=yt(null,c,M,l,g);break e;case 11:c=Wr(null,c,M,l,g);break e;case 14:c=ji(null,c,M,us(M.type,l),g);break e}throw Error(t(306,M,""))}return c;case 0:return M=c.type,C=c.pendingProps,C=c.elementType===M?C:us(M,C),tt(l,c,M,C,g);case 1:return M=c.type,C=c.pendingProps,C=c.elementType===M?C:us(M,C),yt(l,c,M,C,g);case 3:e:{if(Vt(c),l===null)throw Error(t(387));M=c.pendingProps,N=c.memoizedState,C=N.element,er(l,c),Xn(c,M,null,g);var G=c.memoizedState;if(M=G.element,N.isDehydrated)if(N={element:M,isDehydrated:!1,cache:G.cache,pendingSuspenseBoundaries:G.pendingSuspenseBoundaries,transitions:G.transitions},c.updateQueue.baseState=N,c.memoizedState=N,c.flags&256){C=b(Error(t(423)),c),c=sn(l,c,M,g,C);break e}else if(M!==C){C=b(Error(t(424)),c),c=sn(l,c,M,g,C);break e}else for(hi=Mo(c.stateNode.containerInfo.firstChild),Hr=c,Pn=!0,ls=null,g=gc(c,null,M,g),c.child=g;g;)g.flags=g.flags&-3|4096,g=g.sibling;else{if(fa(),M===C){c=ll(l,c,g);break e}it(l,c,M,g)}c=c.child}return c;case 5:return il(c),l===null&&gf(c),M=c.type,C=c.pendingProps,N=l!==null?l.memoizedProps:null,G=C.children,dp(M,C)?G=null:N!==null&&dp(M,N)&&(c.flags|=32),Ce(l,c),it(l,c,G,g),c.child;case 6:return l===null&&gf(c),null;case 13:return Oo(l,c,g);case 4:return xc(c,c.stateNode.containerInfo),M=c.pendingProps,l===null?c.child=Ka(c,null,M,g):it(l,c,M,g),c.child;case 11:return M=c.type,C=c.pendingProps,C=c.elementType===M?C:us(M,C),Wr(l,c,M,C,g);case 7:return it(l,c,c.pendingProps,g),c.child;case 8:return it(l,c,c.pendingProps.children,g),c.child;case 12:return it(l,c,c.pendingProps.children,g),c.child;case 10:e:{if(M=c.type._context,C=c.pendingProps,N=c.memoizedProps,G=C.value,xn(Qa,M._currentValue),M._currentValue=G,N!==null)if(zi(N.value,G)){if(N.children===C.children&&!di.current){c=ll(l,c,g);break e}}else for(N=c.child,N!==null&&(N.return=c);N!==null;){var ne=N.dependencies;if(ne!==null){G=N.child;for(var ce=ne.firstContext;ce!==null;){if(ce.context===M){if(N.tag===1){ce=_n(-1,g&-g),ce.tag=2;var Me=N.updateQueue;if(Me!==null){Me=Me.shared;var Ve=Me.pending;Ve===null?ce.next=ce:(ce.next=Ve.next,Ve.next=ce),Me.pending=ce}}N.lanes|=g,ce=N.alternate,ce!==null&&(ce.lanes|=g),yc(N.return,g,c),ne.lanes|=g;break}ce=ce.next}}else if(N.tag===10)G=N.type===c.type?null:N.child;else if(N.tag===18){if(G=N.return,G===null)throw Error(t(341));G.lanes|=g,ne=G.alternate,ne!==null&&(ne.lanes|=g),yc(G,g,c),G=N.sibling}else G=N.child;if(G!==null)G.return=N;else for(G=N;G!==null;){if(G===c){G=null;break}if(N=G.sibling,N!==null){N.return=G.return,G=N;break}G=G.return}N=G}it(l,c,C.children,g),c=c.child}return c;case 9:return C=c.type,M=c.pendingProps.children,ha(c,g),C=Bi(C),M=M(C),c.flags|=1,it(l,c,M,g),c.child;case 14:return M=c.type,C=us(M,c.pendingProps),C=us(M.type,C),ji(l,c,M,C,g);case 15:return we(l,c,c.type,c.pendingProps,g);case 17:return M=c.type,C=c.pendingProps,C=c.elementType===M?C:us(M,C),$g(l,c),c.tag=1,Jr(M)?(l=!0,Za(c)):l=!1,ha(c,g),f(c,M,C),E(c,M,C,g),Gt(null,c,M,!0,l,g);case 19:return uE(l,c,g);case 22:return me(l,c,g)}throw Error(t(156,c.tag))};function IE(l,c){return Ee(l,c)}function lN(l,c,g,M){this.tag=l,this.key=g,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=c,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=M,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function so(l,c,g,M){return new lN(l,c,g,M)}function x_(l){return l=l.prototype,!(!l||!l.isReactComponent)}function uN(l){if(typeof l=="function")return x_(l)?1:0;if(l!=null){if(l=l.$$typeof,l===W)return 11;if(l===ie)return 14}return 2}function hu(l,c){var g=l.alternate;return g===null?(g=so(l.tag,c,l.key,l.mode),g.elementType=l.elementType,g.type=l.type,g.stateNode=l.stateNode,g.alternate=l,l.alternate=g):(g.pendingProps=c,g.type=l.type,g.flags=0,g.subtreeFlags=0,g.deletions=null),g.flags=l.flags&14680064,g.childLanes=l.childLanes,g.lanes=l.lanes,g.child=l.child,g.memoizedProps=l.memoizedProps,g.memoizedState=l.memoizedState,g.updateQueue=l.updateQueue,c=l.dependencies,g.dependencies=c===null?null:{lanes:c.lanes,firstContext:c.firstContext},g.sibling=l.sibling,g.index=l.index,g.ref=l.ref,g}function iv(l,c,g,M,C,N){var G=2;if(M=l,typeof l=="function")x_(l)&&(G=1);else if(typeof l=="string")G=5;else e:switch(l){case O:return Nc(g.children,C,N,c);case F:G=8,C|=8;break;case k:return l=so(12,g,c,C|2),l.elementType=k,l.lanes=N,l;case Q:return l=so(13,g,c,C),l.elementType=Q,l.lanes=N,l;case $:return l=so(19,g,c,C),l.elementType=$,l.lanes=N,l;case le:return sv(g,C,N,c);default:if(typeof l=="object"&&l!==null)switch(l.$$typeof){case B:G=10;break e;case V:G=9;break e;case W:G=11;break e;case ie:G=14;break e;case ae:G=16,M=null;break e}throw Error(t(130,l==null?l:typeof l,""))}return c=so(G,g,c,C),c.elementType=l,c.type=M,c.lanes=N,c}function Nc(l,c,g,M){return l=so(7,l,M,c),l.lanes=g,l}function sv(l,c,g,M){return l=so(22,l,M,c),l.elementType=le,l.lanes=g,l.stateNode={isHidden:!1},l}function w_(l,c,g){return l=so(6,l,null,c),l.lanes=g,l}function S_(l,c,g){return c=so(4,l.children!==null?l.children:[],l.key,c),c.lanes=g,c.stateNode={containerInfo:l.containerInfo,pendingChildren:null,implementation:l.implementation},c}function cN(l,c,g,M,C){this.tag=c,this.containerInfo=l,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Ol(0),this.expirationTimes=Ol(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Ol(0),this.identifierPrefix=M,this.onRecoverableError=C,this.mutableSourceEagerHydrationData=null}function E_(l,c,g,M,C,N,G,ne,ce){return l=new cN(l,c,g,ne,ce),c===1?(c=1,N===!0&&(c|=8)):c=0,N=so(3,null,null,c),l.current=N,N.stateNode=l,N.memoizedState={element:M,isDehydrated:g,cache:null,transitions:null,pendingSuspenseBoundaries:null},Wt(N),l}function dN(l,c,g){var M=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}return n(),R_.exports=SN(),R_.exports}var $E;function MN(){if($E)return fv;$E=1;var n=EN();return fv.createRoot=n.createRoot,fv.hydrateRoot=n.hydrateRoot,fv}var bN=MN();var qE="popstate";function TN(n={}){function e(r,i){let{pathname:s,search:o,hash:a}=r.location;return Jx("",{pathname:s,search:o,hash:a},i.state&&i.state.usr||null,i.state&&i.state.key||"default")}function t(r,i){return typeof i=="string"?i:wm(i)}return CN(e,t,null,n)}function Zn(n,e){if(n===!1||n===null||typeof n>"u")throw new Error(e)}function fo(n,e){if(!n){typeof console<"u"&&console.warn(e);try{throw new Error(e)}catch{}}}function AN(){return Math.random().toString(36).substring(2,10)}function ZE(n,e){return{usr:n.state,key:n.key,idx:e}}function Jx(n,e,t=null,r){return{pathname:typeof n=="string"?n:n.pathname,search:"",hash:"",...typeof e=="string"?Ih(e):e,state:t,key:e&&e.key||r||AN()}}function wm({pathname:n="/",search:e="",hash:t=""}){return e&&e!=="?"&&(n+=e.charAt(0)==="?"?e:"?"+e),t&&t!=="#"&&(n+=t.charAt(0)==="#"?t:"#"+t),n}function Ih(n){let e={};if(n){let t=n.indexOf("#");t>=0&&(e.hash=n.substring(t),n=n.substring(0,t));let r=n.indexOf("?");r>=0&&(e.search=n.substring(r),n=n.substring(0,r)),n&&(e.pathname=n)}return e}function CN(n,e,t,r={}){let{window:i=document.defaultView,v5Compat:s=!1}=r,o=i.history,a="POP",u=null,d=h();d==null&&(d=0,o.replaceState({...o.state,idx:d},""));function h(){return(o.state||{idx:null}).idx}function m(){a="POP";let x=h(),w=x==null?null:x-d;d=x,u&&u({action:a,location:S.location,delta:w})}function v(x,w){a="PUSH";let A=Jx(S.location,x,w);d=h()+1;let T=ZE(A,d),L=S.createHref(A);try{o.pushState(T,"",L)}catch(D){if(D instanceof DOMException&&D.name==="DataCloneError")throw D;i.location.assign(L)}s&&u&&u({action:a,location:S.location,delta:1})}function y(x,w){a="REPLACE";let A=Jx(S.location,x,w);d=h();let T=ZE(A,d),L=S.createHref(A);o.replaceState(T,"",L),s&&u&&u({action:a,location:S.location,delta:0})}function _(x){return RN(x)}let S={get action(){return a},get location(){return n(i,o)},listen(x){if(u)throw new Error("A history only accepts one active listener");return i.addEventListener(qE,m),u=x,()=>{i.removeEventListener(qE,m),u=null}},createHref(x){return e(i,x)},createURL:_,encodeLocation(x){let w=_(x);return{pathname:w.pathname,search:w.search,hash:w.hash}},push:v,replace:y,go(x){return o.go(x)}};return S}function RN(n,e=!1){let t="http://localhost";typeof window<"u"&&(t=window.location.origin!=="null"?window.location.origin:window.location.href),Zn(t,"No window.location.(origin|href) available to create URL");let r=typeof n=="string"?n:wm(n);return r=r.replace(/ $/,"%20"),!e&&r.startsWith("//")&&(r=t+r),new URL(r,t)}function PA(n,e,t="/"){return PN(n,e,t,!1)}function PN(n,e,t,r){let i=typeof e=="string"?Ih(e):e,s=Tl(i.pathname||"/",t);if(s==null)return null;let o=LA(n);LN(o);let a=null;for(let u=0;a==null&&u{let h={relativePath:d===void 0?o.path||"":d,caseSensitive:o.caseSensitive===!0,childrenIndex:a,route:o};if(h.relativePath.startsWith("/")){if(!h.relativePath.startsWith(r)&&u)return;Zn(h.relativePath.startsWith(r),`Absolute route path "${h.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),h.relativePath=h.relativePath.slice(r.length)}let m=Ml([r,h.relativePath]),v=t.concat(h);o.children&&o.children.length>0&&(Zn(o.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${m}".`),LA(o.children,e,v,m,u)),!(o.path==null&&!o.index)&&e.push({path:m,score:UN(m,o.index),routesMeta:v})};return n.forEach((o,a)=>{if(o.path===""||!o.path?.includes("?"))s(o,a);else for(let u of NA(o.path))s(o,a,!0,u)}),e}function NA(n){let e=n.split("/");if(e.length===0)return[];let[t,...r]=e,i=t.endsWith("?"),s=t.replace(/\?$/,"");if(r.length===0)return i?[s,""]:[s];let o=NA(r.join("/")),a=[];return a.push(...o.map(u=>u===""?s:[s,u].join("/"))),i&&a.push(...o),a.map(u=>n.startsWith("/")&&u===""?"/":u)}function LN(n){n.sort((e,t)=>e.score!==t.score?t.score-e.score:FN(e.routesMeta.map(r=>r.childrenIndex),t.routesMeta.map(r=>r.childrenIndex)))}var NN=/^:[\w-]+$/,IN=3,kN=2,DN=1,ON=10,zN=-2,YE=n=>n==="*";function UN(n,e){let t=n.split("/"),r=t.length;return t.some(YE)&&(r+=zN),e&&(r+=kN),t.filter(i=>!YE(i)).reduce((i,s)=>i+(NN.test(s)?IN:s===""?DN:ON),r)}function FN(n,e){return n.length===e.length&&n.slice(0,-1).every((r,i)=>r===e[i])?n[n.length-1]-e[e.length-1]:0}function BN(n,e,t=!1){let{routesMeta:r}=n,i={},s="/",o=[];for(let a=0;a{if(h==="*"){let _=a[v]||"";o=s.slice(0,s.length-_.length).replace(/(.)\/+$/,"$1")}const y=a[v];return m&&!y?d[h]=void 0:d[h]=(y||"").replace(/%2F/g,"/"),d},{}),pathname:s,pathnameBase:o,pattern:n}}function VN(n,e=!1,t=!0){fo(n==="*"||!n.endsWith("*")||n.endsWith("/*"),`Route path "${n}" will be treated as if it were "${n.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${n.replace(/\*$/,"/*")}".`);let r=[],i="^"+n.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(o,a,u)=>(r.push({paramName:a,isOptional:u!=null}),u?"/?([^\\/]+)?":"/([^\\/]+)")).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return n.endsWith("*")?(r.push({paramName:"*"}),i+=n==="*"||n==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):t?i+="\\/*$":n!==""&&n!=="/"&&(i+="(?:(?=\\/|$))"),[new RegExp(i,e?void 0:"i"),r]}function HN(n){try{return n.split("/").map(e=>decodeURIComponent(e).replace(/\//g,"%2F")).join("/")}catch(e){return fo(!1,`The URL path "${n}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${e}).`),n}}function Tl(n,e){if(e==="/")return n;if(!n.toLowerCase().startsWith(e.toLowerCase()))return null;let t=e.endsWith("/")?e.length-1:e.length,r=n.charAt(t);return r&&r!=="/"?null:n.slice(t)||"/"}var GN=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,jN=n=>GN.test(n);function WN(n,e="/"){let{pathname:t,search:r="",hash:i=""}=typeof n=="string"?Ih(n):n,s;if(t)if(jN(t))s=t;else{if(t.includes("//")){let o=t;t=t.replace(/\/\/+/g,"/"),fo(!1,`Pathnames cannot have embedded double slashes - normalizing ${o} -> ${t}`)}t.startsWith("/")?s=JE(t.substring(1),"/"):s=JE(t,e)}else s=e;return{pathname:s,search:qN(r),hash:ZN(i)}}function JE(n,e){let t=e.replace(/\/+$/,"").split("/");return n.split("/").forEach(i=>{i===".."?t.length>1&&t.pop():i!=="."&&t.push(i)}),t.length>1?t.join("/"):"/"}function N_(n,e,t,r){return`Cannot include a '${n}' character in a manually specified \`to.${e}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${t}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function XN(n){return n.filter((e,t)=>t===0||e.route.path&&e.route.path.length>0)}function _S(n){let e=XN(n);return e.map((t,r)=>r===e.length-1?t.pathname:t.pathnameBase)}function xS(n,e,t,r=!1){let i;typeof n=="string"?i=Ih(n):(i={...n},Zn(!i.pathname||!i.pathname.includes("?"),N_("?","pathname","search",i)),Zn(!i.pathname||!i.pathname.includes("#"),N_("#","pathname","hash",i)),Zn(!i.search||!i.search.includes("#"),N_("#","search","hash",i)));let s=n===""||i.pathname==="",o=s?"/":i.pathname,a;if(o==null)a=t;else{let m=e.length-1;if(!r&&o.startsWith("..")){let v=o.split("/");for(;v[0]==="..";)v.shift(),m-=1;i.pathname=v.join("/")}a=m>=0?e[m]:"/"}let u=WN(i,a),d=o&&o!=="/"&&o.endsWith("/"),h=(s||o===".")&&t.endsWith("/");return!u.pathname.endsWith("/")&&(d||h)&&(u.pathname+="/"),u}var Ml=n=>n.join("/").replace(/\/\/+/g,"/"),$N=n=>n.replace(/\/+$/,"").replace(/^\/*/,"/"),qN=n=>!n||n==="?"?"":n.startsWith("?")?n:"?"+n,ZN=n=>!n||n==="#"?"":n.startsWith("#")?n:"#"+n;function YN(n){return n!=null&&typeof n.status=="number"&&typeof n.statusText=="string"&&typeof n.internal=="boolean"&&"data"in n}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var IA=["POST","PUT","PATCH","DELETE"];new Set(IA);var JN=["GET",...IA];new Set(JN);var kh=Z.createContext(null);kh.displayName="DataRouter";var sy=Z.createContext(null);sy.displayName="DataRouterState";Z.createContext(!1);var kA=Z.createContext({isTransitioning:!1});kA.displayName="ViewTransition";var KN=Z.createContext(new Map);KN.displayName="Fetchers";var QN=Z.createContext(null);QN.displayName="Await";var Jo=Z.createContext(null);Jo.displayName="Navigation";var Km=Z.createContext(null);Km.displayName="Location";var Ko=Z.createContext({outlet:null,matches:[],isDataRoute:!1});Ko.displayName="Route";var wS=Z.createContext(null);wS.displayName="RouteError";function e3(n,{relative:e}={}){Zn(Dh(),"useHref() may be used only in the context of a component.");let{basename:t,navigator:r}=Z.useContext(Jo),{hash:i,pathname:s,search:o}=Qm(n,{relative:e}),a=s;return t!=="/"&&(a=s==="/"?t:Ml([t,s])),r.createHref({pathname:a,search:o,hash:i})}function Dh(){return Z.useContext(Km)!=null}function Nl(){return Zn(Dh(),"useLocation() may be used only in the context of a component."),Z.useContext(Km).location}var DA="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function OA(n){Z.useContext(Jo).static||Z.useLayoutEffect(n)}function Oh(){let{isDataRoute:n}=Z.useContext(Ko);return n?m3():t3()}function t3(){Zn(Dh(),"useNavigate() may be used only in the context of a component.");let n=Z.useContext(kh),{basename:e,navigator:t}=Z.useContext(Jo),{matches:r}=Z.useContext(Ko),{pathname:i}=Nl(),s=JSON.stringify(_S(r)),o=Z.useRef(!1);return OA(()=>{o.current=!0}),Z.useCallback((u,d={})=>{if(fo(o.current,DA),!o.current)return;if(typeof u=="number"){t.go(u);return}let h=xS(u,JSON.parse(s),i,d.relative==="path");n==null&&e!=="/"&&(h.pathname=h.pathname==="/"?e:Ml([e,h.pathname])),(d.replace?t.replace:t.push)(h,d.state,d)},[e,t,s,i,n])}var n3=Z.createContext(null);function r3(n){let e=Z.useContext(Ko).outlet;return Z.useMemo(()=>e&&Z.createElement(n3.Provider,{value:n},e),[e,n])}function Qm(n,{relative:e}={}){let{matches:t}=Z.useContext(Ko),{pathname:r}=Nl(),i=JSON.stringify(_S(t));return Z.useMemo(()=>xS(n,JSON.parse(i),r,e==="path"),[n,i,r,e])}function i3(n,e){return zA(n,e)}function zA(n,e,t,r,i){Zn(Dh(),"useRoutes() may be used only in the context of a component.");let{navigator:s}=Z.useContext(Jo),{matches:o}=Z.useContext(Ko),a=o[o.length-1],u=a?a.params:{},d=a?a.pathname:"/",h=a?a.pathnameBase:"/",m=a&&a.route;{let A=m&&m.path||"";UA(d,!m||A.endsWith("*")||A.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${d}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. + +Please change the parent to .`)}let v=Nl(),y;if(e){let A=typeof e=="string"?Ih(e):e;Zn(h==="/"||A.pathname?.startsWith(h),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${h}" but pathname "${A.pathname}" was given in the \`location\` prop.`),y=A}else y=v;let _=y.pathname||"/",S=_;if(h!=="/"){let A=h.replace(/^\//,"").split("/");S="/"+_.replace(/^\//,"").split("/").slice(A.length).join("/")}let x=PA(n,{pathname:S});fo(m||x!=null,`No routes matched location "${y.pathname}${y.search}${y.hash}" `),fo(x==null||x[x.length-1].route.element!==void 0||x[x.length-1].route.Component!==void 0||x[x.length-1].route.lazy!==void 0,`Matched leaf route at location "${y.pathname}${y.search}${y.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let w=u3(x&&x.map(A=>Object.assign({},A,{params:Object.assign({},u,A.params),pathname:Ml([h,s.encodeLocation?s.encodeLocation(A.pathname.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:A.pathname]),pathnameBase:A.pathnameBase==="/"?h:Ml([h,s.encodeLocation?s.encodeLocation(A.pathnameBase.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:A.pathnameBase])})),o,t,r,i);return e&&w?Z.createElement(Km.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",...y},navigationType:"POP"}},w):w}function s3(){let n=p3(),e=YN(n)?`${n.status} ${n.statusText}`:n instanceof Error?n.message:JSON.stringify(n),t=n instanceof Error?n.stack:null,r="rgba(200,200,200, 0.5)",i={padding:"0.5rem",backgroundColor:r},s={padding:"2px 4px",backgroundColor:r},o=null;return console.error("Error handled by React Router default ErrorBoundary:",n),o=Z.createElement(Z.Fragment,null,Z.createElement("p",null,"💿 Hey developer 👋"),Z.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",Z.createElement("code",{style:s},"ErrorBoundary")," or"," ",Z.createElement("code",{style:s},"errorElement")," prop on your route.")),Z.createElement(Z.Fragment,null,Z.createElement("h2",null,"Unexpected Application Error!"),Z.createElement("h3",{style:{fontStyle:"italic"}},e),t?Z.createElement("pre",{style:i},t):null,o)}var o3=Z.createElement(s3,null),a3=class extends Z.Component{constructor(n){super(n),this.state={location:n.location,revalidation:n.revalidation,error:n.error}}static getDerivedStateFromError(n){return{error:n}}static getDerivedStateFromProps(n,e){return e.location!==n.location||e.revalidation!=="idle"&&n.revalidation==="idle"?{error:n.error,location:n.location,revalidation:n.revalidation}:{error:n.error!==void 0?n.error:e.error,location:e.location,revalidation:n.revalidation||e.revalidation}}componentDidCatch(n,e){this.props.onError?this.props.onError(n,e):console.error("React Router caught the following error during render",n)}render(){return this.state.error!==void 0?Z.createElement(Ko.Provider,{value:this.props.routeContext},Z.createElement(wS.Provider,{value:this.state.error,children:this.props.component})):this.props.children}};function l3({routeContext:n,match:e,children:t}){let r=Z.useContext(kh);return r&&r.static&&r.staticContext&&(e.route.errorElement||e.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=e.route.id),Z.createElement(Ko.Provider,{value:n},t)}function u3(n,e=[],t=null,r=null,i=null){if(n==null){if(!t)return null;if(t.errors)n=t.matches;else if(e.length===0&&!t.initialized&&t.matches.length>0)n=t.matches;else return null}let s=n,o=t?.errors;if(o!=null){let h=s.findIndex(m=>m.route.id&&o?.[m.route.id]!==void 0);Zn(h>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(o).join(",")}`),s=s.slice(0,Math.min(s.length,h+1))}let a=!1,u=-1;if(t)for(let h=0;h=0?s=s.slice(0,u+1):s=[s[0]];break}}}let d=t&&r?(h,m)=>{r(h,{location:t.location,params:t.matches?.[0]?.params??{},errorInfo:m})}:void 0;return s.reduceRight((h,m,v)=>{let y,_=!1,S=null,x=null;t&&(y=o&&m.route.id?o[m.route.id]:void 0,S=m.route.errorElement||o3,a&&(u<0&&v===0?(UA("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),_=!0,x=null):u===v&&(_=!0,x=m.route.hydrateFallbackElement||null)));let w=e.concat(s.slice(0,v+1)),A=()=>{let T;return y?T=S:_?T=x:m.route.Component?T=Z.createElement(m.route.Component,null):m.route.element?T=m.route.element:T=h,Z.createElement(l3,{match:m,routeContext:{outlet:h,matches:w,isDataRoute:t!=null},children:T})};return t&&(m.route.ErrorBoundary||m.route.errorElement||v===0)?Z.createElement(a3,{location:t.location,revalidation:t.revalidation,component:S,error:y,children:A(),routeContext:{outlet:null,matches:w,isDataRoute:!0},onError:d}):A()},null)}function SS(n){return`${n} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function c3(n){let e=Z.useContext(kh);return Zn(e,SS(n)),e}function d3(n){let e=Z.useContext(sy);return Zn(e,SS(n)),e}function f3(n){let e=Z.useContext(Ko);return Zn(e,SS(n)),e}function ES(n){let e=f3(n),t=e.matches[e.matches.length-1];return Zn(t.route.id,`${n} can only be used on routes that contain a unique "id"`),t.route.id}function h3(){return ES("useRouteId")}function p3(){let n=Z.useContext(wS),e=d3("useRouteError"),t=ES("useRouteError");return n!==void 0?n:e.errors?.[t]}function m3(){let{router:n}=c3("useNavigate"),e=ES("useNavigate"),t=Z.useRef(!1);return OA(()=>{t.current=!0}),Z.useCallback(async(i,s={})=>{fo(t.current,DA),t.current&&(typeof i=="number"?n.navigate(i):await n.navigate(i,{fromRouteId:e,...s}))},[n,e])}var KE={};function UA(n,e,t){!e&&!KE[n]&&(KE[n]=!0,fo(!1,t))}Z.memo(g3);function g3({routes:n,future:e,state:t,unstable_onError:r}){return zA(n,void 0,t,r,e)}function v3({to:n,replace:e,state:t,relative:r}){Zn(Dh()," may be used only in the context of a component.");let{static:i}=Z.useContext(Jo);fo(!i," must not be used on the initial render in a . This is a no-op, but you should modify your code so the is only ever rendered in response to some user interaction or state change.");let{matches:s}=Z.useContext(Ko),{pathname:o}=Nl(),a=Oh(),u=xS(n,_S(s),o,r==="path"),d=JSON.stringify(u);return Z.useEffect(()=>{a(JSON.parse(d),{replace:e,state:t,relative:r})},[a,d,r,e,t]),null}function y3(n){return r3(n.context)}function ya(n){Zn(!1,"A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .")}function _3({basename:n="/",children:e=null,location:t,navigationType:r="POP",navigator:i,static:s=!1}){Zn(!Dh(),"You cannot render a inside another . You should never have more than one in your app.");let o=n.replace(/^\/*/,"/"),a=Z.useMemo(()=>({basename:o,navigator:i,static:s,future:{}}),[o,i,s]);typeof t=="string"&&(t=Ih(t));let{pathname:u="/",search:d="",hash:h="",state:m=null,key:v="default"}=t,y=Z.useMemo(()=>{let _=Tl(u,o);return _==null?null:{location:{pathname:_,search:d,hash:h,state:m,key:v},navigationType:r}},[o,u,d,h,m,v,r]);return fo(y!=null,` is not able to match the URL "${u}${d}${h}" because it does not start with the basename, so the won't render anything.`),y==null?null:Z.createElement(Jo.Provider,{value:a},Z.createElement(Km.Provider,{children:e,value:y}))}function x3({children:n,location:e}){return i3(Kx(n),e)}function Kx(n,e=[]){let t=[];return Z.Children.forEach(n,(r,i)=>{if(!Z.isValidElement(r))return;let s=[...e,i];if(r.type===Z.Fragment){t.push.apply(t,Kx(r.props.children,s));return}Zn(r.type===ya,`[${typeof r.type=="string"?r.type:r.type.name}] is not a component. All component children of must be a or `),Zn(!r.props.index||!r.props.children,"An index route cannot have child routes.");let o={id:r.props.id||s.join("-"),caseSensitive:r.props.caseSensitive,element:r.props.element,Component:r.props.Component,index:r.props.index,path:r.props.path,middleware:r.props.middleware,loader:r.props.loader,action:r.props.action,hydrateFallbackElement:r.props.hydrateFallbackElement,HydrateFallback:r.props.HydrateFallback,errorElement:r.props.errorElement,ErrorBoundary:r.props.ErrorBoundary,hasErrorBoundary:r.props.hasErrorBoundary===!0||r.props.ErrorBoundary!=null||r.props.errorElement!=null,shouldRevalidate:r.props.shouldRevalidate,handle:r.props.handle,lazy:r.props.lazy};r.props.children&&(o.children=Kx(r.props.children,s)),t.push(o)}),t}var g0="get",v0="application/x-www-form-urlencoded";function oy(n){return n!=null&&typeof n.tagName=="string"}function w3(n){return oy(n)&&n.tagName.toLowerCase()==="button"}function S3(n){return oy(n)&&n.tagName.toLowerCase()==="form"}function E3(n){return oy(n)&&n.tagName.toLowerCase()==="input"}function M3(n){return!!(n.metaKey||n.altKey||n.ctrlKey||n.shiftKey)}function b3(n,e){return n.button===0&&(!e||e==="_self")&&!M3(n)}var hv=null;function T3(){if(hv===null)try{new FormData(document.createElement("form"),0),hv=!1}catch{hv=!0}return hv}var A3=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function I_(n){return n!=null&&!A3.has(n)?(fo(!1,`"${n}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${v0}"`),null):n}function C3(n,e){let t,r,i,s,o;if(S3(n)){let a=n.getAttribute("action");r=a?Tl(a,e):null,t=n.getAttribute("method")||g0,i=I_(n.getAttribute("enctype"))||v0,s=new FormData(n)}else if(w3(n)||E3(n)&&(n.type==="submit"||n.type==="image")){let a=n.form;if(a==null)throw new Error('Cannot submit a @@ -158,7 +158,7 @@ const AdminAbout = () => { onChange={e => setNewTech({ ...newTech, image: e.target.files[0] })} />
-
@@ -166,7 +166,7 @@ const AdminAbout = () => {
{technologies.map(tech => ( -
+
{tech.image && ( {tech.title} )} diff --git a/frontend/src/features/admin/components/AdminCalendar.jsx b/frontend/src/features/admin/components/AdminCalendar.jsx index c0084b8..7073d16 100644 --- a/frontend/src/features/admin/components/AdminCalendar.jsx +++ b/frontend/src/features/admin/components/AdminCalendar.jsx @@ -55,7 +55,7 @@ const AdminCalendar = () => {
- {calendarData.id && ( @@ -70,7 +70,7 @@ const AdminCalendar = () => {

Existing Events

{events.map(event => ( -
+
{event.icon}
diff --git a/frontend/src/features/admin/components/AdminSettings.jsx b/frontend/src/features/admin/components/AdminSettings.jsx index a6041eb..54b4e4a 100644 --- a/frontend/src/features/admin/components/AdminSettings.jsx +++ b/frontend/src/features/admin/components/AdminSettings.jsx @@ -53,7 +53,7 @@ const AdminSettings = () => { />
- From f1e6f2bcc1c77195bd95a138a8b583b76a161e2b Mon Sep 17 00:00:00 2001 From: Mohammed Sanabani Date: Tue, 16 Dec 2025 23:12:51 +0300 Subject: [PATCH 26/32] style: form validation rules and style , form submission indication , responce toasts --- .../features/admin/components/AdminAbout.jsx | 574 ++++++++++++------ .../admin/components/AdminCalendar.jsx | 339 ++++++++--- .../admin/components/AdminProjects.jsx | 91 +-- .../admin/components/AdminSettings.jsx | 173 ++++-- .../features/admin/components/ResumeForm.jsx | 18 +- frontend/src/features/admin/schemas.js | 118 +++- .../resume/components/ResumeHeader.jsx | 2 +- 7 files changed, 948 insertions(+), 367 deletions(-) diff --git a/frontend/src/features/admin/components/AdminAbout.jsx b/frontend/src/features/admin/components/AdminAbout.jsx index f8786b2..e089136 100644 --- a/frontend/src/features/admin/components/AdminAbout.jsx +++ b/frontend/src/features/admin/components/AdminAbout.jsx @@ -1,188 +1,406 @@ import { useState, useEffect } from 'react'; import { User, Trash2 } from 'lucide-react'; import { useAbout } from '../hooks/useAbout'; +import { aboutSchema } from '../schemas'; + const AdminAbout = () => { - const { - aboutData, - technologies, - fetchAboutData, - updateAbout, - addTechnology, - deleteTechnology, - notify - } = useAbout(); - - // Local state for forms - const [localAbout, setLocalAbout] = useState({ name: '', occupation: '', title: '', description: '', social_links: '[]', avatar_image: null }); - const [avatarFile, setAvatarFile] = useState(null); - const [newTech, setNewTech] = useState({ title: '', image: null }); - - useEffect(() => { - fetchAboutData(); - }, [fetchAboutData]); - - useEffect(() => { - if (aboutData) setLocalAbout({ ...aboutData, avatar_image: null }); - }, [aboutData]); - - const handleSaveAbout = async (e) => { - e.preventDefault(); - const formData = new FormData(); - formData.append('name', localAbout.name); - formData.append('occupation', localAbout.occupation); - formData.append('title', localAbout.title); - formData.append('description', localAbout.description); - formData.append('social_links', localAbout.social_links); - if (avatarFile) formData.append('avatar', avatarFile); - - await updateAbout(formData); - }; - - const handleAddTechnology = async (e) => { - e.preventDefault(); - if (!newTech.title || !newTech.image) { - notify('Please provide both title and image.', 'warning'); - return; - } - const formData = new FormData(); - formData.append('title', newTech.title); - formData.append('image', newTech.image); - - const success = await addTechnology(formData); - if (success) { - setNewTech({ title: '', image: null }); - const fileInput = document.getElementById('tech-image-input'); - if (fileInput) fileInput.value = ""; - } - }; - - const inputClass = "w-full bg-surface border border-accent rounded-xl p-3 text-muted focus:outline-none focus:ring-2 focus:ring-accent transition-all backdrop-blur-sm"; - const labelClass = "block text-sm font-medium mb-2 text-accent"; - - return ( -
-
-

- Edit About Section -

-
-
- - setLocalAbout({ ...localAbout, name: e.target.value })} - /> -
-
- - setLocalAbout({ ...localAbout, occupation: e.target.value })} - /> -
-
- - setLocalAbout({ ...localAbout, title: e.target.value })} - /> -
-
- -