From 93f6ea2f07c686b7aed73f527f3618cfa47b9fb9 Mon Sep 17 00:00:00 2001 From: mobiniqow Date: Tue, 15 Sep 2026 23:24:34 +0330 Subject: [PATCH 1/8] Initial commit: dating app web frontend (Next.js) Phone+OTP auth, staged onboarding, admin-approval-gated home screen, and the full discovery/match/chat UI (swipe deck with drag gestures, match modal, profile detail, filters, messages/chat) wired to the real backend, styled after a Figma dating-app UI kit. Co-Authored-By: Claude Sonnet 5 --- .env.local.example | 2 + .gitignore | 45 + README.md | 103 + eslint.config.mjs | 18 + next.config.ts | 7 + package-lock.json | 6858 +++++++++++++++++ package.json | 31 + postcss.config.mjs | 7 + public/apple-touch-icon.png | Bin 0 -> 5157 bytes public/favicon.png | Bin 0 -> 911 bytes public/icons/icon-192.png | Bin 0 -> 5584 bytes public/icons/icon-512.png | Bin 0 -> 20363 bytes public/icons/maskable-512.png | Bin 0 -> 20110 bytes public/manifest.webmanifest | 33 + public/sw.js | 38 + src/app/(main)/home/[id]/page.tsx | 317 + src/app/(main)/home/likes/page.tsx | 80 + src/app/(main)/home/page.tsx | 221 + src/app/(main)/layout.tsx | 35 + src/app/(main)/messages/[id]/page.tsx | 167 + src/app/(main)/messages/page.tsx | 125 + src/app/(main)/profile/page.tsx | 276 + src/app/(main)/settings/page.tsx | 75 + src/app/favicon.ico | Bin 0 -> 911 bytes src/app/globals.css | 233 + src/app/layout.tsx | 48 + src/app/login/page.tsx | 100 + src/app/onboarding/[slug]/page.tsx | 172 + src/app/onboarding/done/page.tsx | 56 + src/app/page.tsx | 30 + src/app/verify/page.tsx | 145 + src/app/welcome/page.tsx | 128 + src/components/BottomNav.tsx | 56 + src/components/ServiceWorkerRegister.tsx | 14 + src/components/discover/FiltersSheet.tsx | 123 + src/components/discover/MatchModal.tsx | 86 + src/components/discover/SwipeCard.tsx | 118 + src/components/discover/SwipeDeck.tsx | 122 + .../onboarding/OnboardingScreen.tsx | 69 + .../onboarding/steps/BasicInfoStep.tsx | 87 + .../onboarding/steps/BodyInfoStep.tsx | 66 + .../onboarding/steps/EducationStep.tsx | 92 + .../onboarding/steps/GenericOptionStep.tsx | 91 + .../onboarding/steps/ProfileQuestionsStep.tsx | 147 + src/components/ui/Avatar.tsx | 45 + src/components/ui/Badge.tsx | 102 + src/components/ui/Button.tsx | 76 + src/components/ui/Card.tsx | 27 + src/components/ui/Controls.tsx | 112 + src/components/ui/EmptyState.tsx | 31 + src/components/ui/ErrorBanner.tsx | 11 + src/components/ui/FullScreenLoader.tsx | 10 + src/components/ui/OptionPicker.tsx | 66 + src/components/ui/OtpInput.tsx | 85 + src/components/ui/Progress.tsx | 26 + src/components/ui/TextField.tsx | 60 + src/lib/api.ts | 457 ++ src/lib/auth-context.tsx | 118 + src/lib/hooks.ts | 30 + src/lib/onboarding-steps.ts | 40 + src/lib/token-store.ts | 27 + src/lib/utils.ts | 24 + tsconfig.json | 34 + 63 files changed, 11802 insertions(+) create mode 100644 .env.local.example create mode 100644 .gitignore create mode 100644 README.md create mode 100644 eslint.config.mjs create mode 100644 next.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon.png create mode 100644 public/icons/icon-192.png create mode 100644 public/icons/icon-512.png create mode 100644 public/icons/maskable-512.png create mode 100644 public/manifest.webmanifest create mode 100644 public/sw.js create mode 100644 src/app/(main)/home/[id]/page.tsx create mode 100644 src/app/(main)/home/likes/page.tsx create mode 100644 src/app/(main)/home/page.tsx create mode 100644 src/app/(main)/layout.tsx create mode 100644 src/app/(main)/messages/[id]/page.tsx create mode 100644 src/app/(main)/messages/page.tsx create mode 100644 src/app/(main)/profile/page.tsx create mode 100644 src/app/(main)/settings/page.tsx create mode 100644 src/app/favicon.ico create mode 100644 src/app/globals.css create mode 100644 src/app/layout.tsx create mode 100644 src/app/login/page.tsx create mode 100644 src/app/onboarding/[slug]/page.tsx create mode 100644 src/app/onboarding/done/page.tsx create mode 100644 src/app/page.tsx create mode 100644 src/app/verify/page.tsx create mode 100644 src/app/welcome/page.tsx create mode 100644 src/components/BottomNav.tsx create mode 100644 src/components/ServiceWorkerRegister.tsx create mode 100644 src/components/discover/FiltersSheet.tsx create mode 100644 src/components/discover/MatchModal.tsx create mode 100644 src/components/discover/SwipeCard.tsx create mode 100644 src/components/discover/SwipeDeck.tsx create mode 100644 src/components/onboarding/OnboardingScreen.tsx create mode 100644 src/components/onboarding/steps/BasicInfoStep.tsx create mode 100644 src/components/onboarding/steps/BodyInfoStep.tsx create mode 100644 src/components/onboarding/steps/EducationStep.tsx create mode 100644 src/components/onboarding/steps/GenericOptionStep.tsx create mode 100644 src/components/onboarding/steps/ProfileQuestionsStep.tsx create mode 100644 src/components/ui/Avatar.tsx create mode 100644 src/components/ui/Badge.tsx create mode 100644 src/components/ui/Button.tsx create mode 100644 src/components/ui/Card.tsx create mode 100644 src/components/ui/Controls.tsx create mode 100644 src/components/ui/EmptyState.tsx create mode 100644 src/components/ui/ErrorBanner.tsx create mode 100644 src/components/ui/FullScreenLoader.tsx create mode 100644 src/components/ui/OptionPicker.tsx create mode 100644 src/components/ui/OtpInput.tsx create mode 100644 src/components/ui/Progress.tsx create mode 100644 src/components/ui/TextField.tsx create mode 100644 src/lib/api.ts create mode 100644 src/lib/auth-context.tsx create mode 100644 src/lib/hooks.ts create mode 100644 src/lib/onboarding-steps.ts create mode 100644 src/lib/token-store.ts create mode 100644 src/lib/utils.ts create mode 100644 tsconfig.json diff --git a/.env.local.example b/.env.local.example new file mode 100644 index 0000000..3be9167 --- /dev/null +++ b/.env.local.example @@ -0,0 +1,2 @@ +# آدرس بک‌اند Go (بدون اسلش آخر) +NEXT_PUBLIC_API_URL=http://localhost:8080/api/v1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..032cc23 --- /dev/null +++ b/.gitignore @@ -0,0 +1,45 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* +!.env*.example + +# vercel +.vercel + +# فایل‌های آپلودشده‌ی بک‌اند (اگه به اشتباه اینجا کنار بک‌اند اجرا بشه) +/uploads/ + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/README.md b/README.md new file mode 100644 index 0000000..7ec5e6c --- /dev/null +++ b/README.md @@ -0,0 +1,103 @@ +# دلدل — فرانت PWA اپ دیتینگ (Next.js + Basis Design System) + +فرانت موبایل‌محور و PWA برای بک‌اند Go/Gin/GORM که قبلاً ساختیم، با همون +Basis Design System (نسخه‌ی شاد و گرد Atlas): قرمز پرانرژی، گوشه‌های گرد، +سایه‌های نرم، فونت Vazirmatn + Baloo 2. + +## ویژگی‌ها + +- ورود با شماره موبایل + کد OTP (بدون پسورد) +- ۸ مرحله‌ی آنبوردینگ دقیقاً مطابق API بک‌اند (با state machine که جلوی پرش + از مرحله رو می‌گیره، ولی اجازه‌ی برگشت و ویرایش می‌ده) +- صفحه‌ی پروفایل کامل با دکمه‌ی ویرایش روی هر بخش (برمی‌گرده به همون مرحله‌ی + آنبوردینگ، چون بک‌اند بعد از تکمیل کامل اجازه‌ی ویرایش هر مرحله رو می‌ده) +- شبیه‌سازی یک اپ سه‌تبه (کشف/پروفایل/تنظیمات) — تب «کشف» چون بک‌اند فعلاً + matching نداره، حالت «به‌زودی» نشون می‌ده +- PWA کامل: قابل نصب روی گوشی (`manifest.webmanifest` + service worker + + آیکون)، تمام صفحات موبایل‌فرست و محدود به عرض یک گوشی + +## ✅ تست شده + +قبل از تحویل، کل مسیر کاربر (درخواست OTP → تایید → ۸ مرحله‌ی آنبوردینگ → +پروفایل نهایی → رفرش توکن) با یک اسکریپت Node که دقیقاً همون درخواست‌های +`src/lib/api.ts` رو می‌فرسته، روی یک نمونه‌ی واقعی از بک‌اند گو اجرا و با +موفقیت پاس شد — شامل تست‌های منفی (OTP اشتباه، انتخاب ناقص علاقه‌مندی). +یعنی قرارداد بین این فرانت و بک‌اندی که قبلاً تحویل گرفتی، تضمین‌شده هم‌خونه. + +## راه‌اندازی + +### ۱) تنظیم آدرس بک‌اند + +```bash +cp .env.local.example .env.local +``` + +و `NEXT_PUBLIC_API_URL` رو به آدرس واقعی بک‌اندت تغییر بده (پیش‌فرض +`http://localhost:8080/api/v1`). + +### ۲) نصب و اجرا + +```bash +npm install +npm run dev +``` + +`http://localhost:3000` رو باز کن. برای تست موبایل واقعی، از ابزار +device-toolbar مرورگر استفاده کن یا با آی‌پی لوکال شبکه از گوشی وصل شو. + +### ۳) نصب به‌عنوان PWA + +- **اندروید/کروم:** منوی مرورگر → «Add to Home screen» +- **iOS/Safari:** دکمه‌ی Share → «Add to Home Screen» + +بعد از نصب، اپ بدون نوار آدرس مرورگر و با آیکون اختصاصی روی صفحه‌ی اصلی گوشی +باز می‌شه. + +## ساختار پروژه + +``` +src/ +├── app/ +│ ├── layout.tsx ← فونت، متادیتای PWA، AuthProvider +│ ├── page.tsx ← ریدایرکت اولیه بر اساس وضعیت کاربر +│ ├── login/page.tsx ← ورود با شماره موبایل +│ ├── verify/page.tsx ← تایید کد OTP +│ ├── onboarding/ +│ │ ├── [slug]/page.tsx ← صفحه‌ی داینامیک هر ۸ مرحله +│ │ └── done/page.tsx ← صفحه‌ی تبریک پایان آنبوردینگ +│ └── (main)/ ← اپ اصلی بعد از آنبوردینگ (با BottomNav) +│ ├── layout.tsx +│ ├── home/page.tsx ← کشف (placeholder "به‌زودی") +│ ├── profile/page.tsx ← پروفایل کامل + دکمه‌ی ویرایش هر بخش +│ └── settings/page.tsx ← خروج از حساب + آیتم‌های "به‌زودی" +├── components/ +│ ├── ui/ ← کامپوننت‌های پایه‌ی دیزاین‌سیستم +│ ├── onboarding/ ← wrapper و ۸ کامپوننت هر مرحله +│ └── BottomNav.tsx +└── lib/ + ├── api.ts ← کلاینت تایپ‌شده‌ی کامل API (منطبق با بک‌اند گو) + ├── auth-context.tsx ← مدیریت وضعیت ورود/کاربر/آنبوردینگ + ├── token-store.ts ← ذخیره‌ی توکن‌ها در localStorage + ├── onboarding-steps.ts ← ترتیب و متادیتای ۸ مرحله + └── hooks.ts ← useRequireAuth، فرمت خطا +``` + +## نکات فنی مهم + +- **رفرش خودکار توکن:** اگه access token منقضی بشه، `api.ts` خودکار با + refresh token یه توکن جدید می‌گیره و درخواست رو یک‌بار دوباره می‌فرسته؛ + کاربر چیزی حس نمی‌کنه. +- **گارد مراحل آنبوردینگ:** هر صفحه‌ی مرحله چک می‌کنه که کاربر اجازه‌ی + دیدن اون مرحله رو داره یا نه (بر اساس `current_step` از بک‌اند)؛ اگه + بخواد از روی مرحله بپره، خودکار به مرحله‌ی درست برمی‌گرده. +- **فونت self-hosted:** مثل دیزاین‌سیستم قبلی، فونت‌ها از `@fontsource-variable` + میان (نه `next/font/google`) تا هیچ‌وقت به گوگل وصل نشه. +- **CORS:** بک‌اند گو از قبل CORS باز داره، پس این فرانت روی هر پورت/دامنه‌ای + بدون تنظیم اضافه بهش وصل می‌شه. + +## محدودیت شناخته‌شده + +تب «کشف» (matching/کشف افراد) و بخش چت هنوز در بک‌اند پیاده نشدن، پس فقط +یک EmptyState با برچسب «به‌زودی» نشون داده می‌شه. هر وقت اون endpoint ها +رو ساختی، فقط کافیه `src/app/(main)/home/page.tsx` رو با فراخوانی API واقعی +جایگزین کنی. diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..05e726d --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,18 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import nextVitals from "eslint-config-next/core-web-vitals"; +import nextTs from "eslint-config-next/typescript"; + +const eslintConfig = defineConfig([ + ...nextVitals, + ...nextTs, + // Override default ignores of eslint-config-next. + globalIgnores([ + // Default ignores of eslint-config-next: + ".next/**", + "out/**", + "build/**", + "next-env.d.ts", + ]), +]); + +export default eslintConfig; diff --git a/next.config.ts b/next.config.ts new file mode 100644 index 0000000..e9ffa30 --- /dev/null +++ b/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..e722472 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6858 @@ +{ + "name": "dating-app-web", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dating-app-web", + "version": "0.1.0", + "dependencies": { + "@fontsource-variable/baloo-2": "^5.3.0", + "@fontsource-variable/vazirmatn": "^5.3.0", + "clsx": "^2.1.1", + "framer-motion": "^13.3.0", + "lucide-react": "^1.45.0", + "next": "16.3.5", + "react": "19.2.8", + "react-dom": "19.2.8" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "16.3.5", + "tailwindcss": "^4", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.3.0.tgz", + "integrity": "sha512-U4+70Pc5ZS9osnCBCE5Jha/ciHM+Yp+CNMNC/7HvYbNRk1Ldd+f7qO65W5qfhu/TCv+/ozljlXXe9Nj8419DMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.7.tgz", + "integrity": "sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.3.2", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@fontsource-variable/baloo-2": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource-variable/baloo-2/-/baloo-2-5.3.0.tgz", + "integrity": "sha512-F7UfemLyAzp22LWRuy0IumnAPy/us+H5sxlDUsJ5a6LxinGf1BZaauL5kxBiLkvsfvoQWpY7DuUZ7GSdz+cR7g==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource-variable/vazirmatn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource-variable/vazirmatn/-/vazirmatn-5.3.0.tgz", + "integrity": "sha512-ZA68W8JHbMdNzzwjYHUWKB2PH22QpxNEnk0ukcXM+XiqYMV6ZWJZAKuNXcrMR2JjuIAwsfAU3KknCXPI6wXUvw==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.4.tgz", + "integrity": "sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.3.3" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.4.tgz", + "integrity": "sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.3.3" + } + }, + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.4.tgz", + "integrity": "sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==", + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "dependencies": { + "@img/sharp-wasm32": "0.35.4" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.3.tgz", + "integrity": "sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.3.tgz", + "integrity": "sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.3.tgz", + "integrity": "sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.3.tgz", + "integrity": "sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.3.tgz", + "integrity": "sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.3.tgz", + "integrity": "sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.3.tgz", + "integrity": "sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.3.tgz", + "integrity": "sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.3.tgz", + "integrity": "sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.3.tgz", + "integrity": "sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.4.tgz", + "integrity": "sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.3.3" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.4.tgz", + "integrity": "sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.3.3" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.4.tgz", + "integrity": "sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.3.3" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.4.tgz", + "integrity": "sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.3.3" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.4.tgz", + "integrity": "sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.3.3" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.4.tgz", + "integrity": "sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.3.3" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.4.tgz", + "integrity": "sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.3.3" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.4.tgz", + "integrity": "sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.3.3" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.4.tgz", + "integrity": "sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.4.tgz", + "integrity": "sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/sharp-wasm32": "0.35.4" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.4.tgz", + "integrity": "sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.4.tgz", + "integrity": "sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.4.tgz", + "integrity": "sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.4.tgz", + "integrity": "sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" + } + }, + "node_modules/@next/env": { + "version": "16.3.5", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.3.5.tgz", + "integrity": "sha512-NWEXVDMqoEo0ktmU6u0sE2Vg0LOcsD7NnOTJNo3/fEaTfsg+F1bMIxuDmQbda4e3yTIQwVdUREF2yIuMOusKtg==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "16.3.5", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.3.5.tgz", + "integrity": "sha512-PGfSeItHJ12DH8t+6sEbuMe59NE5rAhCfgk06QKTH2ne9VUL1JlaXdYXY3B8RaiF2SO50rDYvd39TulP6A6xZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "4.9.1", + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.3.5.tgz", + "integrity": "sha512-pMmGgETfKvElucLHtVaeiMRbp2zUbvKx7b1yGko0liBz3cw1mKSggWN/Rp/wPz8z+E1O82u3r4L1Co+ZS5hokQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.3.5.tgz", + "integrity": "sha512-76VaGYvf6HPa5/w12yLkE3dXTn9AfdEviI79oEL3aZoAmRLc9rWitjWqyjViVysK/ht/y9YKzFkBrUdi/wGkow==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.3.5.tgz", + "integrity": "sha512-zKDELJ5jSQMHeO/hmXUQsAzagX4bQD4OiMi3pQ5FbUj+yK506oLVHnKA2YXMlbg1EHHqJYtyePOgByIDXD1lqw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.3.5.tgz", + "integrity": "sha512-7Vql0pgzCoHagv6+FNOZoqmJqA52c6zeVbhtS/47qFozO1MSx4ms7x7GHiciY8R5CDsSMKMQjJEryoJLcsBIbA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.3.5.tgz", + "integrity": "sha512-NH/xzehyHEFWE2nlcZon7TB/0+H4shfWCi7S1zka815XCOhJDYZhoeJtOYy0dh0WVRWACVXSyGNFFytoMxUhRg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.3.5.tgz", + "integrity": "sha512-lV4+EhWMfS8jcC+EH2nn/Cm5cn6XsgbE07bU9tMH8fCo0tNAqhyzi1b5wQ/Tn6NGFTvKDY65w3ZH95EjwBRAnQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.3.5.tgz", + "integrity": "sha512-/wKzAREX2RF++MhicjDbg8tGn2AiBIM0+EFeTFKoUEUbW5D6amCJehd5Z5G1H5/gxNdgnwoXMcHz24H/c2tGkQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.3.5.tgz", + "integrity": "sha512-LNdCHzgLFc+UeqMS84LzXPaeBRKyqDN9OMyFAr1OrB0XrNw78IRrEVtZvvA7245W/HsaoeVOQX9jPjPk8jojwA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "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/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", + "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.3.tgz", + "integrity": "sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "postcss": "^8.5.16", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", + "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", + "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.3.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.70.0.tgz", + "integrity": "sha512-/v8HZt6RlyIZxB3ntehELOcUcfxKPVGWXnQdJuHRmzrqgF8nQypcC/oxGW+Ot4VGKDq81XugPKxx0n5PBtf9PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.70.0", + "@typescript-eslint/type-utils": "8.70.0", + "@typescript-eslint/utils": "8.70.0", + "@typescript-eslint/visitor-keys": "8.70.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.70.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.9.tgz", + "integrity": "sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.70.0.tgz", + "integrity": "sha512-zYvrmj9Yxd63UGaXw+kdt6A0F0s0qveJyuatIM77bYC2DE4pgmg7a50u8LR7PRtXd0x+h+Tl3eXabGm06SWd3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.70.0", + "@typescript-eslint/types": "8.70.0", + "@typescript-eslint/typescript-estree": "8.70.0", + "@typescript-eslint/visitor-keys": "8.70.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.70.0.tgz", + "integrity": "sha512-hFHbTNqhU9G+2eKFXCBVb1tjFT/LceiJ4+HfLO4pTpDI0KHi6iajpcFFkaSQ9gXmCh7n82A0PthaayEdN6mspQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.70.0", + "@typescript-eslint/types": "^8.70.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.70.0.tgz", + "integrity": "sha512-8nP3Kwh5hlgZ4FicGvmznAmJe8UL4sdU8tLukrPaMuQmDuk4Y8xYfzu/aYZW4xT2JCgc7H/TpDI5cGlxcWJSqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.70.0", + "@typescript-eslint/visitor-keys": "8.70.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.70.0.tgz", + "integrity": "sha512-adnkeeNq9Sq1sUf4+FRVc0KdgYghzsgFpZSQVZVvY0LCuUuN0FnQgyGzCJeC4fW1cdXseBAjU2EOqUIjbNcZUw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.70.0.tgz", + "integrity": "sha512-NUMKIhYVaVIVLnRL9CRt+VVcuLgSHUCpXn4/+K8wql+vdInUzvx8BjUO1oJ7cG9shjFJKtF8F8Hh2kCh3/KBVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.70.0", + "@typescript-eslint/typescript-estree": "8.70.0", + "@typescript-eslint/utils": "8.70.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.70.0.tgz", + "integrity": "sha512-asTOIYhDg4zdzOScCyaytrsV3cR6B4ecPQlXw/dJIm7J/MZTtCtfVII9JD8Geh4jTCrK/Xe6cg5UevoleMcoJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.70.0.tgz", + "integrity": "sha512-d9NmHMPEKQ7QCLLm1jI3zmoQBwT5KwFYjXBJ9ymZfKCUU+5rmTRykKAFvH5Qn/ZCds3CEAFS9OC9M/jkl0X2bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.70.0", + "@typescript-eslint/tsconfig-utils": "8.70.0", + "@typescript-eslint/types": "8.70.0", + "@typescript-eslint/visitor-keys": "8.70.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.70.0.tgz", + "integrity": "sha512-oZmtKJz/4fufZ2p3+Cn3ijEojcdfR+1zYDH2xKYrEly0dR/Q/1xUPRCOlKGxod78nWlU2UnDe09GZ3TaknBFGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.70.0", + "@typescript-eslint/types": "8.70.0", + "@typescript-eslint/typescript-estree": "8.70.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.70.0.tgz", + "integrity": "sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.70.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", + "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", + "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", + "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", + "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", + "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", + "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", + "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", + "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", + "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", + "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", + "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", + "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", + "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", + "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", + "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", + "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", + "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-openharmony-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", + "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", + "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", + "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", + "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", + "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.2.0.tgz", + "integrity": "sha512-VXY5eFRarnXcYxwBjJzPmEhH55+rmP79/+ueDhi0F+TuqfHCItagIHqxeUZrmgrOPa31QTh9H85DjX3FfJ0FTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "es-shim-unscopables": "^1.1.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.13.0.tgz", + "integrity": "sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.23", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.23.tgz", + "integrity": "sha512-le521dGVfxM7yRX0EikCoSz+rOK+hHzdDt/E7mG1jOJB/6WAAUuwVroLwaB7ApaUsz5Q0kFlDXLSA9MheUIfRQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.9.tgz", + "integrity": "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.20", + "caniuse-lite": "^1.0.30001810", + "electron-to-chromium": "^1.5.420", + "node-releases": "^2.0.54", + "update-browserslist-db": "^1.3.2" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.427", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.427.tgz", + "integrity": "sha512-n14zb3FdsChZ2BNobqNHAJMcP3ifFv4paox2LvCrfVAQcqGiSURgbJl+PfMpHVCNFkStnNc+RRVtPBTVW5PDgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.25.0.tgz", + "integrity": "sha512-ghq3mhs649mvbarTCAlZn2wRhbfHmzAFiKxoWA14B3VtqnxtZt+wz8BroKXU0tF3GiJsnUldjVncQGZ8qk4rdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract-get": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", + "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "is-callable": "^1.2.7", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.4.0.tgz", + "integrity": "sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", + "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-abstract-get": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "is-callable": "^1.2.7", + "is-date-object": "^1.1.0", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "16.3.5", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.3.5.tgz", + "integrity": "sha512-wPjq9MLQuWykHs8tsm2gH6OJThk6N27L8Te2JatlaGZ7jT1gtgGmJKukygL28xOlWsg5J1a1bGy/PvLyQC8OYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "16.3.5", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^7.0.0", + "globals": "16.4.0", + "typescript-eslint": "^8.46.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", + "integrity": "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "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.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/framer-motion": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-13.3.0.tgz", + "integrity": "sha512-nry9figMPgd/7tTy9zzGRsD+kJ9tjZ74sKJ3jFBa7j6DTBIM04T6eBgneFLXCB0151wychIxsiojPlcG4JxeoA==", + "dependencies": { + "motion-dom": "^13.3.0", + "motion-utils": "^13.3.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", + "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.4", + "is-callable": "^1.2.7", + "is-document.all": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.3.tgz", + "integrity": "sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-document.all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", + "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.45.0.tgz", + "integrity": "sha512-yH1ubCAduho9UR7oJhRXIQXogksRILBiTuZC4/bQIGeB9JOkxMlSuEHyyZpo1Z3S0yWJO2KTSUZbjiNvVxeOUw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/motion-dom": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-13.3.0.tgz", + "integrity": "sha512-AmAnB6pHdZ1vHGzWzuzteG6Q3j1lHKeX/lbST6jGlgm0cjvLUgaCk1xhOuPMOy5SgovN6wnnUdwFrkcsus7Ftg==", + "dependencies": { + "motion-utils": "^13.3.0" + } + }, + "node_modules/motion-utils": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-13.3.0.tgz", + "integrity": "sha512-sgSschQp7EseHInIlR7hBbMuvet3RA0bs28KPZAXJcGKGdxHGvh1ogpYDilY3bOMtl73EqPNmp75sAKHYPU5sg==" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/next": { + "version": "16.3.5", + "resolved": "https://registry.npmjs.org/next/-/next-16.3.5.tgz", + "integrity": "sha512-MdtsTgzyfCPRLC6uJ1mN8ao7lyJ4BB0U6Inhnx3gta1UcCIdHK3yxLG0E8OWQteWD8/Q0qb8A5o7wJaL8M9y2w==", + "license": "MIT", + "dependencies": { + "@next/env": "16.3.5", + "@swc/helpers": "0.5.23", + "baseline-browser-mapping": "^2.9.19", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.5.23", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.3.5", + "@next/swc-darwin-x64": "16.3.5", + "@next/swc-linux-arm64-gnu": "16.3.5", + "@next/swc-linux-arm64-musl": "16.3.5", + "@next/swc-linux-x64-gnu": "16.3.5", + "@next/swc-linux-x64-musl": "16.3.5", + "@next/swc-win32-arm64-msvc": "16.3.5", + "@next/swc-win32-x64-msvc": "16.3.5", + "sharp": "^0.35.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.5.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", + "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-exports-info": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz", + "integrity": "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-releases": { + "version": "2.0.55", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.55.tgz", + "integrity": "sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", + "integrity": "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "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/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/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.4.tgz", + "integrity": "sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.1.0", + "detect-libc": "^2.1.2", + "semver": "^7.8.5" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.35.4", + "@img/sharp-darwin-x64": "0.35.4", + "@img/sharp-freebsd-wasm32": "0.35.4", + "@img/sharp-libvips-darwin-arm64": "1.3.3", + "@img/sharp-libvips-darwin-x64": "1.3.3", + "@img/sharp-libvips-linux-arm": "1.3.3", + "@img/sharp-libvips-linux-arm64": "1.3.3", + "@img/sharp-libvips-linux-ppc64": "1.3.3", + "@img/sharp-libvips-linux-riscv64": "1.3.3", + "@img/sharp-libvips-linux-s390x": "1.3.3", + "@img/sharp-libvips-linux-x64": "1.3.3", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.3", + "@img/sharp-libvips-linuxmusl-x64": "1.3.3", + "@img/sharp-linux-arm": "0.35.4", + "@img/sharp-linux-arm64": "0.35.4", + "@img/sharp-linux-ppc64": "0.35.4", + "@img/sharp-linux-riscv64": "0.35.4", + "@img/sharp-linux-s390x": "0.35.4", + "@img/sharp-linux-x64": "0.35.4", + "@img/sharp-linuxmusl-arm64": "0.35.4", + "@img/sharp-linuxmusl-x64": "0.35.4", + "@img/sharp-webcontainers-wasm32": "0.35.4", + "@img/sharp-win32-arm64": "0.35.4", + "@img/sharp-win32-ia32": "0.35.4", + "@img/sharp-win32-x64": "0.35.4" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.1.0.tgz", + "integrity": "sha512-tHNHTxInrYLCga9O9YGxWA3G9/nnzQw8UGAyqGx3Ar1pSTTzIuM4woFSq4SowkXCjJIwq5sIiQvEfRI9tCH1qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "get-intrinsic": "^1.3.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.4", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.70.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.70.0.tgz", + "integrity": "sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.70.0", + "@typescript-eslint/parser": "8.70.0", + "@typescript-eslint/typescript-estree": "8.70.0", + "@typescript-eslint/utils": "8.70.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unrs-resolver": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz", + "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.4" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.12.2", + "@unrs/resolver-binding-android-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-x64": "1.12.2", + "@unrs/resolver-binding-freebsd-x64": "1.12.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", + "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-musl": "1.12.2", + "@unrs/resolver-binding-openharmony-arm64": "1.12.2", + "@unrs/resolver-binding-wasm32-wasi": "1.12.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", + "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.4.tgz", + "integrity": "sha512-AXSD6hvGdvRjajG/l1cC+d6IrhH+sjmPKtYeQdJIK8MFJl3LyClzS+o/YsVC+zQZPupAaeH5skwwm8YqYH7BqA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..6f28bd4 --- /dev/null +++ b/package.json @@ -0,0 +1,31 @@ +{ + "name": "dating-app-web", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "eslint" + }, + "dependencies": { + "@fontsource-variable/baloo-2": "^5.3.0", + "@fontsource-variable/vazirmatn": "^5.3.0", + "clsx": "^2.1.1", + "framer-motion": "^13.3.0", + "lucide-react": "^1.45.0", + "next": "16.3.5", + "react": "19.2.8", + "react-dom": "19.2.8" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "16.3.5", + "tailwindcss": "^4", + "typescript": "^5" + } +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..61e3684 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..30b04c40fa509e5756116002e21b4bc11c39156a GIT binary patch literal 5157 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 OfeiIbb-(D?MgAYL@aoC{ literal 0 HcmV?d00001 diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..7e626a114ad100f5a233605620d185babe4bd20e GIT binary patch literal 911 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

NE(dFfE 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 GcmEGXj3^lZ literal 0 HcmV?d00001 diff --git a/public/manifest.webmanifest b/public/manifest.webmanifest new file mode 100644 index 0000000..d62d4b7 --- /dev/null +++ b/public/manifest.webmanifest @@ -0,0 +1,33 @@ +{ + "name": "دلدل — آشنایی و دوستیابی", + "short_name": "دلدل", + "description": "اپلیکیشن آشنایی و دوستیابی، شاد و صمیمی", + "start_url": "/", + "scope": "/", + "display": "standalone", + "orientation": "portrait", + "background_color": "#fff8f5", + "theme_color": "#ff4433", + "lang": "fa", + "dir": "rtl", + "icons": [ + { + "src": "/icons/icon-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/icons/icon-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/icons/maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/public/sw.js b/public/sw.js new file mode 100644 index 0000000..29fe007 --- /dev/null +++ b/public/sw.js @@ -0,0 +1,38 @@ +const CACHE_NAME = "deldel-cache-v1"; +const APP_SHELL = ["/", "/manifest.webmanifest", "/icons/icon-192.png", "/icons/icon-512.png"]; + +self.addEventListener("install", (event) => { + event.waitUntil( + caches.open(CACHE_NAME).then((cache) => cache.addAll(APP_SHELL)).catch(() => {}) + ); + self.skipWaiting(); +}); + +self.addEventListener("activate", (event) => { + event.waitUntil( + caches + .keys() + .then((keys) => + Promise.all(keys.filter((k) => k !== CACHE_NAME).map((k) => caches.delete(k))) + ) + ); + self.clients.claim(); +}); + +// استراتژی: برای API همیشه شبکه (never cache)، برای بقیه network-first با fallback به کش +self.addEventListener("fetch", (event) => { + const url = new URL(event.request.url); + + if (event.request.method !== "GET") return; + if (url.pathname.startsWith("/api")) return; + + event.respondWith( + fetch(event.request) + .then((res) => { + const resClone = res.clone(); + caches.open(CACHE_NAME).then((cache) => cache.put(event.request, resClone)); + return res; + }) + .catch(() => caches.match(event.request)) + ); +}); diff --git a/src/app/(main)/home/[id]/page.tsx b/src/app/(main)/home/[id]/page.tsx new file mode 100644 index 0000000..bb5a542 --- /dev/null +++ b/src/app/(main)/home/[id]/page.tsx @@ -0,0 +1,317 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { useParams, useRouter } from "next/navigation"; +import { motion, AnimatePresence } from "framer-motion"; +import { ChevronRight, MapPin, X, Heart, Star, User, Ruler, Weight, GraduationCap, Briefcase, Sparkles, Search } from "lucide-react"; +import { Tag } from "@/components/ui/Badge"; +import { Card } from "@/components/ui/Card"; +import { FullScreenLoader } from "@/components/ui/FullScreenLoader"; +import { ErrorBanner } from "@/components/ui/ErrorBanner"; +import { CandidateDetail, getCandidateDetail, photoUrl, swipe } from "@/lib/api"; +import { formatApiError } from "@/lib/hooks"; +import { formatDistance } from "@/lib/utils"; + +function SectionCard({ + icon, + title, + children, +}: { + icon: React.ReactNode; + title: string; + children: React.ReactNode; +}) { + return ( + +

+ {icon} + {title} +
+ {children} + + ); +} + +export default function ProfileDetailPage() { + const params = useParams<{ id: string }>(); + const router = useRouter(); + const id = Number(params.id); + + const [profile, setProfile] = useState(null); + const [error, setError] = useState(null); + const [photoIndex, setPhotoIndex] = useState(0); + const [viewerOpen, setViewerOpen] = useState(false); + const [acting, setActing] = useState(false); + + useEffect(() => { + getCandidateDetail(id) + .then(setProfile) + .catch((err) => setError(formatApiError(err, "این پروفایل پیدا نشد"))); + }, [id]); + + async function handleSwipe(action: "like" | "pass" | "superlike") { + setActing(true); + try { + const result = await swipe(id, action); + if (result.matched && result.match) { + router.push(`/messages/${result.match.id}`); + return; + } + } catch { + // اگه سواپ با خطا مواجه بشه، بازم کاربر رو برمی‌گردونیم به کشف + } + router.push("/home"); + } + + if (error) { + return ( +
+ + +
+ ); + } + if (!profile) return ; + + function goTo(i: number) { + if (!profile) return; + setPhotoIndex(Math.max(0, Math.min(profile.photos.length - 1, i))); + } + + const photo = profile.photos[photoIndex]; + + return ( +
+
+ {photo ? ( + // eslint-disable-next-line @next/next/no-img-element + {profile.first_name} setViewerOpen(true)} + /> + ) : ( +
+ +
+ )} + + {profile.photos.length > 0 && ( +
+ {profile.photos.map((_, i) => ( +
+ )} + + + + {profile.photos.length > 1 && ( + <> +
+ +
+

+ {profile.first_name || "بدون نام"}, {profile.age} +

+ + {profile.distance_km != null && ( +
+ + + {formatDistance(profile.distance_km)} + +
+ )} + + {(profile.height_cm || profile.weight_kg) && ( + } title="قد و وزن"> +
+ {profile.height_cm && ( + + + {profile.height_cm} سانتی‌متر + + )} + {profile.weight_kg && ( + + + {profile.weight_kg} کیلوگرم + + )} +
+
+ )} + + {(profile.education || profile.field_of_study) && ( + } title="تحصیلات"> +

+ {profile.education} {profile.field_of_study ? `· ${profile.field_of_study}` : ""} +

+
+ )} + + {!!profile.occupations?.length && ( + } title="فعالیت‌ها"> +
+ {profile.occupations.map((t) => ( + + ))} +
+
+ )} + + {!!profile.important_in_relationship?.length && ( + } title="توی رابطه براش مهمه"> +
+ {profile.important_in_relationship.map((t) => ( + + ))} +
+
+ )} + + {!!profile.interests?.length && ( + } title="علاقه‌مندی‌ها"> +
+ {profile.interests.map((t) => ( + + ))} +
+
+ )} + + {profile.looking_for && ( + } title="دنبال چی می‌گرده"> +

{profile.looking_for}

+
+ )} + + {!!profile.profile_answers?.length && ( + } title="یکم از خودش"> +
+ {profile.profile_answers.map((a, i) => ( +
+

+ {a.question} +

+

{a.answer}

+
+ ))} +
+
+ )} + + {profile.photos.length > 1 && ( +
+

گالری

+
+ {profile.photos.map((p, i) => ( + + ))} +
+
+ )} +
+ + + {viewerOpen && photo && ( + + +
+ {/* eslint-disable-next-line @next/next/no-img-element */} + +
+
+ {profile.photos.map((_, i) => ( +
+
+ )} +
+
+ ); +} diff --git a/src/app/(main)/home/likes/page.tsx b/src/app/(main)/home/likes/page.tsx new file mode 100644 index 0000000..b14a811 --- /dev/null +++ b/src/app/(main)/home/likes/page.tsx @@ -0,0 +1,80 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { useRouter } from "next/navigation"; +import { ChevronRight, Lock, Heart } from "lucide-react"; +import { Button } from "@/components/ui/Button"; +import { FullScreenLoader } from "@/components/ui/FullScreenLoader"; +import { DiscoverCandidate, getDiscoverFeed, photoUrl } from "@/lib/api"; + +// چه کسایی لایکت کردن — این قابلیت نیاز به شمارش لایک‌های دریافتی داره که +// هنوز توی بک‌اند پیاده نشده. فعلاً فقط یه پیش‌نمایش تارشده از پیشنهادهای +// فعلی نشون داده می‌شه تا رابط کاربری آماده باشه. +export default function LikesYouPage() { + const router = useRouter(); + const [preview, setPreview] = useState(null); + + useEffect(() => { + getDiscoverFeed() + .then((data) => setPreview(data.slice(0, 6))) + .catch(() => setPreview([])); + }, []); + + return ( +
+
+ +

کسایی که لایکت کردن

+
+ + {preview === null ? ( + + ) : ( +
+ {preview.map((p) => ( +
+ {p.photos[0] && ( + // eslint-disable-next-line @next/next/no-img-element + + )} +
+ +
+
+ ))} +
+ )} + +
+
+ +
+
+

+ این بخش هنوز به‌طور کامل فعال نشده +

+

+ شمارش دقیق لایک‌های دریافتی هنوز توی بک‌اند پیاده نشده. فعلاً می‌تونی توی + صفحه‌ی کشف، خودت پروفایل‌ها رو ببینی و لایک کنی. +

+
+ +
+
+ ); +} diff --git a/src/app/(main)/home/page.tsx b/src/app/(main)/home/page.tsx new file mode 100644 index 0000000..1211773 --- /dev/null +++ b/src/app/(main)/home/page.tsx @@ -0,0 +1,221 @@ +"use client"; + +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { useRouter } from "next/navigation"; +import { Bell, HourglassIcon, XCircle, SlidersHorizontal, Heart } from "lucide-react"; +import { EmptyState } from "@/components/ui/EmptyState"; +import { Badge } from "@/components/ui/Badge"; +import { Button } from "@/components/ui/Button"; +import { FullScreenLoader } from "@/components/ui/FullScreenLoader"; +import { ErrorBanner } from "@/components/ui/ErrorBanner"; +import { useAuth } from "@/lib/auth-context"; +import { formatApiError } from "@/lib/hooks"; +import { SwipeDeck } from "@/components/discover/SwipeDeck"; +import { FiltersSheet, DiscoverFilters } from "@/components/discover/FiltersSheet"; +import { DiscoverCandidate, getDiscoverFeed, updateLocation } from "@/lib/api"; + +const POLL_MS = 20_000; +const DEFAULT_FILTERS: DiscoverFilters = { maxDistance: 300, minAge: 18, maxAge: 45 }; + +function BrandHeader() { + return ( +
+ + دلدل 💌 + +
+ ); +} + +function PendingReview() { + const { refreshUser } = useAuth(); + const [checking, setChecking] = useState(false); + const intervalRef = useRef | null>(null); + + useEffect(() => { + intervalRef.current = setInterval(() => { + refreshUser().catch(() => {}); + }, POLL_MS); + return () => { + if (intervalRef.current) clearInterval(intervalRef.current); + }; + }, [refreshUser]); + + async function handleCheck() { + setChecking(true); + try { + await refreshUser(); + } finally { + setChecking(false); + } + } + + return ( +
+ +
+ + در انتظار بررسی ⏳ + + } + title="پروفایلت داره بررسی می‌شه" + description="یکی از ادمین‌های دلدل داره اطلاعاتت رو نگاه می‌کنه. معمولاً زیاد طول نمی‌کشه؛ به‌محض تایید، خودکار میای اینجا." + actionLabel={checking ? "در حال بررسی..." : "بررسی وضعیت"} + onAction={handleCheck} + /> +
+
+ ); +} + +function Rejected({ reason }: { reason?: string }) { + const router = useRouter(); + return ( +
+ +
+ + نیاز به اصلاح ✋ + +
+
+ +
+
+

+ این بار تایید نشدی +

+ {reason && ( +

{reason}

+ )} +
+ +
+
+
+ ); +} + +function DiscoverScreen() { + const router = useRouter(); + const [filtersOpen, setFiltersOpen] = useState(false); + const [filters, setFilters] = useState(DEFAULT_FILTERS); + const [profiles, setProfiles] = useState(null); + const [error, setError] = useState(null); + const locationRequested = useRef(false); + const isFirstFiltersRun = useRef(true); + + const load = useCallback(async (f: DiscoverFilters) => { + setError(null); + try { + const data = await getDiscoverFeed({ + maxDistanceKm: f.maxDistance, + minAge: f.minAge, + maxAge: f.maxAge, + }); + setProfiles(data); + } catch (err) { + setError(formatApiError(err)); + setProfiles([]); + } + }, []); + + useEffect(() => { + // فقط بار اول موقعیت مکانی رو می‌گیریم؛ اگه کاربر اجازه نده، بدون فاصله ادامه می‌دیم + if (!locationRequested.current && typeof navigator !== "undefined" && navigator.geolocation) { + locationRequested.current = true; + navigator.geolocation.getCurrentPosition( + (pos) => { + updateLocation(pos.coords.latitude, pos.coords.longitude) + .catch(() => {}) + .finally(() => load(filters)); + }, + () => load(filters), + { timeout: 5000 } + ); + } else { + load(filters); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + if (isFirstFiltersRun.current) { + isFirstFiltersRun.current = false; + return; + } + load(filters); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [filters]); + + const key = useMemo(() => JSON.stringify(filters), [filters]); + + return ( +
+
+ + دلدل 💌 + +
+ + + +
+
+ + {profiles === null ? ( + + ) : error && profiles.length === 0 ? ( +
+ +
+ ) : profiles.length === 0 ? ( +
+ } + title="کسی با این فیلترها پیدا نشد" + description="محدوده‌ی فاصله یا سن رو بازتر کن، یا بعداً دوباره سر بزن." + actionLabel="بازتنظیم فیلترها" + onAction={() => setFilters(DEFAULT_FILTERS)} + /> +
+ ) : ( + load(filters)} /> + )} + + setFiltersOpen(false)} + onApply={setFilters} + /> +
+ ); +} + +export default function HomePage() { + const { user } = useAuth(); + + if (user?.approval_status === "rejected") { + return ; + } + if (user?.approval_status === "approved") { + return ; + } + return ; +} diff --git a/src/app/(main)/layout.tsx b/src/app/(main)/layout.tsx new file mode 100644 index 0000000..158ce00 --- /dev/null +++ b/src/app/(main)/layout.tsx @@ -0,0 +1,35 @@ +"use client"; + +import { ReactNode, useEffect } from "react"; +import { useRouter } from "next/navigation"; +import { useAuth } from "@/lib/auth-context"; +import { FullScreenLoader } from "@/components/ui/FullScreenLoader"; +import { BottomNav } from "@/components/BottomNav"; +import { stepByOrder } from "@/lib/onboarding-steps"; + +export default function MainLayout({ children }: { children: ReactNode }) { + const router = useRouter(); + const { status, user } = useAuth(); + + useEffect(() => { + if (status === "guest") { + router.replace("/login"); + return; + } + if (status === "authenticated" && user && !user.is_onboarded) { + const slug = stepByOrder(user.current_step)?.slug ?? "basic-info"; + router.replace(`/onboarding/${slug}`); + } + }, [status, user, router]); + + if (status !== "authenticated" || !user?.is_onboarded) { + return ; + } + + return ( +
+
{children}
+ +
+ ); +} diff --git a/src/app/(main)/messages/[id]/page.tsx b/src/app/(main)/messages/[id]/page.tsx new file mode 100644 index 0000000..6d0e453 --- /dev/null +++ b/src/app/(main)/messages/[id]/page.tsx @@ -0,0 +1,167 @@ +"use client"; + +import { useEffect, useRef, useState, useCallback } from "react"; +import { useParams, useRouter } from "next/navigation"; +import { ChevronRight, Send, User } from "lucide-react"; +import { cn } from "@/lib/utils"; +import { formatApiError } from "@/lib/hooks"; +import { ErrorBanner } from "@/components/ui/ErrorBanner"; +import { FullScreenLoader } from "@/components/ui/FullScreenLoader"; +import { + MessageView, + MatchView, + listMatches, + listMessages, + sendMessage, + photoUrl, +} from "@/lib/api"; + +const POLL_MS = 4000; + +export default function ChatPage() { + const params = useParams<{ id: string }>(); + const router = useRouter(); + const matchId = Number(params.id); + + const [match, setMatch] = useState(null); + const [messages, setMessages] = useState(null); + const [error, setError] = useState(null); + const [draft, setDraft] = useState(""); + const [sending, setSending] = useState(false); + const bottomRef = useRef(null); + const pollRef = useRef | null>(null); + + const refreshMessages = useCallback(async () => { + try { + const msgs = await listMessages(matchId); + setMessages(msgs); + } catch (err) { + setError(formatApiError(err)); + } + }, [matchId]); + + useEffect(() => { + listMatches() + .then((matches) => { + const found = matches.find((m) => m.id === matchId); + setMatch(found ?? null); + }) + .catch(() => {}); + // eslint-disable-next-line react-hooks/set-state-in-effect + refreshMessages(); + + pollRef.current = setInterval(refreshMessages, POLL_MS); + return () => { + if (pollRef.current) clearInterval(pollRef.current); + }; + }, [matchId, refreshMessages]); + + useEffect(() => { + bottomRef.current?.scrollIntoView({ block: "end" }); + }, [messages?.length]); + + async function handleSend() { + const text = draft.trim(); + if (!text || sending) return; + setSending(true); + setDraft(""); + try { + const msg = await sendMessage(matchId, text); + setMessages((prev) => (prev ? [...prev, msg] : [msg])); + } catch (err) { + setError(formatApiError(err)); + } finally { + setSending(false); + } + } + + if (error && !messages) { + return ( +
+ + +
+ ); + } + if (!messages) return ; + + return ( +
+
+ + +
+ +
+ {messages.length === 0 ? ( +

+ هنوز پیامی نیست؛ اولین نفر باش که سلام می‌ده 👋 +

+ ) : ( + messages.map((m) => ( +
+
+ {m.text} +
+
+ )) + )} +
+
+ + + +
+ setDraft(e.target.value)} + onKeyDown={(e) => e.key === "Enter" && handleSend()} + placeholder="پیامت رو بنویس..." + className="flex-1 h-11 rounded-(--radius-full) bg-(--color-bg-secondary) px-4 text-[14px] focus:outline-none focus:ring-2 focus:ring-(--color-brand-200)" + /> + +
+
+ ); +} diff --git a/src/app/(main)/messages/page.tsx b/src/app/(main)/messages/page.tsx new file mode 100644 index 0000000..2c0ba43 --- /dev/null +++ b/src/app/(main)/messages/page.tsx @@ -0,0 +1,125 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { useRouter } from "next/navigation"; +import { MessageCircleHeart, User } from "lucide-react"; +import { EmptyState } from "@/components/ui/EmptyState"; +import { FullScreenLoader } from "@/components/ui/FullScreenLoader"; +import { ErrorBanner } from "@/components/ui/ErrorBanner"; +import { formatApiError } from "@/lib/hooks"; +import { MatchView, listMatches, photoUrl } from "@/lib/api"; + +export default function MessagesPage() { + const router = useRouter(); + const [matches, setMatches] = useState(null); + const [error, setError] = useState(null); + + useEffect(() => { + listMatches() + .then(setMatches) + .catch((err) => setError(formatApiError(err))); + }, []); + + if (error && !matches) { + return ( +
+ +
+ ); + } + if (!matches) return ; + + const newMatches = matches.filter((m) => !m.last_message); + const conversations = matches.filter((m) => !!m.last_message); + + return ( +
+
+

پیام‌ها 💬

+
+ + {newMatches.length > 0 && ( +
+

+ مچ‌های جدید +

+
+ {newMatches.map((m) => ( + + ))} +
+
+ )} + +
+

+ گفتگوها +

+ {matches.length === 0 ? ( + } + title="هنوز مچی نداری" + description="وقتی با کسی مچ بشی، می‌تونی از همینجا باهاش گفتگو رو شروع کنی." + /> + ) : conversations.length === 0 ? ( +

+ هنوز پیامی رد و بدل نشده؛ از بالا روی یکی از مچ‌ها بزن و شروع کن. +

+ ) : ( +
+ {conversations.map((c) => ( + + ))} +
+ )} +
+
+ ); +} diff --git a/src/app/(main)/profile/page.tsx b/src/app/(main)/profile/page.tsx new file mode 100644 index 0000000..3896ab2 --- /dev/null +++ b/src/app/(main)/profile/page.tsx @@ -0,0 +1,276 @@ +"use client"; + +import { useEffect, useRef, useState } from "react"; +import Link from "next/link"; +import { + Pencil, + Ruler, + Weight, + GraduationCap, + Briefcase, + Heart, + Sparkles, + Search, + Plus, + X, + User as UserIcon, +} from "lucide-react"; +import { Card } from "@/components/ui/Card"; +import { Tag } from "@/components/ui/Badge"; +import { Avatar } from "@/components/ui/Avatar"; +import { FullScreenLoader } from "@/components/ui/FullScreenLoader"; +import { ErrorBanner } from "@/components/ui/ErrorBanner"; +import { getProfileMe, uploadPhoto, deletePhoto, photoUrl, FullProfile, Photo } from "@/lib/api"; +import { formatApiError } from "@/lib/hooks"; +import { calcAge } from "@/lib/utils"; + +function selectionTitles(profile: FullProfile, key: string): string[] { + return profile.selections.find((s) => s.category_key === key)?.titles ?? []; +} + +function SectionCard({ + icon, + title, + editHref, + children, +}: { + icon: React.ReactNode; + title: string; + editHref: string; + children: React.ReactNode; +}) { + return ( + +
+
+ {icon} + {title} +
+ + + +
+ {children} +
+ ); +} + +const MAX_PHOTOS = 6; + +function PhotosSection({ photos, onChange }: { photos: Photo[]; onChange: (photos: Photo[]) => void }) { + const fileInputRef = useRef(null); + const [uploading, setUploading] = useState(false); + const [error, setError] = useState(null); + + async function handleFile(e: React.ChangeEvent) { + const file = e.target.files?.[0]; + e.target.value = ""; + if (!file) return; + setUploading(true); + setError(null); + try { + const photo = await uploadPhoto(file); + onChange([...photos, photo]); + } catch (err) { + setError(formatApiError(err)); + } finally { + setUploading(false); + } + } + + async function handleDelete(id: number) { + setError(null); + try { + await deletePhoto(id); + onChange(photos.filter((p) => p.id !== id)); + } catch (err) { + setError(formatApiError(err)); + } + } + + return ( + +
+ + عکس‌های پروفایل + + + {photos.length}/{MAX_PHOTOS} + +
+ +
+ {photos.map((p) => ( +
+ {/* eslint-disable-next-line @next/next/no-img-element */} + + +
+ ))} + {photos.length < MAX_PHOTOS && ( + + )} +
+ +
+ ); +} + +export default function ProfilePage() { + const [profile, setProfile] = useState(null); + const [error, setError] = useState(null); + + useEffect(() => { + getProfileMe() + .then(setProfile) + .catch((err) => setError(formatApiError(err))); + }, []); + + if (error) { + return ( +
+ +
+ ); + } + if (!profile) return ; + + const { user } = profile; + const age = calcAge(user.birth_date); + const education = selectionTitles(profile, "education_level")[0]; + const fieldOfStudy = selectionTitles(profile, "field_of_study")[0]; + const occupations = selectionTitles(profile, "occupation"); + const importance = selectionTitles(profile, "important_in_relationship"); + const interests = selectionTitles(profile, "interest"); + const lookingFor = selectionTitles(profile, "looking_for")[0]; + const mainPhoto = profile.photos[0]; + + return ( +
+
+ {mainPhoto ? ( +
+ {/* eslint-disable-next-line @next/next/no-img-element */} + +
+ ) : ( + + )} +
+

+ {user.first_name || "بدون نام"} + {age ? `، ${age}` : ""} +

+

+ {user.phone} +

+
+
+ + {profile.photos.length === 0 && ( +
+ + بدون عکس، توی صفحه‌ی دوستیابی کمتر دیده می‌شی. همین الان یکی اضافه کن. +
+ )} + + setProfile((p) => (p ? { ...p, photos } : p))} + /> + + } title="قد و وزن" editHref="/onboarding/body-info"> +
+ + + {user.height_cm ?? "—"} سانتی‌متر + + + + {user.weight_kg ?? "—"} کیلوگرم + +
+
+ + } title="تحصیلات" editHref="/onboarding/education"> +

+ {education ?? "—"} {fieldOfStudy ? `· ${fieldOfStudy}` : ""} +

+
+ + } title="فعالیت‌ها" editHref="/onboarding/occupations"> +
+ {occupations.length ? ( + occupations.map((t) => ) + ) : ( + — + )} +
+
+ + } + title="توی رابطه برام مهمه" + editHref="/onboarding/relationship-importance" + > +
+ {importance.length ? ( + importance.map((t) => ) + ) : ( + — + )} +
+
+ + } title="علاقه‌مندی‌ها" editHref="/onboarding/interests"> +
+ {interests.length ? ( + interests.map((t) => ) + ) : ( + — + )} +
+
+ + } title="دنبال چی می‌گردم" editHref="/onboarding/looking-for"> +

{lookingFor ?? "—"}

+
+ + {profile.profile_answers.length > 0 && ( + } title="یکم از خودم" editHref="/onboarding/profile-questions"> +
+ {profile.profile_answers.map((a) => ( +
+

+ {a.question?.text} +

+

{a.answer}

+
+ ))} +
+
+ )} +
+ ); +} diff --git a/src/app/(main)/settings/page.tsx b/src/app/(main)/settings/page.tsx new file mode 100644 index 0000000..6cbdf2d --- /dev/null +++ b/src/app/(main)/settings/page.tsx @@ -0,0 +1,75 @@ +"use client"; + +import { useRouter } from "next/navigation"; +import { Bell, Shield, HelpCircle, LogOut, ChevronLeft } from "lucide-react"; +import { Card } from "@/components/ui/Card"; +import { Badge } from "@/components/ui/Badge"; +import { Button } from "@/components/ui/Button"; +import { useAuth } from "@/lib/auth-context"; + +const comingSoonItems = [ + { icon: Bell, label: "اعلان‌ها" }, + { icon: Shield, label: "حریم خصوصی و امنیت" }, + { icon: HelpCircle, label: "راهنما و پشتیبانی" }, +]; + +export default function SettingsPage() { + const router = useRouter(); + const { user, logout } = useAuth(); + + function handleLogout() { + logout(); + router.push("/login"); + } + + return ( +
+

+ تنظیمات ⚙️ +

+ + +
+

شماره موبایل

+

+ {user?.phone} +

+
+
+ + + {comingSoonItems.map((item, i) => { + const Icon = item.icon; + return ( + + ); + })} + + + +
+ ); +} diff --git a/src/app/favicon.ico b/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7e626a114ad100f5a233605620d185babe4bd20e GIT binary patch literal 911 zcmV;A191F_P)=tJ z{LYzk&hPvP*%avS*iDDLlXTFtKnL7WI^YKFZvpLV2JLAEz0d@y+Xd--BcyW;kj^?G zb=5;WQxEa917c?##Ex2sr)nUatcK8D1>r;$__oT3;HwC7zKU^pYIbcllYxsq4;}J` zWWN{kpa*8*LR%$-Ry%lK1$b{cIFD_GYbk9}<9;vw-#G6n1MjwhYqn9&wUz`{r#-Y& zINxFe*HjADWnG5Dnn9@FJCQc7JgM;Z>XbO=DgoDM1?McjPN?6rxD`%sjY1B-0U}`} zA{vJL?lq*#y-8fW)C2l9u<@Hn2y{LGaePD{Z#WLtSrjC?t9`%=S@~1FU>Qi0BM>J? z67PCJ124e0RcYYGU>t>EqBnARaUQ8c{{1WQqzXFsN`lqXmDPIv$X{vTB{vQ-1G$GSVV<0H5L%nR_k_|j<04QgH=AkCY-6x z2hloY5RI7chgMWLQcwGeQ0_D;)6RXoU!MEXrAqT zzAXha0G9k^*7$5x1 z-IRE&4bo%(?`)T1Z>p>7B*C=H#gHnB&QV92^(#B)ON&;!(>-Ah18wTPr zHO?~NM~4mJv7!SYM)37|&iOkb|5(~sZ{NRy>uooT#|rm@B$@^Tc(SCr?T`X5A) { + return ( + + + +
+ {children} +
+
+ + + + ); +} diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx new file mode 100644 index 0000000..56d7169 --- /dev/null +++ b/src/app/login/page.tsx @@ -0,0 +1,100 @@ +"use client"; + +import { useState, useEffect } from "react"; +import { useRouter } from "next/navigation"; +import { ChevronRight, Smartphone } from "lucide-react"; +import { Button } from "@/components/ui/Button"; +import { ErrorBanner } from "@/components/ui/ErrorBanner"; +import { requestOtp } from "@/lib/api"; +import { formatApiError } from "@/lib/hooks"; +import { useAuth } from "@/lib/auth-context"; + +const PHONE_REGEX = /^09\d{9}$/; + +export default function LoginPage() { + const router = useRouter(); + const { status } = useAuth(); + const [phone, setPhone] = useState(""); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + useEffect(() => { + if (status === "authenticated") { + router.replace("/home"); + } + }, [status, router]); + + const isValid = PHONE_REGEX.test(phone); + + async function handleSubmit() { + if (!isValid) return; + setLoading(true); + setError(null); + try { + await requestOtp(phone); + router.push(`/verify?phone=${phone}`); + } catch (err) { + setError(formatApiError(err)); + } finally { + setLoading(false); + } + } + + return ( +
+ + +
+

+ شماره موبایلت 📱 +

+

+ شماره موبایل معتبرت رو وارد کن؛ یه کد ۴ رقمی برات می‌فرستیم تا حسابت رو تایید کنیم. +

+
+ +
+
+
+ 🇮🇷 + +98 +
+
+ + setPhone(e.target.value.replace(/\D/g, "").slice(0, 11))} + onKeyDown={(e) => e.key === "Enter" && handleSubmit()} + autoFocus + /> +
+
+ +
+ +
+ +

+ با ادامه دادن، قوانین و حریم خصوصی دلدل رو قبول می‌کنی. +

+
+
+ ); +} diff --git a/src/app/onboarding/[slug]/page.tsx b/src/app/onboarding/[slug]/page.tsx new file mode 100644 index 0000000..5f62f33 --- /dev/null +++ b/src/app/onboarding/[slug]/page.tsx @@ -0,0 +1,172 @@ +"use client"; + +import { useEffect, useState, useCallback } from "react"; +import { useParams, useRouter } from "next/navigation"; +import { useAuth } from "@/lib/auth-context"; +import { useRequireAuth } from "@/lib/hooks"; +import { FullScreenLoader } from "@/components/ui/FullScreenLoader"; +import { OnboardingScreen } from "@/components/onboarding/OnboardingScreen"; +import { BasicInfoStep } from "@/components/onboarding/steps/BasicInfoStep"; +import { BodyInfoStep } from "@/components/onboarding/steps/BodyInfoStep"; +import { ProfileQuestionsStep } from "@/components/onboarding/steps/ProfileQuestionsStep"; +import { EducationStep } from "@/components/onboarding/steps/EducationStep"; +import { GenericOptionStep } from "@/components/onboarding/steps/GenericOptionStep"; +import { + stepBySlug, + nextStepSlug, +} from "@/lib/onboarding-steps"; +import { getProfileMe, FullProfile, submitOccupations, submitRelationshipImportance, submitInterests, submitLookingFor } from "@/lib/api"; + +function slugFromKey(key: string) { + return key.replace(/_/g, "-"); +} + +export default function OnboardingStepPage() { + const params = useParams<{ slug: string }>(); + const slug = params.slug; + const router = useRouter(); + const { status } = useRequireAuth(); + const { onboardingStatus, refreshOnboardingStatus } = useAuth(); + + const [profile, setProfile] = useState(null); + const [guardChecked, setGuardChecked] = useState(false); + + const meta = stepBySlug(slug); + + const loadProfile = useCallback(async () => { + try { + const p = await getProfileMe(); + setProfile(p); + } catch { + // اگه خطا خورد، فرم‌ها بدون prefill نمایش داده می‌شن + } + }, []); + + useEffect(() => { + if (status !== "authenticated" || !meta) return; + + let cancelled = false; + + (async () => { + const s = onboardingStatus ?? (await refreshOnboardingStatus()); + if (cancelled) return; + + if (!s) { + setGuardChecked(true); + return; + } + + const currentOrder = + s.steps.find((st) => st.key === s.current_step_key)?.step ?? meta.order; + + // اگه هنوز onboarded نشده و می‌خواد از مرحله‌ی فعلی جلوتر بره، برش‌گردون + if (!s.is_onboarded && meta.order > currentOrder) { + const correctSlug = s.steps.find((st) => st.step === currentOrder); + router.replace(`/onboarding/${correctSlug ? slugFromKey(correctSlug.key) : ""}`); + return; + } + + await loadProfile(); + setGuardChecked(true); + })(); + + return () => { + cancelled = true; + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [status, slug]); + + const goNext = useCallback(async () => { + await refreshOnboardingStatus(); + const next = nextStepSlug(slug); + if (next) { + router.push(`/onboarding/${next}`); + } else { + router.push("/onboarding/done"); + } + }, [slug, router, refreshOnboardingStatus]); + + if (status !== "authenticated" || !meta || !guardChecked) { + return ; + } + + return ( + router.push("/login") : undefined} + > + {renderStep(slug, profile, goNext)} + + ); +} + +function renderStep(slug: string, profile: FullProfile | null, onNext: () => void) { + switch (slug) { + case "basic-info": + return ; + case "body-info": + return ; + case "profile-questions": + return ; + case "education": + return ; + case "occupations": + return ( + + ); + case "relationship-importance": + return ( + + ); + case "interests": + return ( + + ); + case "looking-for": + return ( + + ); + default: + return null; + } +} diff --git a/src/app/onboarding/done/page.tsx b/src/app/onboarding/done/page.tsx new file mode 100644 index 0000000..c42e115 --- /dev/null +++ b/src/app/onboarding/done/page.tsx @@ -0,0 +1,56 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { useRouter } from "next/navigation"; +import { PartyPopper } from "lucide-react"; +import { Button } from "@/components/ui/Button"; +import { FullScreenLoader } from "@/components/ui/FullScreenLoader"; +import { useAuth } from "@/lib/auth-context"; +import { useRequireAuth } from "@/lib/hooks"; + +export default function OnboardingDonePage() { + const router = useRouter(); + const { status } = useRequireAuth(); + const { onboardingStatus, refreshOnboardingStatus, refreshUser } = useAuth(); + const [checked, setChecked] = useState(false); + + useEffect(() => { + if (status !== "authenticated") return; + (async () => { + const s = onboardingStatus ?? (await refreshOnboardingStatus()); + if (!s?.is_onboarded) { + router.replace("/onboarding/basic-info"); + return; + } + // user توی context از قبل onboarding ممکنه هنوز is_onboarded=false داشته باشه + // (هیچ مرحله‌ای توی خود فرآیند onboarding این رو رفرش نمی‌کنه)؛ بدون این، + // MainLayout با state قدیمی دوباره برمی‌گردونه به یکی از مراحل onboarding. + await refreshUser(); + setChecked(true); + })(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [status]); + + if (status !== "authenticated" || !checked) return ; + + return ( +
+
+ +
+
+

+ پروفایلت کامل شد! 🎉 +

+

+ پروفایلت رفت برای بررسی ادمین. به‌محض تایید، خودکار می‌تونی افراد جدید رو + کشف کنی. هر وقت خواستی هم می‌تونی از پروفایلت هرکدوم از این اطلاعات رو + ویرایش کنی. +

+
+ +
+ ); +} diff --git a/src/app/page.tsx b/src/app/page.tsx new file mode 100644 index 0000000..0147787 --- /dev/null +++ b/src/app/page.tsx @@ -0,0 +1,30 @@ +"use client"; + +import { useEffect } from "react"; +import { useRouter } from "next/navigation"; +import { useAuth } from "@/lib/auth-context"; +import { FullScreenLoader } from "@/components/ui/FullScreenLoader"; +import { stepByOrder } from "@/lib/onboarding-steps"; + +export default function RootPage() { + const router = useRouter(); + const { status, user } = useAuth(); + + useEffect(() => { + if (status === "loading") return; + if (status === "guest") { + router.replace("/welcome"); + return; + } + if (user) { + if (user.is_onboarded) { + router.replace("/home"); + } else { + const slug = stepByOrder(user.current_step)?.slug ?? "basic-info"; + router.replace(`/onboarding/${slug}`); + } + } + }, [status, user, router]); + + return ; +} diff --git a/src/app/verify/page.tsx b/src/app/verify/page.tsx new file mode 100644 index 0000000..7b930f5 --- /dev/null +++ b/src/app/verify/page.tsx @@ -0,0 +1,145 @@ +"use client"; + +import { Suspense, useEffect, useState } from "react"; +import { useRouter, useSearchParams } from "next/navigation"; +import { ChevronRight } from "lucide-react"; +import { Button } from "@/components/ui/Button"; +import { OtpInput } from "@/components/ui/OtpInput"; +import { ErrorBanner } from "@/components/ui/ErrorBanner"; +import { requestOtp } from "@/lib/api"; +import { formatApiError } from "@/lib/hooks"; +import { useAuth } from "@/lib/auth-context"; +import { stepByOrder } from "@/lib/onboarding-steps"; + +const RESEND_SECONDS = 60; + +function formatCountdown(seconds: number) { + const m = Math.floor(seconds / 60); + const s = seconds % 60; + return `${String(m).padStart(2, "0")}:${String(s).padStart(2, "0")}`; +} + +function VerifyForm() { + const router = useRouter(); + const searchParams = useSearchParams(); + const phone = searchParams.get("phone") ?? ""; + const { login } = useAuth(); + + const [otp, setOtp] = useState(""); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const [countdown, setCountdown] = useState(RESEND_SECONDS); + const [resending, setResending] = useState(false); + + useEffect(() => { + if (countdown <= 0) return; + const t = setTimeout(() => setCountdown((c) => c - 1), 1000); + return () => clearTimeout(t); + }, [countdown]); + + useEffect(() => { + if (!phone) router.replace("/login"); + }, [phone, router]); + + async function handleVerify(code: string) { + if (code.length !== 4) return; + setLoading(true); + setError(null); + try { + const user = await login(phone, code); + if (user.is_onboarded) { + router.push("/home"); + } else { + const stepSlug = stepByOrder(user.current_step)?.slug ?? "basic-info"; + router.push(`/onboarding/${stepSlug}`); + } + } catch (err) { + setError(formatApiError(err, "کد وارد شده اشتباهه")); + setOtp(""); + } finally { + setLoading(false); + } + } + + async function handleResend() { + setResending(true); + setError(null); + try { + await requestOtp(phone); + setCountdown(RESEND_SECONDS); + } catch (err) { + setError(formatApiError(err)); + } finally { + setResending(false); + } + } + + return ( +
+ + +
+ 0 ? "text-(--color-brand-500)" : "text-(--color-content-disabled)" + }`} + > + {formatCountdown(countdown)} + +

+ کد تایید رو وارد کن +

+

+ کد ۴ رقمی ارسال‌شده به{" "} + + {phone} + +

+
+ +
+ + + + +
+ کد نیومد؟ + {countdown > 0 ? ( + صبر کن... + ) : ( + + )} +
+
+
+ ); +} + +export default function VerifyPage() { + return ( + + + + ); +} diff --git a/src/app/welcome/page.tsx b/src/app/welcome/page.tsx new file mode 100644 index 0000000..78b2a19 --- /dev/null +++ b/src/app/welcome/page.tsx @@ -0,0 +1,128 @@ +"use client"; + +import { useEffect, useRef, useState } from "react"; +import { useRouter } from "next/navigation"; +import { motion } from "framer-motion"; +import { ShieldCheck, Sparkles, Heart } from "lucide-react"; +import { Button } from "@/components/ui/Button"; +import { cn } from "@/lib/utils"; + +interface Slide { + icon: React.ReactNode; + gradient: string; + title: string; + description: string; +} + +const SLIDES: Slide[] = [ + { + icon: , + gradient: "linear-gradient(160deg, #ff8ca3 0%, #ff4d6d 55%, #d81b47 100%)", + title: "پروفایل‌های تایید شده", + description: + "قبل از این‌که کسی وارد بخش دوستیابی بشه، تیم دلدل پروفایلش رو بررسی می‌کنه؛ یعنی خبری از ربات و پروفایل‌های تقلبی نیست.", + }, + { + icon: , + gradient: "linear-gradient(160deg, #ffc93c 0%, #ff8ca3 55%, #ff4d6d 100%)", + title: "مچ‌های واقعی", + description: + "بر اساس علاقه‌مندی‌ها، سبک زندگی و چیزهایی که برات مهمه، با آدم‌های مناسب‌تر آشنا می‌شی.", + }, + { + icon: , + gradient: "linear-gradient(160deg, #8b5cf6 0%, #ff4d6d 55%, #ff8ca3 100%)", + title: "دوستیابی، ساده و امن", + description: + "یکی‌یکی پروفایل‌ها رو ببین، اگه خوشت اومد لایک کن، نه که نه؛ همه‌چیز دست خودته.", + }, +]; + +export default function WelcomePage() { + const router = useRouter(); + const scrollerRef = useRef(null); + const [active, setActive] = useState(0); + + useEffect(() => { + const el = scrollerRef.current; + if (!el) return; + function onScroll() { + if (!el) return; + const index = Math.round(el.scrollLeft / el.clientWidth); + setActive((prev) => (prev === index ? prev : index)); + } + el.addEventListener("scroll", onScroll, { passive: true }); + return () => el.removeEventListener("scroll", onScroll); + }, []); + + function goToSlide(index: number) { + const el = scrollerRef.current; + if (!el) return; + el.scrollTo({ left: index * el.clientWidth, behavior: "smooth" }); + } + + return ( +
+
+ {SLIDES.map((slide, i) => ( +
+ + {slide.icon} + + +
+

+ {slide.title} +

+

+ {slide.description} +

+
+
+ ))} +
+ +
+
+ {SLIDES.map((_, i) => ( +
+ + + +
+
+ ); +} diff --git a/src/components/BottomNav.tsx b/src/components/BottomNav.tsx new file mode 100644 index 0000000..ceef700 --- /dev/null +++ b/src/components/BottomNav.tsx @@ -0,0 +1,56 @@ +"use client"; + +import Link from "next/link"; +import { usePathname } from "next/navigation"; +import { Flame, MessageCircle, User, Settings } from "lucide-react"; +import { cn } from "@/lib/utils"; + +const items = [ + { href: "/home", label: "کشف", icon: Flame }, + { href: "/messages", label: "پیام‌ها", icon: MessageCircle }, + { href: "/profile", label: "پروفایل", icon: User }, + { href: "/settings", label: "تنظیمات", icon: Settings }, +]; + +export function BottomNav() { + const pathname = usePathname(); + + return ( + + ); +} diff --git a/src/components/ServiceWorkerRegister.tsx b/src/components/ServiceWorkerRegister.tsx new file mode 100644 index 0000000..4de2d2b --- /dev/null +++ b/src/components/ServiceWorkerRegister.tsx @@ -0,0 +1,14 @@ +"use client"; + +import { useEffect } from "react"; + +export function ServiceWorkerRegister() { + useEffect(() => { + if ("serviceWorker" in navigator) { + navigator.serviceWorker.register("/sw.js").catch(() => { + // نصب PWA اختیاریه؛ اگه شکست خورد اپ عادی کار می‌کنه + }); + } + }, []); + return null; +} diff --git a/src/components/discover/FiltersSheet.tsx b/src/components/discover/FiltersSheet.tsx new file mode 100644 index 0000000..f6ecf3c --- /dev/null +++ b/src/components/discover/FiltersSheet.tsx @@ -0,0 +1,123 @@ +"use client"; + +import { useState } from "react"; +import { motion, AnimatePresence } from "framer-motion"; +import { X } from "lucide-react"; +import { Button } from "@/components/ui/Button"; + +export interface DiscoverFilters { + maxDistance: number; + minAge: number; + maxAge: number; +} + +export function FiltersSheet({ + open, + initial, + onClose, + onApply, +}: { + open: boolean; + initial: DiscoverFilters; + onClose: () => void; + onApply: (filters: DiscoverFilters) => void; +}) { + const [maxDistance, setMaxDistance] = useState(initial.maxDistance); + const [minAge, setMinAge] = useState(initial.minAge); + const [maxAge, setMaxAge] = useState(initial.maxAge); + + return ( + + {open && ( + <> + + +
+

فیلترها

+ +
+ +
+
+
+ + حداکثر فاصله + + + {maxDistance} کیلومتر + +
+ setMaxDistance(Number(e.target.value))} + className="w-full accent-(--color-brand-500)" + /> +
+ +
+
+ + محدوده‌ی سنی + + + {minAge} تا {maxAge} سال + +
+
+ setMinAge(Math.min(Number(e.target.value), maxAge))} + className="w-full accent-(--color-brand-500)" + /> + setMaxAge(Math.max(Number(e.target.value), minAge))} + className="w-full accent-(--color-brand-500)" + /> +
+
+
+ + +
+ + )} +
+ ); +} diff --git a/src/components/discover/MatchModal.tsx b/src/components/discover/MatchModal.tsx new file mode 100644 index 0000000..baa5252 --- /dev/null +++ b/src/components/discover/MatchModal.tsx @@ -0,0 +1,86 @@ +"use client"; + +import { useRouter } from "next/navigation"; +import { motion, AnimatePresence } from "framer-motion"; +import { User } from "lucide-react"; +import { Button } from "@/components/ui/Button"; +import { MatchView, photoUrl } from "@/lib/api"; + +export function MatchModal({ + match, + onClose, +}: { + match: MatchView | null; + onClose: () => void; +}) { + const router = useRouter(); + const photo = match?.photos[0]; + + return ( + + {match && ( + + + {photo ? ( + // eslint-disable-next-line @next/next/no-img-element + {match.first_name} + ) : ( + + )} + + + + یه مچ جدید داری، {match.first_name}! 🎉 + + + هردوتون همدیگه رو لایک کردین. الان وقت خوبیه که یه سلام بدی. + + + + + + + + )} + + ); +} diff --git a/src/components/discover/SwipeCard.tsx b/src/components/discover/SwipeCard.tsx new file mode 100644 index 0000000..b9dc57d --- /dev/null +++ b/src/components/discover/SwipeCard.tsx @@ -0,0 +1,118 @@ +"use client"; + +import { useRouter } from "next/navigation"; +import { motion, useMotionValue, useTransform, PanInfo } from "framer-motion"; +import { MapPin, User } from "lucide-react"; +import { DiscoverCandidate, photoUrl } from "@/lib/api"; +import { formatDistance } from "@/lib/utils"; + +const SWIPE_THRESHOLD = 120; + +export function SwipeCard({ + profile, + isTop, + stackIndex, + onDecide, +}: { + profile: DiscoverCandidate; + isTop: boolean; + stackIndex: number; + onDecide: (direction: "left" | "right") => void; +}) { + const router = useRouter(); + const x = useMotionValue(0); + const rotate = useTransform(x, [-260, 260], [-16, 16]); + const likeOpacity = useTransform(x, [20, 120], [0, 1]); + const nopeOpacity = useTransform(x, [-120, -20], [1, 0]); + + function handleDragEnd(_: unknown, info: PanInfo) { + if (info.offset.x > SWIPE_THRESHOLD) { + onDecide("right"); + } else if (info.offset.x < -SWIPE_THRESHOLD) { + onDecide("left"); + } + } + + const photo = profile.photos[0]; + + return ( + 0 ? 400 : x.get() < 0 ? -400 : 0, + opacity: 0, + transition: { duration: 0.3 }, + }} + transition={{ type: "spring", stiffness: 300, damping: 30 }} + > +
isTop && router.push(`/home/${profile.id}`)} + className="relative w-full h-full rounded-(--radius-xl) overflow-hidden shadow-(--shadow-cute-lg) bg-(--color-bg-tertiary) cursor-pointer select-none" + > + {photo ? ( + // eslint-disable-next-line @next/next/no-img-element + {profile.first_name} + ) : ( +
+ +
+ )} +
+ + {isTop && ( + <> + + لایک + + + ردّ + + + )} + +
+
+

+ {profile.first_name || "بدون نام"} +

+ + {profile.age} + +
+ {profile.distance_km != null && ( +
+ + + {formatDistance(profile.distance_km)} + +
+ )} +
+
+ + ); +} diff --git a/src/components/discover/SwipeDeck.tsx b/src/components/discover/SwipeDeck.tsx new file mode 100644 index 0000000..53940a7 --- /dev/null +++ b/src/components/discover/SwipeDeck.tsx @@ -0,0 +1,122 @@ +"use client"; + +import { useState } from "react"; +import { AnimatePresence, motion } from "framer-motion"; +import { X, Heart, Star, RotateCcw } from "lucide-react"; +import { SwipeCard } from "./SwipeCard"; +import { MatchModal } from "./MatchModal"; +import { EmptyState } from "@/components/ui/EmptyState"; +import { Button } from "@/components/ui/Button"; +import { ErrorBanner } from "@/components/ui/ErrorBanner"; +import { formatApiError } from "@/lib/hooks"; +import { DiscoverCandidate, MatchView, swipe } from "@/lib/api"; + +export function SwipeDeck({ + profiles, + onReload, +}: { + profiles: DiscoverCandidate[]; + onReload: () => void; +}) { + const [deck, setDeck] = useState(profiles); + const [matched, setMatched] = useState(null); + const [error, setError] = useState(null); + const [busy, setBusy] = useState(false); + + async function decide(direction: "left" | "right", superlike = false) { + if (deck.length === 0 || busy) return; + const top = deck[0]; + setBusy(true); + setError(null); + setDeck((prev) => prev.slice(1)); + try { + const action = direction === "left" ? "pass" : superlike ? "superlike" : "like"; + const result = await swipe(top.id, action); + if (result.matched && result.match) { + setMatched(result.match); + } + } catch (err) { + setError(formatApiError(err)); + } finally { + setBusy(false); + } + } + + const visible = deck.slice(0, 3); + + return ( +
+ {error && ( +
+ +
+ )} + +
+ {visible.length === 0 ? ( +
+
+ } + title="فعلاً همه رو دیدی" + description="پروفایل جدیدی برای نشون دادن نداریم. بعداً دوباره سر بزن." + /> + +
+
+ ) : ( + + {[...visible].reverse().map((profile, idxFromEnd) => { + const stackIndex = visible.length - 1 - idxFromEnd; + return ( + + ); + })} + + )} +
+ + {visible.length > 0 && ( +
+ decide("left")} + disabled={busy} + className="w-14 h-14 rounded-full bg-white flex items-center justify-center shadow-(--shadow-float) text-(--color-status-error) disabled:opacity-50" + aria-label="رد کردن" + > + + + decide("right", true)} + disabled={busy} + className="w-9 h-9 rounded-full bg-white flex items-center justify-center shadow-(--shadow-float) text-(--color-pop-purple) disabled:opacity-50" + aria-label="سوپرلایک" + > + + + decide("right")} + disabled={busy} + className="w-16 h-16 rounded-full bg-(--color-brand-500) flex items-center justify-center shadow-(--shadow-cute-md) text-white disabled:opacity-50" + aria-label="لایک" + > + + +
+ )} + + setMatched(null)} /> +
+ ); +} diff --git a/src/components/onboarding/OnboardingScreen.tsx b/src/components/onboarding/OnboardingScreen.tsx new file mode 100644 index 0000000..c4d0f8d --- /dev/null +++ b/src/components/onboarding/OnboardingScreen.tsx @@ -0,0 +1,69 @@ +"use client"; + +import { ReactNode } from "react"; +import { useRouter } from "next/navigation"; +import { ChevronRight } from "lucide-react"; +import { ONBOARDING_STEPS } from "@/lib/onboarding-steps"; + +interface OnboardingScreenProps { + order: number; + title: string; + emoji: string; + description?: string; + children: ReactNode; + onBack?: () => void; +} + +export function OnboardingScreen({ + order, + title, + emoji, + description, + children, + onBack, +}: OnboardingScreenProps) { + const router = useRouter(); + const total = ONBOARDING_STEPS.length; + + return ( +
+
+ +
+ {ONBOARDING_STEPS.map((s) => ( +
+ ))} +
+ + {order}/{total} + +
+ +
+

+ {title} {emoji} +

+ {description && ( +

+ {description} +

+ )} +
+ +
+ {children} +
+
+ ); +} diff --git a/src/components/onboarding/steps/BasicInfoStep.tsx b/src/components/onboarding/steps/BasicInfoStep.tsx new file mode 100644 index 0000000..d3ba156 --- /dev/null +++ b/src/components/onboarding/steps/BasicInfoStep.tsx @@ -0,0 +1,87 @@ +"use client"; + +import { useState } from "react"; +import { Button } from "@/components/ui/Button"; +import { TextField } from "@/components/ui/TextField"; +import { ErrorBanner } from "@/components/ui/ErrorBanner"; +import { cn } from "@/lib/utils"; +import { submitBasicInfo, FullProfile } from "@/lib/api"; +import { formatApiError } from "@/lib/hooks"; + +export function BasicInfoStep({ + initialProfile, + onNext, +}: { + initialProfile: FullProfile | null; + onNext: () => void; +}) { + const [gender, setGender] = useState<"male" | "female" | null>( + initialProfile?.user.gender ?? null + ); + const [firstName, setFirstName] = useState(initialProfile?.user.first_name ?? ""); + const [birthDate, setBirthDate] = useState(initialProfile?.user.birth_date ?? ""); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + const isValid = gender && firstName.trim().length >= 2 && birthDate; + + async function handleSubmit() { + if (!isValid || !gender) return; + setLoading(true); + setError(null); + try { + await submitBasicInfo({ gender, first_name: firstName.trim(), birth_date: birthDate }); + onNext(); + } catch (err) { + setError(formatApiError(err)); + } finally { + setLoading(false); + } + } + + return ( +
+
+ +
+ {(["female", "male"] as const).map((g) => ( + + ))} +
+
+ + setFirstName(e.target.value)} + /> + + setBirthDate(e.target.value)} + /> + + + + +
+ ); +} diff --git a/src/components/onboarding/steps/BodyInfoStep.tsx b/src/components/onboarding/steps/BodyInfoStep.tsx new file mode 100644 index 0000000..4b0a63d --- /dev/null +++ b/src/components/onboarding/steps/BodyInfoStep.tsx @@ -0,0 +1,66 @@ +"use client"; + +import { useState } from "react"; +import { Button } from "@/components/ui/Button"; +import { TextField } from "@/components/ui/TextField"; +import { ErrorBanner } from "@/components/ui/ErrorBanner"; +import { submitBodyInfo, FullProfile } from "@/lib/api"; +import { formatApiError } from "@/lib/hooks"; + +export function BodyInfoStep({ + initialProfile, + onNext, +}: { + initialProfile: FullProfile | null; + onNext: () => void; +}) { + const [height, setHeight] = useState( + initialProfile?.user.height_cm?.toString() ?? "" + ); + const [weight, setWeight] = useState( + initialProfile?.user.weight_kg?.toString() ?? "" + ); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + const h = parseInt(height, 10); + const w = parseInt(weight, 10); + const isValid = h >= 100 && h <= 250 && w >= 30 && w <= 250; + + async function handleSubmit() { + if (!isValid) return; + setLoading(true); + setError(null); + try { + await submitBodyInfo({ height_cm: h, weight_kg: w }); + onNext(); + } catch (err) { + setError(formatApiError(err)); + } finally { + setLoading(false); + } + } + + return ( +
+ setHeight(e.target.value)} + /> + setWeight(e.target.value)} + /> + + +
+ ); +} diff --git a/src/components/onboarding/steps/EducationStep.tsx b/src/components/onboarding/steps/EducationStep.tsx new file mode 100644 index 0000000..375d613 --- /dev/null +++ b/src/components/onboarding/steps/EducationStep.tsx @@ -0,0 +1,92 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { Button } from "@/components/ui/Button"; +import { ErrorBanner } from "@/components/ui/ErrorBanner"; +import { FullScreenLoader } from "@/components/ui/FullScreenLoader"; +import { OptionPicker } from "@/components/ui/OptionPicker"; +import { getOptions, submitEducation, Option, FullProfile } from "@/lib/api"; +import { formatApiError } from "@/lib/hooks"; + +function findSelection(profile: FullProfile | null, key: string): number[] { + return profile?.selections.find((s) => s.category_key === key)?.option_ids ?? []; +} + +export function EducationStep({ + initialProfile, + onNext, +}: { + initialProfile: FullProfile | null; + onNext: () => void; +}) { + const [levelOptions, setLevelOptions] = useState(null); + const [fieldOptions, setFieldOptions] = useState(null); + const [levelId, setLevelId] = useState( + findSelection(initialProfile, "education_level") + ); + const [fieldId, setFieldId] = useState( + findSelection(initialProfile, "field_of_study") + ); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + useEffect(() => { + Promise.all([getOptions("education_level"), getOptions("field_of_study")]) + .then(([lvl, field]) => { + setLevelOptions(lvl); + setFieldOptions(field); + }) + .catch((err) => setError(formatApiError(err))); + }, []); + + const isValid = levelId.length === 1 && fieldId.length === 1; + + async function handleSubmit() { + if (!isValid) return; + setLoading(true); + setError(null); + try { + await submitEducation({ + education_level_option_id: levelId[0], + field_of_study_option_id: fieldId[0], + }); + onNext(); + } catch (err) { + setError(formatApiError(err)); + } finally { + setLoading(false); + } + } + + if (!levelOptions || !fieldOptions) return ; + + if (levelOptions.length === 0 || fieldOptions.length === 0) { + return ( + + ); + } + + return ( +
+
+ + +
+ +
+ + +
+ + + + +
+ ); +} diff --git a/src/components/onboarding/steps/GenericOptionStep.tsx b/src/components/onboarding/steps/GenericOptionStep.tsx new file mode 100644 index 0000000..1104fa1 --- /dev/null +++ b/src/components/onboarding/steps/GenericOptionStep.tsx @@ -0,0 +1,91 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { Button } from "@/components/ui/Button"; +import { ErrorBanner } from "@/components/ui/ErrorBanner"; +import { FullScreenLoader } from "@/components/ui/FullScreenLoader"; +import { OptionPicker } from "@/components/ui/OptionPicker"; +import { getOptions, CategoryKey, FullProfile } from "@/lib/api"; +import { formatApiError } from "@/lib/hooks"; + +interface GenericOptionStepProps { + initialProfile: FullProfile | null; + onNext: () => void; + category: CategoryKey; + mode: "single" | "multi"; + min: number; + max?: number; + submitFn: (ids: number[]) => Promise; + helperText?: string; + emptyMessage: string; +} + +export function GenericOptionStep({ + initialProfile, + onNext, + category, + mode, + min, + max, + submitFn, + helperText, + emptyMessage, +}: GenericOptionStepProps) { + const [options, setOptions] = useState< + Awaited> | null + >(null); + const [selectedIds, setSelectedIds] = useState( + initialProfile?.selections.find((s) => s.category_key === category)?.option_ids ?? [] + ); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + useEffect(() => { + getOptions(category) + .then(setOptions) + .catch((err) => setError(formatApiError(err))); + }, [category]); + + const isValid = selectedIds.length >= min && (max ? selectedIds.length <= max : true); + + async function handleSubmit() { + if (!isValid) return; + setLoading(true); + setError(null); + try { + await submitFn(selectedIds); + onNext(); + } catch (err) { + setError(formatApiError(err)); + } finally { + setLoading(false); + } + } + + if (!options) return ; + + if (options.length === 0) { + return ; + } + + return ( +
+ {helperText && ( +

+ {helperText} {max ? `(${selectedIds.length}/${max})` : ""} +

+ )} + + + +
+ ); +} diff --git a/src/components/onboarding/steps/ProfileQuestionsStep.tsx b/src/components/onboarding/steps/ProfileQuestionsStep.tsx new file mode 100644 index 0000000..4cf13d7 --- /dev/null +++ b/src/components/onboarding/steps/ProfileQuestionsStep.tsx @@ -0,0 +1,147 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { Button } from "@/components/ui/Button"; +import { ErrorBanner } from "@/components/ui/ErrorBanner"; +import { FullScreenLoader } from "@/components/ui/FullScreenLoader"; +import { cn } from "@/lib/utils"; +import { + getAvailableQuestions, + submitProfileQuestions, + ProfileQuestion, + FullProfile, +} from "@/lib/api"; +import { formatApiError } from "@/lib/hooks"; +import { Check } from "lucide-react"; + +const REQUIRED = 3; + +export function ProfileQuestionsStep({ + initialProfile, + onNext, +}: { + initialProfile: FullProfile | null; + onNext: () => void; +}) { + const [questions, setQuestions] = useState(null); + const [selectedIds, setSelectedIds] = useState( + initialProfile?.profile_answers.map((a) => a.question_id) ?? [] + ); + const [answers, setAnswers] = useState>(() => { + const map: Record = {}; + initialProfile?.profile_answers.forEach((a) => { + map[a.question_id] = a.answer; + }); + return map; + }); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + useEffect(() => { + getAvailableQuestions() + .then(setQuestions) + .catch((err) => setError(formatApiError(err))); + }, []); + + function toggleQuestion(id: number) { + setSelectedIds((prev) => { + if (prev.includes(id)) return prev.filter((x) => x !== id); + if (prev.length >= REQUIRED) return prev; + return [...prev, id]; + }); + } + + const allAnswered = + selectedIds.length === REQUIRED && + selectedIds.every((id) => (answers[id] ?? "").trim().length > 0); + + async function handleSubmit() { + if (!allAnswered) return; + setLoading(true); + setError(null); + try { + await submitProfileQuestions( + selectedIds.map((id) => ({ question_id: id, answer: answers[id].trim() })) + ); + onNext(); + } catch (err) { + setError(formatApiError(err)); + } finally { + setLoading(false); + } + } + + if (!questions) return ; + + return ( +
+

+ دقیقاً {REQUIRED} تا انتخاب کن ({selectedIds.length}/{REQUIRED}) +

+ +
+ {questions.map((q) => { + const selected = selectedIds.includes(q.id); + const disabled = !selected && selectedIds.length >= REQUIRED; + return ( + + ); + })} +
+ + {selectedIds.length > 0 && ( +
+ {selectedIds.map((id) => { + const q = questions.find((qq) => qq.id === id); + if (!q) return null; + return ( +
+ +