From ab99ffff3749025bdbd2706e39347da6f446798d Mon Sep 17 00:00:00 2001 From: JeonSuna Date: Thu, 8 May 2025 03:44:58 +0900 Subject: [PATCH 01/18] =?UTF-8?q?=E2=9C=A8=20feat:=20usequery+card?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sona/week6/mission1/.gitignore | 24 + sona/week6/mission1/README.md | 54 + sona/week6/mission1/eslint.config.js | 28 + sona/week6/mission1/index.html | 13 + sona/week6/mission1/package-lock.json | 3747 +++++++++++++++++ sona/week6/mission1/package.json | 38 + sona/week6/mission1/public/eye.svg | 3 + sona/week6/mission1/public/eye2.svg | 9 + sona/week6/mission1/public/eyeHalf.svg | 3 + sona/week6/mission1/public/eyeHalf2.svg | 9 + sona/week6/mission1/public/ggg-Photoroom.png | Bin 0 -> 64341 bytes sona/week6/mission1/public/profileImg.png | Bin 0 -> 1061 bytes sona/week6/mission1/src/App.css | 0 sona/week6/mission1/src/App.tsx | 26 + sona/week6/mission1/src/apis/auth.ts | 35 + sona/week6/mission1/src/apis/axios.ts | 118 + sona/week6/mission1/src/apis/lp.ts | 13 + sona/week6/mission1/src/components/Header.tsx | 32 + .../mission1/src/components/InputField.tsx | 33 + sona/week6/mission1/src/constants/key.ts | 8 + .../mission1/src/context/AuthContext.tsx | 88 + sona/week6/mission1/src/enums/common.ts | 4 + sona/week6/mission1/src/hooks/useForm.tsx | 50 + sona/week6/mission1/src/hooks/useGetLpList.ts | 45 + .../mission1/src/hooks/useLocalStorage.ts | 28 + sona/week6/mission1/src/index.css | 10 + sona/week6/mission1/src/layout/HomeLayout.tsx | 13 + .../mission1/src/layout/ProtectedLayout.tsx | 14 + sona/week6/mission1/src/main.tsx | 10 + .../src/pages/GoogleLoginRedirectPage.tsx | 26 + sona/week6/mission1/src/pages/Home.tsx | 17 + sona/week6/mission1/src/pages/Login.tsx | 97 + sona/week6/mission1/src/pages/LpCard.tsx | 31 + sona/week6/mission1/src/pages/MyPage.tsx | 44 + sona/week6/mission1/src/pages/Navbar.tsx | 20 + .../week6/mission1/src/pages/NotFoundPage.tsx | 3 + sona/week6/mission1/src/pages/SignUp.tsx | 121 + sona/week6/mission1/src/routes.tsx | 44 + sona/week6/mission1/src/types/auth.ts | 44 + sona/week6/mission1/src/types/common.ts | 25 + sona/week6/mission1/src/types/lp.ts | 29 + sona/week6/mission1/src/utils/validate.ts | 34 + sona/week6/mission1/src/vite-env.d.ts | 9 + sona/week6/mission1/tsconfig.app.json | 26 + sona/week6/mission1/tsconfig.json | 7 + sona/week6/mission1/tsconfig.node.json | 24 + sona/week6/mission1/vite.config.ts | 8 + 47 files changed, 5064 insertions(+) create mode 100644 sona/week6/mission1/.gitignore create mode 100644 sona/week6/mission1/README.md create mode 100644 sona/week6/mission1/eslint.config.js create mode 100644 sona/week6/mission1/index.html create mode 100644 sona/week6/mission1/package-lock.json create mode 100644 sona/week6/mission1/package.json create mode 100644 sona/week6/mission1/public/eye.svg create mode 100644 sona/week6/mission1/public/eye2.svg create mode 100644 sona/week6/mission1/public/eyeHalf.svg create mode 100644 sona/week6/mission1/public/eyeHalf2.svg create mode 100644 sona/week6/mission1/public/ggg-Photoroom.png create mode 100644 sona/week6/mission1/public/profileImg.png create mode 100644 sona/week6/mission1/src/App.css create mode 100644 sona/week6/mission1/src/App.tsx create mode 100644 sona/week6/mission1/src/apis/auth.ts create mode 100644 sona/week6/mission1/src/apis/axios.ts create mode 100644 sona/week6/mission1/src/apis/lp.ts create mode 100644 sona/week6/mission1/src/components/Header.tsx create mode 100644 sona/week6/mission1/src/components/InputField.tsx create mode 100644 sona/week6/mission1/src/constants/key.ts create mode 100644 sona/week6/mission1/src/context/AuthContext.tsx create mode 100644 sona/week6/mission1/src/enums/common.ts create mode 100644 sona/week6/mission1/src/hooks/useForm.tsx create mode 100644 sona/week6/mission1/src/hooks/useGetLpList.ts create mode 100644 sona/week6/mission1/src/hooks/useLocalStorage.ts create mode 100644 sona/week6/mission1/src/index.css create mode 100644 sona/week6/mission1/src/layout/HomeLayout.tsx create mode 100644 sona/week6/mission1/src/layout/ProtectedLayout.tsx create mode 100644 sona/week6/mission1/src/main.tsx create mode 100644 sona/week6/mission1/src/pages/GoogleLoginRedirectPage.tsx create mode 100644 sona/week6/mission1/src/pages/Home.tsx create mode 100644 sona/week6/mission1/src/pages/Login.tsx create mode 100644 sona/week6/mission1/src/pages/LpCard.tsx create mode 100644 sona/week6/mission1/src/pages/MyPage.tsx create mode 100644 sona/week6/mission1/src/pages/Navbar.tsx create mode 100644 sona/week6/mission1/src/pages/NotFoundPage.tsx create mode 100644 sona/week6/mission1/src/pages/SignUp.tsx create mode 100644 sona/week6/mission1/src/routes.tsx create mode 100644 sona/week6/mission1/src/types/auth.ts create mode 100644 sona/week6/mission1/src/types/common.ts create mode 100644 sona/week6/mission1/src/types/lp.ts create mode 100644 sona/week6/mission1/src/utils/validate.ts create mode 100644 sona/week6/mission1/src/vite-env.d.ts create mode 100644 sona/week6/mission1/tsconfig.app.json create mode 100644 sona/week6/mission1/tsconfig.json create mode 100644 sona/week6/mission1/tsconfig.node.json create mode 100644 sona/week6/mission1/vite.config.ts diff --git a/sona/week6/mission1/.gitignore b/sona/week6/mission1/.gitignore new file mode 100644 index 00000000..83e1c004 --- /dev/null +++ b/sona/week6/mission1/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* +.env +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/sona/week6/mission1/README.md b/sona/week6/mission1/README.md new file mode 100644 index 00000000..40ede56e --- /dev/null +++ b/sona/week6/mission1/README.md @@ -0,0 +1,54 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default tseslint.config({ + extends: [ + // Remove ...tseslint.configs.recommended and replace with this + ...tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + ...tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + ...tseslint.configs.stylisticTypeChecked, + ], + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default tseslint.config({ + plugins: { + // Add the react-x and react-dom plugins + 'react-x': reactX, + 'react-dom': reactDom, + }, + rules: { + // other rules... + // Enable its recommended typescript rules + ...reactX.configs['recommended-typescript'].rules, + ...reactDom.configs.recommended.rules, + }, +}) +``` diff --git a/sona/week6/mission1/eslint.config.js b/sona/week6/mission1/eslint.config.js new file mode 100644 index 00000000..092408a9 --- /dev/null +++ b/sona/week6/mission1/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/sona/week6/mission1/index.html b/sona/week6/mission1/index.html new file mode 100644 index 00000000..507750b2 --- /dev/null +++ b/sona/week6/mission1/index.html @@ -0,0 +1,13 @@ + + + + + + + week6-mission1 + + +
+ + + diff --git a/sona/week6/mission1/package-lock.json b/sona/week6/mission1/package-lock.json new file mode 100644 index 00000000..ec4bcb9d --- /dev/null +++ b/sona/week6/mission1/package-lock.json @@ -0,0 +1,3747 @@ +{ + "name": "ka", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ka", + "version": "0.0.0", + "dependencies": { + "@hookform/resolvers": "^5.0.1", + "@tailwindcss/vite": "^4.1.3", + "@tanstack/react-query": "^5.75.5", + "@tanstack/react-query-devtools": "^5.75.5", + "axios": "^1.8.4", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-hook-form": "^7.55.0", + "react-router-dom": "^6.30.0", + "tailwindcss": "^4.1.3", + "zod": "^3.24.3" + }, + "devDependencies": { + "@eslint/js": "^9.21.0", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react-swc": "^3.8.0", + "eslint": "^9.21.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", + "typescript": "~5.7.2", + "typescript-eslint": "^8.24.1", + "vite": "^6.2.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", + "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.24.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.24.0.tgz", + "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.13.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@hookform/resolvers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.0.1.tgz", + "integrity": "sha512-u/+Jp83luQNx9AdyW2fIPGY6Y7NG68eN2ZW8FOJYL+M0i4s49+refdJdOp/A9n9HFQtQs3HIDHQvX3ZET2o7YA==", + "license": "MIT", + "dependencies": { + "@standard-schema/utils": "^0.3.0" + }, + "peerDependencies": { + "react-hook-form": "^7.55.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@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/@remix-run/router": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", + "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.39.0.tgz", + "integrity": "sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.39.0.tgz", + "integrity": "sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz", + "integrity": "sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.39.0.tgz", + "integrity": "sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.39.0.tgz", + "integrity": "sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.39.0.tgz", + "integrity": "sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.39.0.tgz", + "integrity": "sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.39.0.tgz", + "integrity": "sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.39.0.tgz", + "integrity": "sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.39.0.tgz", + "integrity": "sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.39.0.tgz", + "integrity": "sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.39.0.tgz", + "integrity": "sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.39.0.tgz", + "integrity": "sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.39.0.tgz", + "integrity": "sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.39.0.tgz", + "integrity": "sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", + "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz", + "integrity": "sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.39.0.tgz", + "integrity": "sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.39.0.tgz", + "integrity": "sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz", + "integrity": "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "node_modules/@swc/core": { + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.18.tgz", + "integrity": "sha512-ORZxyCKKiqYt2iHdh1C7pfVR1GBjkuFOdwqZggQzaq0vt22DpGca+2JsUtkUoWQmWcct04v5+ScwgvsHuMObxA==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.21" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.11.18", + "@swc/core-darwin-x64": "1.11.18", + "@swc/core-linux-arm-gnueabihf": "1.11.18", + "@swc/core-linux-arm64-gnu": "1.11.18", + "@swc/core-linux-arm64-musl": "1.11.18", + "@swc/core-linux-x64-gnu": "1.11.18", + "@swc/core-linux-x64-musl": "1.11.18", + "@swc/core-win32-arm64-msvc": "1.11.18", + "@swc/core-win32-ia32-msvc": "1.11.18", + "@swc/core-win32-x64-msvc": "1.11.18" + }, + "peerDependencies": { + "@swc/helpers": "*" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.18.tgz", + "integrity": "sha512-K6AntdUlNMQg8aChqjeXwnVhK6d4WRZ9TgtLSTmdU0Ugll4an7QK49s9NrT7XQU91cEsVvzdr++p1bNImx0hJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.18.tgz", + "integrity": "sha512-RCRvC6Q9M5BArTvj/IzUAAYGrgxYFbTTnAtf6UX7JFq2DAn+hEwYUjmC1m0gFso9HqFU0m5QZUGfZvVmACGWUw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.18.tgz", + "integrity": "sha512-wteAKf8YKb3jOnZFm3EzuIMzzCVXMuQOLHsz1IgEOc44/gdgNXKxaYTWAowZuej7t68tf/w0cRNMc7Le414v/g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.18.tgz", + "integrity": "sha512-hY6jJYZ6PKHSBo5OATswfyKsUgsWu9+4nDcN8liYIRRgz3E0G9wk0VUTP4cFPivBFeHWTTAGz687/Nf2aQEIpw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.18.tgz", + "integrity": "sha512-slu0mlP2nucvQalttnapfpqpD/LlM9NHx9g3ofgsLzjObyMEBiX4ZysQ3y65U8Mjw71RNqtLd/ZmvxI6OmLdiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.18.tgz", + "integrity": "sha512-h9a/8PA25arMCQ9t8CE8rA1s0c77z4kCZZ7dUuUkD88yEXIrARMca1IKR7of+S3slfQrf1Zlq3Ac1Fb1HVJziQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.18.tgz", + "integrity": "sha512-0sMDJj5qUGK9QEw4lrxLxkTP/4AoKciqNzXvqbk+J9XuXN2aIv4BsR1Y7z3GwAeMFGsba2lbHLOtJlDsaqIsiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.18.tgz", + "integrity": "sha512-zGv9HnfgBcKyt54MJRWdwRNu9BuYkAFM7bx+tWtKhd37Ef7ZX20QLs9xXl5wWDXCbsOdRxXIZgXs6PEL+Pzmrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.18.tgz", + "integrity": "sha512-uBKj0S1lYv/E2ZhxHZOxSiQwoegYmzbPRpjq6eHBZDv97mu7W3K27/lsnPbvAfQ6b6rnv8BI+EsmJ7VLQBAHBQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.18.tgz", + "integrity": "sha512-8USTRcdgeFMNBgvVXl8tz6n4+9s9m+zHsfDeBT4jPgwnq2bnLBlTUlwnPwzDxfg9nUJr6RFD4xeKfWyZZRosZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.21.tgz", + "integrity": "sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.3.tgz", + "integrity": "sha512-H/6r6IPFJkCfBJZ2dKZiPJ7Ueb2wbL592+9bQEl2r73qbX6yGnmQVIfiUvDRB2YI0a3PWDrzUwkvQx1XW1bNkA==", + "license": "MIT", + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.29.2", + "tailwindcss": "4.1.3" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.3.tgz", + "integrity": "sha512-t16lpHCU7LBxDe/8dCj9ntyNpXaSTAgxWm1u2XQP5NiIu4KGSyrDJJRlK9hJ4U9yJxx0UKCVI67MJWFNll5mOQ==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.3", + "@tailwindcss/oxide-darwin-arm64": "4.1.3", + "@tailwindcss/oxide-darwin-x64": "4.1.3", + "@tailwindcss/oxide-freebsd-x64": "4.1.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.3", + "@tailwindcss/oxide-linux-x64-musl": "4.1.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.3.tgz", + "integrity": "sha512-cxklKjtNLwFl3mDYw4XpEfBY+G8ssSg9ADL4Wm6//5woi3XGqlxFsnV5Zb6v07dxw1NvEX2uoqsxO/zWQsgR+g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.3.tgz", + "integrity": "sha512-mqkf2tLR5VCrjBvuRDwzKNShRu99gCAVMkVsaEOFvv6cCjlEKXRecPu9DEnxp6STk5z+Vlbh1M5zY3nQCXMXhw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.3.tgz", + "integrity": "sha512-7sGraGaWzXvCLyxrc7d+CCpUN3fYnkkcso3rCzwUmo/LteAl2ZGCDlGvDD8Y/1D3ngxT8KgDj1DSwOnNewKhmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.3.tgz", + "integrity": "sha512-E2+PbcbzIReaAYZe997wb9rId246yDkCwAakllAWSGqe6VTg9hHle67hfH6ExjpV2LSK/siRzBUs5wVff3RW9w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.3.tgz", + "integrity": "sha512-GvfbJ8wjSSjbLFFE3UYz4Eh8i4L6GiEYqCtA8j2Zd2oXriPuom/Ah/64pg/szWycQpzRnbDiJozoxFU2oJZyfg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.3.tgz", + "integrity": "sha512-35UkuCWQTeG9BHcBQXndDOrpsnt3Pj9NVIB4CgNiKmpG8GnCNXeMczkUpOoqcOhO6Cc/mM2W7kaQ/MTEENDDXg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.3.tgz", + "integrity": "sha512-dm18aQiML5QCj9DQo7wMbt1Z2tl3Giht54uVR87a84X8qRtuXxUqnKQkRDK5B4bCOmcZ580lF9YcoMkbDYTXHQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.3.tgz", + "integrity": "sha512-LMdTmGe/NPtGOaOfV2HuO7w07jI3cflPrVq5CXl+2O93DCewADK0uW1ORNAcfu2YxDUS035eY2W38TxrsqngxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.3.tgz", + "integrity": "sha512-aalNWwIi54bbFEizwl1/XpmdDrOaCjRFQRgtbv9slWjmNPuJJTIKPHf5/XXDARc9CneW9FkSTqTbyvNecYAEGw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.3.tgz", + "integrity": "sha512-PEj7XR4OGTGoboTIAdXicKuWl4EQIjKHKuR+bFy9oYN7CFZo0eu74+70O4XuERX4yjqVZGAkCdglBODlgqcCXg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.3.tgz", + "integrity": "sha512-T8gfxECWDBENotpw3HR9SmNiHC9AOJdxs+woasRZ8Q/J4VHN0OMs7F+4yVNZ9EVN26Wv6mZbK0jv7eHYuLJLwA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.3.tgz", + "integrity": "sha512-lUI/QaDxLtlV52Lho6pu07CG9pSnRYLOPmKGIQjyHdTBagemc6HmgZxyjGAQ/5HMPrNeWBfTVIpQl0/jLXvWHQ==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.3", + "@tailwindcss/oxide": "4.1.3", + "tailwindcss": "4.1.3" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.75.5", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.75.5.tgz", + "integrity": "sha512-kPDOxtoMn2Ycycb76Givx2fi+2pzo98F9ifHL/NFiahEDpDwSVW6o12PRuQ0lQnBOunhRG5etatAhQij91M3MQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/query-devtools": { + "version": "5.74.7", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.74.7.tgz", + "integrity": "sha512-nSNlfuGdnHf4yB0S+BoNYOE1o3oAH093weAYZolIHfS2stulyA/gWfSk/9H4ZFk5mAAHb5vNqAeJOmbdcGPEQw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.75.5", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.75.5.tgz", + "integrity": "sha512-QrLCJe40BgBVlWdAdf2ZEVJ0cISOuEy/HKupId1aTKU6gPJZVhSvZpH+Si7csRflCJphzlQ77Yx6gUxGW9o0XQ==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.75.5" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@tanstack/react-query-devtools": { + "version": "5.75.5", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.75.5.tgz", + "integrity": "sha512-S31U00nJOQIbxydRH1kOwdLRaLBrda8O5QjzmgkRg60UZzPGdbI6+873Qa0YGUfPeILDbR2ukgWyg7CJQPy4iA==", + "license": "MIT", + "dependencies": { + "@tanstack/query-devtools": "5.74.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@tanstack/react-query": "^5.75.5", + "react": "^18 || ^19" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "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/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.0.tgz", + "integrity": "sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.1.tgz", + "integrity": "sha512-jFf/woGTVTjUJsl2O7hcopJ1r0upqoq/vIOoCj0yLh3RIXxWcljlpuZ+vEBRXsymD1jhfeJrlyTy/S1UW+4y1w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.1.tgz", + "integrity": "sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.29.1", + "@typescript-eslint/type-utils": "8.29.1", + "@typescript-eslint/utils": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.1.tgz", + "integrity": "sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.29.1", + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/typescript-estree": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.1.tgz", + "integrity": "sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.1.tgz", + "integrity": "sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.29.1", + "@typescript-eslint/utils": "8.29.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.1.tgz", + "integrity": "sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.1.tgz", + "integrity": "sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.1.tgz", + "integrity": "sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.29.1", + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/typescript-estree": "8.29.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.1.tgz", + "integrity": "sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.29.1", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.8.1.tgz", + "integrity": "sha512-aEUPCckHDcFyxpwFm0AIkbtv6PpUp3xTb9wYGFjtABynXjCYKkWoxX0AOK9NT9XCrdk6mBBUOeHQS+RKdcNO1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@swc/core": "^1.11.11" + }, + "peerDependencies": { + "vite": "^4 || ^5 || ^6" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/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/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" + } + }, + "node_modules/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.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.24.0.tgz", + "integrity": "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.0", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.24.0", + "@eslint/plugin-kit": "^0.2.7", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz", + "integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/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/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/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/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", + "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.2", + "lightningcss-darwin-x64": "1.29.2", + "lightningcss-freebsd-x64": "1.29.2", + "lightningcss-linux-arm-gnueabihf": "1.29.2", + "lightningcss-linux-arm64-gnu": "1.29.2", + "lightningcss-linux-arm64-musl": "1.29.2", + "lightningcss-linux-x64-gnu": "1.29.2", + "lightningcss-linux-x64-musl": "1.29.2", + "lightningcss-win32-arm64-msvc": "1.29.2", + "lightningcss-win32-x64-msvc": "1.29.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", + "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", + "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", + "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", + "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", + "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", + "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.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/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-hook-form": { + "version": "7.55.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.55.0.tgz", + "integrity": "sha512-XRnjsH3GVMQz1moZTW53MxfoWN7aDpUg/GpVNc4A3eXRVNdGXfbzJ4vM4aLQ8g6XCUh1nIbx70aaNCl7kxnjog==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-router": { + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.0.tgz", + "integrity": "sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.0.tgz", + "integrity": "sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.0", + "react-router": "6.30.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.39.0.tgz", + "integrity": "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.39.0", + "@rollup/rollup-android-arm64": "4.39.0", + "@rollup/rollup-darwin-arm64": "4.39.0", + "@rollup/rollup-darwin-x64": "4.39.0", + "@rollup/rollup-freebsd-arm64": "4.39.0", + "@rollup/rollup-freebsd-x64": "4.39.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.39.0", + "@rollup/rollup-linux-arm-musleabihf": "4.39.0", + "@rollup/rollup-linux-arm64-gnu": "4.39.0", + "@rollup/rollup-linux-arm64-musl": "4.39.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.39.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-musl": "4.39.0", + "@rollup/rollup-linux-s390x-gnu": "4.39.0", + "@rollup/rollup-linux-x64-gnu": "4.39.0", + "@rollup/rollup-linux-x64-musl": "4.39.0", + "@rollup/rollup-win32-arm64-msvc": "4.39.0", + "@rollup/rollup-win32-ia32-msvc": "4.39.0", + "@rollup/rollup-win32-x64-msvc": "4.39.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.3.tgz", + "integrity": "sha512-2Q+rw9vy1WFXu5cIxlvsabCwhU2qUwodGq03ODhLJ0jW4ek5BUtoCsnLB0qG+m8AHgEsSJcJGDSDe06FXlP74g==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.29.1.tgz", + "integrity": "sha512-f8cDkvndhbQMPcysk6CUSGBWV+g1utqdn71P5YKwMumVMOG/5k7cHq0KyG4O52nB0oKS4aN2Tp5+wB4APJGC+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.29.1", + "@typescript-eslint/parser": "8.29.1", + "@typescript-eslint/utils": "8.29.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.5.tgz", + "integrity": "sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.24.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz", + "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/sona/week6/mission1/package.json b/sona/week6/mission1/package.json new file mode 100644 index 00000000..9823402c --- /dev/null +++ b/sona/week6/mission1/package.json @@ -0,0 +1,38 @@ +{ + "name": "ka", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@hookform/resolvers": "^5.0.1", + "@tailwindcss/vite": "^4.1.3", + "@tanstack/react-query": "^5.75.5", + "@tanstack/react-query-devtools": "^5.75.5", + "axios": "^1.8.4", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-hook-form": "^7.55.0", + "react-router-dom": "^6.30.0", + "tailwindcss": "^4.1.3", + "zod": "^3.24.3" + }, + "devDependencies": { + "@eslint/js": "^9.21.0", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react-swc": "^3.8.0", + "eslint": "^9.21.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^15.15.0", + "typescript": "~5.7.2", + "typescript-eslint": "^8.24.1", + "vite": "^6.2.0" + } +} diff --git a/sona/week6/mission1/public/eye.svg b/sona/week6/mission1/public/eye.svg new file mode 100644 index 00000000..1685de8e --- /dev/null +++ b/sona/week6/mission1/public/eye.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/sona/week6/mission1/public/eye2.svg b/sona/week6/mission1/public/eye2.svg new file mode 100644 index 00000000..b4eda2ee --- /dev/null +++ b/sona/week6/mission1/public/eye2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/sona/week6/mission1/public/eyeHalf.svg b/sona/week6/mission1/public/eyeHalf.svg new file mode 100644 index 00000000..59cadacb --- /dev/null +++ b/sona/week6/mission1/public/eyeHalf.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/sona/week6/mission1/public/eyeHalf2.svg b/sona/week6/mission1/public/eyeHalf2.svg new file mode 100644 index 00000000..f28a202b --- /dev/null +++ b/sona/week6/mission1/public/eyeHalf2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/sona/week6/mission1/public/ggg-Photoroom.png b/sona/week6/mission1/public/ggg-Photoroom.png new file mode 100644 index 0000000000000000000000000000000000000000..52b7f4bdd5a03027b2b92f7dadcd7832fd9d2dc0 GIT binary patch literal 64341 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 YXXX8Xxg?`WG~h>FSw{)1U>*K{07S*Q-2eap literal 0 HcmV?d00001 diff --git a/sona/week6/mission1/public/profileImg.png b/sona/week6/mission1/public/profileImg.png new file mode 100644 index 0000000000000000000000000000000000000000..e9776efacaf8620c12e52876d233ce852588e659 GIT binary patch literal 1061 zcmex=rn zUe%mr@c#gVAP2)9h7-(;N(@YbjLd?J|Bo<80UgN92y!YMFfp^TFtP*Xv;-I#m>8Lu zxPS_vvW!g3EP{%KB1(qFj!uC^jT4Q65;qD1)r!ECz|8@P3c@rZL~k+hFaymMWENzw zXZTeBm%wCvQ%Wmq-FoTi_UU;EOG>`z?A!X==~m3vPw!8N^rxw*XI7wU(LLC7b9p=0 z@tno&GEYy6_D@@?EwUzT;}!?yZc#(`FuR&y1_l2hV& z(buM1@`ZRBZEidl^IY>s0oho-zr1G0%|C8l8aL1Epr1EbO6Jz9{6781;mpB-(hv5l zMIfs;HTk@ct0>~xh5I$d{!+UfKysq5)N{n2oGyR8ew)Se-Z{w18Rp4M?pBGii<+_} zZe!NDk2{UM=J$)$)qFc^ zQxRsZAb56C(UaN!hfoY-fzJ zQ~s{}u26Dk-_&1Dx8`j7oO{x)b@I36cjj`dzxChAZgb|$dwp43ZuPZw7q?9}sZ6T$ z&=A_H>wjvq%tHaVRg9OHUH0?a`Xl%+Ys7~8I$x99*X%CLG`!rq>+;{&h^`|pZWs9- zIy!n6fORk>shLfcESd5C*xty0`i#@3^M3S?vZy+=ZSNvoVPWYbJ4&rGk6&9ZRp0Oo zVgviu&aI1-w>g$g=l`3#=bz#2zZu6lZV4XsIPS5gLIvRpo8(M}^sEj48BX0k{@8Z@ zQQn*_JyT|#@7B6#y5-2X12!O)>|t%QpUgg=nt1Bs#qbwT8Q}_S? literal 0 HcmV?d00001 diff --git a/sona/week6/mission1/src/App.css b/sona/week6/mission1/src/App.css new file mode 100644 index 00000000..e69de29b diff --git a/sona/week6/mission1/src/App.tsx b/sona/week6/mission1/src/App.tsx new file mode 100644 index 00000000..23386e27 --- /dev/null +++ b/sona/week6/mission1/src/App.tsx @@ -0,0 +1,26 @@ +import { RouterProvider } from "react-router-dom"; +import "./App.css"; +import router from "./routes"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { AuthProvider } from "./context/AuthContext"; +// import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; + +export const client = new QueryClient(); + +function App() { + return ( + + +
+ +
+
+ {/* {import.meta.env.DEV && } */} +
+ ); +} + +export default App; diff --git a/sona/week6/mission1/src/apis/auth.ts b/sona/week6/mission1/src/apis/auth.ts new file mode 100644 index 00000000..e1b268c5 --- /dev/null +++ b/sona/week6/mission1/src/apis/auth.ts @@ -0,0 +1,35 @@ +import { + RequesetSignupDto, + RequestSigninDto, + ResponseMyInfoDto, + ResponseSigninDto, + ResponseSignupDto, +} from "../types/auth"; +import axiosInstance from "./axios"; + +// 회원가입 +export const postSignup = async ( + body: RequesetSignupDto +): Promise => { + const { data } = await axiosInstance.post(`/v1/auth/signup`, body); + return data; +}; + +//로그인 +export const postSignin = async ( + body: RequestSigninDto +): Promise => { + const { data } = await axiosInstance.post("/v1/auth/signin", body); + return data; +}; + +//로그아웃 +export const postLogout = async () => { + const { data } = await axiosInstance.post("/v1/auth/signout"); + return data; +}; + +export const getmyInfo = async (): Promise => { + const { data } = await axiosInstance.get("/v1/users/me"); + return data; +}; diff --git a/sona/week6/mission1/src/apis/axios.ts b/sona/week6/mission1/src/apis/axios.ts new file mode 100644 index 00000000..6e8a0856 --- /dev/null +++ b/sona/week6/mission1/src/apis/axios.ts @@ -0,0 +1,118 @@ +import axios, { InternalAxiosRequestConfig } from "axios"; +import useLocalStorage from "../hooks/useLocalStorage"; +import { LOCAL_STORAGE_KEY } from "../constants/key"; + +interface CustomInternalAxiosRequestConfig extends InternalAxiosRequestConfig { + _retry?: boolean; +} + +let refreshPromise: Promise | null = null; +const axiosInstance = axios.create({ + baseURL: import.meta.env.VITE_SERVER_API_URL, + headers: { + Authorization: `Bearer ${localStorage.getItem("accessToken")}`, + }, +}); +//요청 인터셉터 +//모든 요청 전에 accessToken을 Authorization 헤더에 추가한다. +axiosInstance.interceptors.request.use( + (config) => { + const { getItem } = useLocalStorage(LOCAL_STORAGE_KEY.accessToken); + const accesstoken = getItem(); + //accessToken이 존재하면 authorizatoin 헤더에 bearer토큰 형식으로 추가한다. + if (accesstoken) { + config.headers = config.headers || {}; + config.headers.Authorization = `Bearer ${accesstoken}`; + } + return config; + }, + //요청 인터셉터가 실패하면 에러 + (error) => Promise.reject(error) +); + +axiosInstance.interceptors.response.use( + (response) => response, + async (e) => { + const originalRequest: CustomInternalAxiosRequestConfig = e.config; + + if (e.response && e.response.status === 401 && !originalRequest._retry) { + originalRequest._retry = true; + + // refresh 실패 =>로그아웃, + if (originalRequest.url === "/v1/auth/refresh") { + const { removeItem: removeAccessToken } = useLocalStorage( + LOCAL_STORAGE_KEY.accessToken + ); + const { removeItem: removeRefreshToken } = useLocalStorage( + LOCAL_STORAGE_KEY.refreshToken + ); + removeAccessToken(); + removeRefreshToken(); + window.location.href = "/login"; + return Promise.reject(e); + } + + if (!refreshPromise) { + refreshPromise = (async () => { + const { getItem: getRefreshToken } = useLocalStorage( + LOCAL_STORAGE_KEY.refreshToken + ); + const refreshToken = getRefreshToken(); + + if (!refreshToken) { + const { removeItem: removeAccessToken } = useLocalStorage( + LOCAL_STORAGE_KEY.accessToken + ); + const { removeItem: removeRefreshToken } = useLocalStorage( + LOCAL_STORAGE_KEY.refreshToken + ); + removeAccessToken(); + removeRefreshToken(); + window.location.href = "/login"; + throw new Error("No refresh token"); + } + + const { data } = await axiosInstance.post("/v1/auth/refresh", { + refresh: refreshToken, + }); + + const { setItem: setAccessToken } = useLocalStorage( + LOCAL_STORAGE_KEY.accessToken + ); + const { setItem: setRefreshToken } = useLocalStorage( + LOCAL_STORAGE_KEY.refreshToken + ); + + setAccessToken(data.data.accessToken); + setRefreshToken(data.data.refreshToken); + + return data.data.accessToken; + })() + .catch((error) => { + const { removeItem: removeAccessToken } = useLocalStorage( + LOCAL_STORAGE_KEY.accessToken + ); + const { removeItem: removeRefreshToken } = useLocalStorage( + LOCAL_STORAGE_KEY.refreshToken + ); + removeAccessToken(); + removeRefreshToken(); + window.location.href = "/login"; + return Promise.reject(error); + }) + .finally(() => { + refreshPromise = null; + }); + } + + return refreshPromise.then((newAccessToken) => { + originalRequest.headers["Authorization"] = `Bearer${newAccessToken}`; + return axiosInstance.request(originalRequest); + }); + } + + return Promise.reject(e); + } +); + +export default axiosInstance; diff --git a/sona/week6/mission1/src/apis/lp.ts b/sona/week6/mission1/src/apis/lp.ts new file mode 100644 index 00000000..ab3b4e8d --- /dev/null +++ b/sona/week6/mission1/src/apis/lp.ts @@ -0,0 +1,13 @@ +import { PageDto } from "../types/common"; +import { ResponseLpListDto } from "../types/lp"; +import axiosInstance from "./axios"; + +// getLpList.ts +export const getLpList = async ( + pageDto: PageDto +): Promise => { + const { data } = await axiosInstance.get("/v1/lps", { + params: pageDto, + }); + return data; +}; diff --git a/sona/week6/mission1/src/components/Header.tsx b/sona/week6/mission1/src/components/Header.tsx new file mode 100644 index 00000000..16702696 --- /dev/null +++ b/sona/week6/mission1/src/components/Header.tsx @@ -0,0 +1,32 @@ +import { useMatch, useNavigate } from "react-router-dom"; + +export default function Header() { + const navigate = useNavigate(); + const signup = useMatch("/signup"); + const login = useMatch("/login"); + const my = useMatch("/my"); + const titles = [ + { match: login, title: "로그인" }, + { match: signup, title: "회원가입" }, + ]; + + const headerMatch = login || signup || my; + const getTitle = () => { + // match가 null이 아닌 것의 title을 반환, null이면 undefined + const matchedTitle = titles.find(({ match }) => match)?.title; + return matchedTitle; + }; + if (headerMatch) { + return ( + <> +
adsasd
+
+

navigate(-1)}> + {"<"} +

+

{getTitle()}

+
+ + ); + } +} diff --git a/sona/week6/mission1/src/components/InputField.tsx b/sona/week6/mission1/src/components/InputField.tsx new file mode 100644 index 00000000..f2ea4047 --- /dev/null +++ b/sona/week6/mission1/src/components/InputField.tsx @@ -0,0 +1,33 @@ +type TInputField = { + placeholder?: string; + errorMsg?: string; + register?: object; + className?: string; + type?: string; +}; + +export default function InputField({ + placeholder = "", + errorMsg = "", + register, + className, + type, + ...props +}: TInputField) { + return ( + <> + + {errorMsg && ( +
+ {errorMsg} +
+ )} + + ); +} diff --git a/sona/week6/mission1/src/constants/key.ts b/sona/week6/mission1/src/constants/key.ts new file mode 100644 index 00000000..54167eb9 --- /dev/null +++ b/sona/week6/mission1/src/constants/key.ts @@ -0,0 +1,8 @@ +export const LOCAL_STORAGE_KEY = { + accessToken: "accessToken", + refreshToken: "refreshToken", +}; + +export const QUERY_KEY = { + lps: "lps", +}; diff --git a/sona/week6/mission1/src/context/AuthContext.tsx b/sona/week6/mission1/src/context/AuthContext.tsx new file mode 100644 index 00000000..bad2fdf6 --- /dev/null +++ b/sona/week6/mission1/src/context/AuthContext.tsx @@ -0,0 +1,88 @@ +import { createContext, PropsWithChildren, useContext, useState } from "react"; +import { RequestSigninDto } from "../types/auth"; +import useLocalStorage from "../hooks/useLocalStorage"; +import { LOCAL_STORAGE_KEY } from "../constants/key"; +import { postLogout, postSignin } from "../apis/auth"; + +interface AuthContextType { + accessToken: string | null; + refreshToken: string | null; + login: (signinData: RequestSigninDto) => Promise; + logout: () => Promise; +} + +export const AuthContext = createContext({ + accessToken: null, + refreshToken: null, + login: async () => {}, + logout: async () => {}, +}); + +export const AuthProvider = ({ children }: PropsWithChildren) => { + const { + getItem: getAccessTokenFromStorage, + setItem: setAccessTokenInStorage, + removeItem: removeAccessTokenFromStorage, + } = useLocalStorage(LOCAL_STORAGE_KEY.accessToken); + const { + getItem: getRefreshTokenFromStorage, + setItem: setRefreshTokenInStorage, + removeItem: removeRefreshTokenFromStorage, + } = useLocalStorage(LOCAL_STORAGE_KEY.refreshToken); + + //지연초기화작업 + const [accessToken, setAccessToken] = useState( + getAccessTokenFromStorage() + ); + const [refreshToken, setRefreshToken] = useState( + getRefreshTokenFromStorage() + ); + + const login = async (signinData: RequestSigninDto) => { + try { + const { data } = await postSignin(signinData); + if (data) { + const newAccessToken = data.accessToken; + const newRefreshToken = data.refreshToken; + setAccessTokenInStorage(newAccessToken); + setRefreshTokenInStorage(newRefreshToken); + setAccessToken(newAccessToken); + setRefreshToken(newRefreshToken); + alert("로그인성공"); + } + } catch (error) { + console.log(error); + alert("로그인실패"); + throw error; + } + }; + + const logout = async () => { + try { + await postLogout(); + removeAccessTokenFromStorage(); + removeRefreshTokenFromStorage(); + + setAccessToken(null); + setRefreshToken(null); + alert("로그아웃에 성공"); + // localStorage.clear(); // 더 큰 규모에서는 localstorage에 많은 정보를 담아두기 때문에 조심해서 사용함 + } catch (e) { + console.log("로그아웃 실패함", e); + } + }; + + return ( + + {children} + + ); +}; + +export const useAuth = () => { + const context = useContext(AuthContext); + if (!context) { + throw new Error("AuthContext를 찾을 수 없습니다"); + } + return context; +}; diff --git a/sona/week6/mission1/src/enums/common.ts b/sona/week6/mission1/src/enums/common.ts new file mode 100644 index 00000000..96a9c79c --- /dev/null +++ b/sona/week6/mission1/src/enums/common.ts @@ -0,0 +1,4 @@ +export enum PAGENATION_ORDER { + "asc" = "asc", + "desc" = "desc", +} diff --git a/sona/week6/mission1/src/hooks/useForm.tsx b/sona/week6/mission1/src/hooks/useForm.tsx new file mode 100644 index 00000000..b796bde8 --- /dev/null +++ b/sona/week6/mission1/src/hooks/useForm.tsx @@ -0,0 +1,50 @@ +import { useEffect, useState, ChangeEvent } from "react"; + +interface UseFormProps { + initialValue: T; + validate: (value: T) => Record; +} + +export default function useForm({ + initialValue, + validate, +}: UseFormProps) { + const [values, setValues] = useState(initialValue); + const [touched, setTouched] = useState>({}); + const [errors, setErrors] = useState>({}); + + const handleChange = (name: keyof T, text: string) => { + setValues((prev) => ({ + ...prev, + [name]: text, + })); + }; + + const handleBlur = (name: keyof T) => { + setTouched((prev) => ({ + ...prev, + [name]: true, + })); + }; + + const getInputProps = (name: keyof T) => { + const inputValue = values[name]; + + const onChange = ( + e: ChangeEvent + ) => { + handleChange(name, e.target.value); + }; + + const onBlur = () => handleBlur(name); + + return { value: inputValue, onChange, onBlur }; + }; + + useEffect(() => { + const newErrors = validate(values); + setErrors(newErrors); + }, [validate, values]); + + return { values, errors, touched, getInputProps }; +} diff --git a/sona/week6/mission1/src/hooks/useGetLpList.ts b/sona/week6/mission1/src/hooks/useGetLpList.ts new file mode 100644 index 00000000..e1397080 --- /dev/null +++ b/sona/week6/mission1/src/hooks/useGetLpList.ts @@ -0,0 +1,45 @@ +import { useQuery } from "@tanstack/react-query"; +import { QUERY_KEY } from "../constants/key"; +import { getLpList } from "../apis/lp"; +import { PageDto } from "../types/common"; + +// export default function useGetLp({ cursor, search, order, limit }: pageDto) { +// return useQuery({ +// queryKey: [QUERY_KEY.lps], //querykey상수화 +// queryFn: () => { +// return axiosInstance.get(`/v1/lps`, { +// params: { cursor, search: search, order, limit }, +// }); +// }, +// select: (res) => { +// return res.data.item; +// }, +// }); +// } +// useGetLpList.ts + +export default function useGetLpList({ + cursor, + search, + order, + limit, +}: PageDto) { + return useQuery({ + queryKey: [QUERY_KEY.lps], + queryFn: () => + getLpList({ + cursor, + search, + order, + limit, + }), + select: (res) => { + return res.data; + }, + //이 시간 동안, 캐시된 데이터 그대로 사용 + // staleTime: 1000 * 60 * 5, + // 캐시된 데이터가 사라지기까지의 대기 시간, 예를들어 5*60*1000이면 데이터가 사라지기 까지의 대기시간 단위 (5분) + // gcTime: 100 * 60 * 10, + // enabled: + }); +} diff --git a/sona/week6/mission1/src/hooks/useLocalStorage.ts b/sona/week6/mission1/src/hooks/useLocalStorage.ts new file mode 100644 index 00000000..a2f89588 --- /dev/null +++ b/sona/week6/mission1/src/hooks/useLocalStorage.ts @@ -0,0 +1,28 @@ +export const useLocalStorage = (key: string) => { + const setItem = (value: unknown) => { + try { + window.localStorage.setItem(key, JSON.stringify(value)); + } catch (error) { + console.log(error); + } + }; + + const getItem = () => { + try { + const item = window.localStorage.getItem(key); + return item ? JSON.parse(item) : null; + } catch (error) { + console.log(error); + } + }; + + const removeItem = () => { + try { + window.localStorage.removeItem(key); + } catch (error) { + console.log(error); + } + }; + return { setItem, getItem, removeItem }; +}; +export default useLocalStorage; diff --git a/sona/week6/mission1/src/index.css b/sona/week6/mission1/src/index.css new file mode 100644 index 00000000..691b83b7 --- /dev/null +++ b/sona/week6/mission1/src/index.css @@ -0,0 +1,10 @@ +@import "tailwindcss"; + +@layer components { + .inputField { + @apply w-full p-2 border border-gray-400 rounded-lg focus:outline-none text-sm mb-6; + } + .custom-btn { + @apply text-white bg-amber-600 px-2 rounded-2xl pb-1 h-7 text-sm; + } +} diff --git a/sona/week6/mission1/src/layout/HomeLayout.tsx b/sona/week6/mission1/src/layout/HomeLayout.tsx new file mode 100644 index 00000000..9e1c8097 --- /dev/null +++ b/sona/week6/mission1/src/layout/HomeLayout.tsx @@ -0,0 +1,13 @@ +import { Outlet } from "react-router-dom"; +import NavBar from "../pages/Navbar"; + +export default function Layout() { + return ( + <> + +
+ +
+ + ); +} diff --git a/sona/week6/mission1/src/layout/ProtectedLayout.tsx b/sona/week6/mission1/src/layout/ProtectedLayout.tsx new file mode 100644 index 00000000..d32e7373 --- /dev/null +++ b/sona/week6/mission1/src/layout/ProtectedLayout.tsx @@ -0,0 +1,14 @@ +import { Navigate, Outlet } from "react-router-dom"; +import { useAuth } from "../context/AuthContext"; + +const ProtectedLayout = () => { + //토큰 없으면 로그인페이지로 이동 + const { accessToken } = useAuth(); + + if (!accessToken) { + return ; + } + return ; +}; + +export default ProtectedLayout; diff --git a/sona/week6/mission1/src/main.tsx b/sona/week6/mission1/src/main.tsx new file mode 100644 index 00000000..10ed13e0 --- /dev/null +++ b/sona/week6/mission1/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import "./index.css"; +import App from "./App.tsx"; + +createRoot(document.getElementById("root")!).render( + + + +); diff --git a/sona/week6/mission1/src/pages/GoogleLoginRedirectPage.tsx b/sona/week6/mission1/src/pages/GoogleLoginRedirectPage.tsx new file mode 100644 index 00000000..70fe1b58 --- /dev/null +++ b/sona/week6/mission1/src/pages/GoogleLoginRedirectPage.tsx @@ -0,0 +1,26 @@ +import { useEffect } from "react"; +import useLocalStorage from "../hooks/useLocalStorage"; +import { LOCAL_STORAGE_KEY } from "../constants/key"; + +export default function GoogleLoginRedirectPage() { + const { setItem: setAccessToken } = useLocalStorage( + LOCAL_STORAGE_KEY.accessToken + ); + const { setItem: setRefreshToken } = useLocalStorage( + LOCAL_STORAGE_KEY.refreshToken + ); + + useEffect(() => { + const urlParams = new URLSearchParams(window.location.search); + const accessToken = urlParams.get(LOCAL_STORAGE_KEY.accessToken); + const refreshToken = urlParams.get(LOCAL_STORAGE_KEY.refreshToken); + + if (accessToken) { + setAccessToken(accessToken); + setRefreshToken(refreshToken); + window.location.href = "/my"; + } + }, [setAccessToken, setRefreshToken]); + + return
rnrmf
; +} diff --git a/sona/week6/mission1/src/pages/Home.tsx b/sona/week6/mission1/src/pages/Home.tsx new file mode 100644 index 00000000..984138d1 --- /dev/null +++ b/sona/week6/mission1/src/pages/Home.tsx @@ -0,0 +1,17 @@ +// import useGetLpList from "../hooks/useGetLpList"; +import useGetLpList from "../hooks/useGetLpList"; +import { Lp } from "../types/lp"; +import LpCard from "./LpCard"; + +export default function Home() { + const { data } = useGetLpList({}); + console.log(data); + + return ( +
+ {data?.data?.map((item: Lp) => ( + + ))} +
+ ); +} diff --git a/sona/week6/mission1/src/pages/Login.tsx b/sona/week6/mission1/src/pages/Login.tsx new file mode 100644 index 00000000..882e2b8e --- /dev/null +++ b/sona/week6/mission1/src/pages/Login.tsx @@ -0,0 +1,97 @@ +import useForm from "../hooks/useForm"; +import { UserSigninInformation, validateSignin } from "../utils/validate"; +import Header from "../components/Header"; +import { useNavigate } from "react-router-dom"; +import { useAuth } from "../context/AuthContext"; +import { useEffect } from "react"; + +export default function Login() { + const { login, accessToken } = useAuth(); + const navigate = useNavigate(); + + useEffect(() => { + if (accessToken) { + navigate("/"); + } + }, [navigate, accessToken]); + + const { values, errors, touched, getInputProps } = + useForm({ + initialValue: { + email: "", + password: "", + }, + validate: validateSignin, + }); + + const handleSubmit = async () => { + try { + await login(values); + navigate("/my"); + } catch (e) { + navigate("/"); + console.log(e); + } + }; + const handleGoogleLogin = () => { + window.location.href = + import.meta.env.VITE_SERVER_API_URL + "/v1/auth/google/login"; + }; + + return ( + <> +
+ +
+
+ OR +
+
+
+ + {errors.email && touched.email && ( +
+ {errors.email} +
+ )} +
+
+ + {errors.password && touched.password && ( +
+ {errors.password} +
+ )} +
+ + + ); +} diff --git a/sona/week6/mission1/src/pages/LpCard.tsx b/sona/week6/mission1/src/pages/LpCard.tsx new file mode 100644 index 00000000..91d15b1b --- /dev/null +++ b/sona/week6/mission1/src/pages/LpCard.tsx @@ -0,0 +1,31 @@ +import { Lp } from "../types/lp"; + +interface LpProps { + item: Lp; +} + +export default function LpCard({ item }: LpProps) { + // console.log(item.thumbnail); + console.log(item); + return ( +
+ +
+
+

{item.title}

+

+ 17 ago mis ago +

+
+
{item.likes?.length || "0"}
+
+
+ ); +} diff --git a/sona/week6/mission1/src/pages/MyPage.tsx b/sona/week6/mission1/src/pages/MyPage.tsx new file mode 100644 index 00000000..0d379859 --- /dev/null +++ b/sona/week6/mission1/src/pages/MyPage.tsx @@ -0,0 +1,44 @@ +import { useEffect, useState } from "react"; +import { getmyInfo } from "../apis/auth"; +import { ResponseMyInfoDto } from "../types/auth"; +import { useAuth } from "../context/AuthContext"; +import { useNavigate } from "react-router-dom"; + +const MyPage = () => { + const navigate = useNavigate(); + const { logout } = useAuth(); + const [data, setData] = useState([]); + useEffect(() => { + const getData = async () => { + const response = await getmyInfo(); + // console.log(response);header + setData(response); + }; + getData(); + }, []); + const handleLogout = async () => { + await logout(); + navigate("/login"); + }; + // console.log(data); + return ( + <> +
+
{data.data?.name}님 환영합니다
+ 프로필이미지 + +
+ + ); +}; + +export default MyPage; diff --git a/sona/week6/mission1/src/pages/Navbar.tsx b/sona/week6/mission1/src/pages/Navbar.tsx new file mode 100644 index 00000000..096a044c --- /dev/null +++ b/sona/week6/mission1/src/pages/Navbar.tsx @@ -0,0 +1,20 @@ +import { Link } from "react-router-dom"; + +export default function NavBar() { + return ( + <> +
+ sdfsdf + +
login
+ + +
sign up
+ + +
myPage
+ +
+ + ); +} diff --git a/sona/week6/mission1/src/pages/NotFoundPage.tsx b/sona/week6/mission1/src/pages/NotFoundPage.tsx new file mode 100644 index 00000000..fd64e89a --- /dev/null +++ b/sona/week6/mission1/src/pages/NotFoundPage.tsx @@ -0,0 +1,3 @@ +export default function NotFoundPage() { + return
찾을 수 없음
; +} diff --git a/sona/week6/mission1/src/pages/SignUp.tsx b/sona/week6/mission1/src/pages/SignUp.tsx new file mode 100644 index 00000000..654326c3 --- /dev/null +++ b/sona/week6/mission1/src/pages/SignUp.tsx @@ -0,0 +1,121 @@ +import { zodResolver } from "@hookform/resolvers/zod"; +import { SubmitHandler, useForm } from "react-hook-form"; +import { z } from "zod"; +import Header from "../components/Header"; +import InputField from "../components/InputField"; +import { postSignup } from "../apis/auth"; + +const schema = z + .object({ + email: z.string().email({ message: "올바른 이메일 형식이 아닙니다" }), + password: z + .string() + .min(8, { + message: "비밀번호는 8자 이상 이어야 합니다", + }) + .max(20, { message: "비밀번호는 20자 이상이어야합니다" }), + name: z.string().min(1, { message: " 이름을 입력해주세요" }), + passwordCheck: z + .string() + .min(8, { + message: "비밀번호는 8자 이상 이어야 합니다", + }) + .max(20, { message: "비밀번호는 20자 이상이어야합니다" }), + }) + .refine((data) => data.password === data.passwordCheck, { + message: "비밀번호가 일치하지 않습니다", + path: ["passwordCheck"], + }); + +type FormFields = z.infer; + +//isSubmitting은 로딩처리 +export default function SignUp() { + const { + formState: { errors, isSubmitting }, + register, + handleSubmit, + } = useForm({ + defaultValues: { + email: "", + password: "", + name: "", + passwordCheck: "", + }, + resolver: zodResolver(schema), //스키마 위반하면 error + mode: "onBlur", + }); + + const onSubmit: SubmitHandler = async (data) => { + const { passwordCheck, ...rest } = data; + const response = await postSignup(rest); + console.log(response); + console.log("응"); + }; + + return ( + <> +
+ +
+ +
구글 로그인
+
+
+
+ OR +
+
+
+ +
+
+ +
+
+ +
+ +
+ +
+ + + + ); +} diff --git a/sona/week6/mission1/src/routes.tsx b/sona/week6/mission1/src/routes.tsx new file mode 100644 index 00000000..3f51cce4 --- /dev/null +++ b/sona/week6/mission1/src/routes.tsx @@ -0,0 +1,44 @@ +import { createBrowserRouter, RouteObject } from "react-router-dom"; +import NotFoundPage from "./pages/NotFoundPage"; +import Login from "./pages/Login"; +import SignUp from "./pages/SignUp"; +import MyPage from "./pages/MyPage"; +import ProtectedLayout from "./layout/ProtectedLayout"; +import GoogleLoginRedirectPage from "./pages/GoogleLoginRedirectPage"; +import Layout from "./layout/HomeLayout"; +import Home from "./pages/Home"; +//로그인 필요없는 페이지 +const publicRoutes: RouteObject[] = [ + { + path: "/", + element: , + errorElement: , + children: [ + { + index: true, + element: , + }, + { + path: "login", + element: , + }, + { + path: "signup", + element: , + }, + { path: "v1/auth/google/callback", element: }, + ], + }, +]; +//로그인 필요한 페이지 +const protectedRoutes: RouteObject[] = [ + { + path: "/", + element: , + errorElement: , + children: [{ path: "my", element: }], + }, +]; + +const router = createBrowserRouter([...publicRoutes, ...protectedRoutes]); +export default router; diff --git a/sona/week6/mission1/src/types/auth.ts b/sona/week6/mission1/src/types/auth.ts new file mode 100644 index 00000000..343e906c --- /dev/null +++ b/sona/week6/mission1/src/types/auth.ts @@ -0,0 +1,44 @@ +import { CommenResponse } from "./common"; + +//회원가입 관련 +export type RequesetSignupDto = { + name: string; + email: string; + bio?: string; + avatar?: string; + password: string; +}; + +export type ResponseSignupDto = CommenResponse<{ + id: number; + name: string; + email: string; + bio: boolean | null; + avatar: boolean | null; + createdAt: string; + updatedAt: string; +}>; + +//로그인관련 + +export type RequestSigninDto = CommenResponse<{ + email: string; + password: string; +}>; + +export type ResponseSigninDto = CommenResponse<{ + id: number; + name: string; + accessToken: string; + refreshToken: string; +}>; + +export type ResponseMyInfoDto = CommenResponse<{ + id: number; + name: string; + email: string; + bio: string | null; + avatar: string | null; + createdAt: Date; + updatedAt: Date; +}>; diff --git a/sona/week6/mission1/src/types/common.ts b/sona/week6/mission1/src/types/common.ts new file mode 100644 index 00000000..1fdd618b --- /dev/null +++ b/sona/week6/mission1/src/types/common.ts @@ -0,0 +1,25 @@ +import { PAGENATION_ORDER } from "../enums/common"; + +export type CommenResponse = { + status: boolean; + statusCode: number; + message: string; + data: T; +}; + +export type CursorBasedResponse = { + status: boolean; + statusCode: number; + message: string; + data: T; + nextCursor: string; + hasNext: boolean; +}; + +//lp목록 조회 파라미터 +export type PageDto = { + cursor?: number; + limit?: number; + search?: string; + order?: PAGENATION_ORDER; +}; diff --git a/sona/week6/mission1/src/types/lp.ts b/sona/week6/mission1/src/types/lp.ts new file mode 100644 index 00000000..2cc0e453 --- /dev/null +++ b/sona/week6/mission1/src/types/lp.ts @@ -0,0 +1,29 @@ +import { CursorBasedResponse } from "./common"; + +export type Tag = { + id: number; + name: string; +}; + +export type Likes = { + id: number; + userId: number; + lpId: number; +}; + +export type Lp = { + id: number; + title: string; + content: string; + thumbnail: string; + published: boolean; + authorId: number; + createdAt: Date; + updatedAt: Date; + tags: Tag[]; + likes: Likes[]; +}; + +export type ResponseLpListDto = CursorBasedResponse<{ + data: Lp[]; +}>; diff --git a/sona/week6/mission1/src/utils/validate.ts b/sona/week6/mission1/src/utils/validate.ts new file mode 100644 index 00000000..64dc40e8 --- /dev/null +++ b/sona/week6/mission1/src/utils/validate.ts @@ -0,0 +1,34 @@ +export type UserSigninInformation = { + email: string; + password: string; +}; + +export default function validateUser(values: UserSigninInformation) { + const errors = { + email: "", + password: "", + }; + + const emailValid = (email: string) => { + const emailRegx = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + return emailRegx.test(email); + }; + + //숫자 +영문 조합8 + const passwordVaild = (password: string) => { + const passwordRegx = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/; + return passwordRegx.test(password); + }; + + if (!emailValid(values.email)) { + errors.email = "올바른 이메일을 입력해주세요"; + } + if (!passwordVaild(values.password)) { + errors.password = "비밀번호는 영문,숫자 조합 8글자 이상으로 입력 해주세요"; + } + return errors; +} + +export function validateSignin(values: UserSigninInformation) { + return validateUser(values); +} diff --git a/sona/week6/mission1/src/vite-env.d.ts b/sona/week6/mission1/src/vite-env.d.ts new file mode 100644 index 00000000..12a29a12 --- /dev/null +++ b/sona/week6/mission1/src/vite-env.d.ts @@ -0,0 +1,9 @@ +/// + +interface ImportMetaEnv { + readonly VITE_SERVER_API_URL: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} diff --git a/sona/week6/mission1/tsconfig.app.json b/sona/week6/mission1/tsconfig.app.json new file mode 100644 index 00000000..358ca9ba --- /dev/null +++ b/sona/week6/mission1/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/sona/week6/mission1/tsconfig.json b/sona/week6/mission1/tsconfig.json new file mode 100644 index 00000000..1ffef600 --- /dev/null +++ b/sona/week6/mission1/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/sona/week6/mission1/tsconfig.node.json b/sona/week6/mission1/tsconfig.node.json new file mode 100644 index 00000000..db0becc8 --- /dev/null +++ b/sona/week6/mission1/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/sona/week6/mission1/vite.config.ts b/sona/week6/mission1/vite.config.ts new file mode 100644 index 00000000..f961a459 --- /dev/null +++ b/sona/week6/mission1/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react-swc"; +import tailwindcss from "@tailwindcss/vite"; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react(), tailwindcss()], +}); From fb4d2d849340e9df814eae5c99eaa0c400150498 Mon Sep 17 00:00:00 2001 From: JeonSuna Date: Thu, 8 May 2025 05:11:22 +0900 Subject: [PATCH 02/18] =?UTF-8?q?=E2=9C=A8=20feat:=20nav=201=EC=B0=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sona/week6/mission1/public/hambugi.svg | 3 + sona/week6/mission1/public/hart.svg | 3 + sona/week6/mission1/public/search.svg | 3 + sona/week6/mission1/src/components/Header.tsx | 5 +- sona/week6/mission1/src/index.css | 3 + sona/week6/mission1/src/pages/Login.tsx | 106 ++++++++-------- sona/week6/mission1/src/pages/LpCard.tsx | 7 +- sona/week6/mission1/src/pages/Navbar.tsx | 70 +++++++++-- sona/week6/mission1/src/pages/SignUp.tsx | 117 +++++++++--------- 9 files changed, 192 insertions(+), 125 deletions(-) create mode 100644 sona/week6/mission1/public/hambugi.svg create mode 100644 sona/week6/mission1/public/hart.svg create mode 100644 sona/week6/mission1/public/search.svg diff --git a/sona/week6/mission1/public/hambugi.svg b/sona/week6/mission1/public/hambugi.svg new file mode 100644 index 00000000..ddcf7eaa --- /dev/null +++ b/sona/week6/mission1/public/hambugi.svg @@ -0,0 +1,3 @@ + + + diff --git a/sona/week6/mission1/public/hart.svg b/sona/week6/mission1/public/hart.svg new file mode 100644 index 00000000..d56aa45b --- /dev/null +++ b/sona/week6/mission1/public/hart.svg @@ -0,0 +1,3 @@ + + + diff --git a/sona/week6/mission1/public/search.svg b/sona/week6/mission1/public/search.svg new file mode 100644 index 00000000..64cdeae3 --- /dev/null +++ b/sona/week6/mission1/public/search.svg @@ -0,0 +1,3 @@ + + + diff --git a/sona/week6/mission1/src/components/Header.tsx b/sona/week6/mission1/src/components/Header.tsx index 16702696..55dc7973 100644 --- a/sona/week6/mission1/src/components/Header.tsx +++ b/sona/week6/mission1/src/components/Header.tsx @@ -19,11 +19,10 @@ export default function Header() { if (headerMatch) { return ( <> -
adsasd
-

navigate(-1)}> +

{getTitle()}

diff --git a/sona/week6/mission1/src/index.css b/sona/week6/mission1/src/index.css index 691b83b7..2e0cf259 100644 --- a/sona/week6/mission1/src/index.css +++ b/sona/week6/mission1/src/index.css @@ -7,4 +7,7 @@ .custom-btn { @apply text-white bg-amber-600 px-2 rounded-2xl pb-1 h-7 text-sm; } + .account { + @apply flex flex-col items-center justify-center m-auto px-2; + } } diff --git a/sona/week6/mission1/src/pages/Login.tsx b/sona/week6/mission1/src/pages/Login.tsx index 882e2b8e..1ea4137e 100644 --- a/sona/week6/mission1/src/pages/Login.tsx +++ b/sona/week6/mission1/src/pages/Login.tsx @@ -40,58 +40,62 @@ export default function Login() { return ( <> -
- -
-
- OR -
+
+
+ +
+
+ OR +
+
+
+ + {errors.email && touched.email && ( +
+ {errors.email} +
+ )} +
+
+ + {errors.password && touched.password && ( +
+ {errors.password} +
+ )} +
+
-
- - {errors.email && touched.email && ( -
- {errors.email} -
- )} -
-
- - {errors.password && touched.password && ( -
- {errors.password} -
- )} -
- ); } diff --git a/sona/week6/mission1/src/pages/LpCard.tsx b/sona/week6/mission1/src/pages/LpCard.tsx index 91d15b1b..1167131e 100644 --- a/sona/week6/mission1/src/pages/LpCard.tsx +++ b/sona/week6/mission1/src/pages/LpCard.tsx @@ -16,7 +16,7 @@ export default function LpCard({ item }: LpProps) { />

{item.title}

@@ -24,7 +24,10 @@ export default function LpCard({ item }: LpProps) { 17 ago mis ago

-
{item.likes?.length || "0"}
+
+ +
{item.likes?.length || "0"}
+
); diff --git a/sona/week6/mission1/src/pages/Navbar.tsx b/sona/week6/mission1/src/pages/Navbar.tsx index 096a044c..b857d4d9 100644 --- a/sona/week6/mission1/src/pages/Navbar.tsx +++ b/sona/week6/mission1/src/pages/Navbar.tsx @@ -1,19 +1,67 @@ +import { useState } from "react"; import { Link } from "react-router-dom"; export default function NavBar() { + const [isOpen, setIsOpen] = useState(false); + return ( <> -
- sdfsdf - -
login
- - -
sign up
- - -
myPage
- + + + {/* 사이드바 */} + + {isOpen && ( +
setIsOpen(false)} + /> + )} + + {/* 사이드바 */} +
+
+ 메뉴 + +
+
    +
  • + setIsOpen(false)} + > + + 검색 + +
  • +
  • + 마이페이지 +
  • +
); diff --git a/sona/week6/mission1/src/pages/SignUp.tsx b/sona/week6/mission1/src/pages/SignUp.tsx index 654326c3..64fcccff 100644 --- a/sona/week6/mission1/src/pages/SignUp.tsx +++ b/sona/week6/mission1/src/pages/SignUp.tsx @@ -55,67 +55,68 @@ export default function SignUp() { return ( <> -
+
+
+
+ +
구글 로그인
+
+
+
+ OR +
+
+
+ +
+
+ +
+
+ +
-
- -
구글 로그인
-
-
-
- OR -
-
-
- -
-
- -
-
- -
+
+ +
-
- +
- - ); } From bf0f1c9ea5e256c959edb4aad61b690c23e6a632 Mon Sep 17 00:00:00 2001 From: JeonSuna Date: Thu, 8 May 2025 15:34:28 +0900 Subject: [PATCH 03/18] =?UTF-8?q?=E2=9C=A8=20feat:=20navbar=20token=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EB=8B=A4?= =?UTF-8?q?=EB=A5=B4=EA=B2=8C=20ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mission1/src/hooks/useGetProfile.tsx | 11 ++++++ sona/week6/mission1/src/pages/Navbar.tsx | 34 +++++++++++++++---- 2 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 sona/week6/mission1/src/hooks/useGetProfile.tsx diff --git a/sona/week6/mission1/src/hooks/useGetProfile.tsx b/sona/week6/mission1/src/hooks/useGetProfile.tsx new file mode 100644 index 00000000..6b907390 --- /dev/null +++ b/sona/week6/mission1/src/hooks/useGetProfile.tsx @@ -0,0 +1,11 @@ +import { useQuery } from "@tanstack/react-query"; +import axiosInstance from "../apis/axios"; + +export default function useGetProfile() { + const { data } = useQuery({ + queryKey: ["user"], + queryFn: () => axiosInstance.get(`/v1/users/me`), + }); + const user = data?.data; + return { user }; +} diff --git a/sona/week6/mission1/src/pages/Navbar.tsx b/sona/week6/mission1/src/pages/Navbar.tsx index b857d4d9..3caba501 100644 --- a/sona/week6/mission1/src/pages/Navbar.tsx +++ b/sona/week6/mission1/src/pages/Navbar.tsx @@ -1,9 +1,15 @@ import { useState } from "react"; import { Link } from "react-router-dom"; +import { useAuth } from "../context/AuthContext"; +import useGetProfile from "../hooks/useGetProfile"; export default function NavBar() { const [isOpen, setIsOpen] = useState(false); + const { logout, accessToken } = useAuth(); + + const { user } = useGetProfile(); + console.log(user); return ( <>
-
- -
로그인
- - -
회원가입
- +
+ {accessToken ? ( + <> +
{user.data.name}님 반갑습니다
+ + + ) : ( + <> + +
로그인
+ + +
회원가입
+ + + )}
From 4d0ee153cf7337d4e78d8311ae2564d0526468c7 Mon Sep 17 00:00:00 2001 From: JeonSuna Date: Thu, 8 May 2025 16:17:19 +0900 Subject: [PATCH 04/18] =?UTF-8?q?=E2=9C=A8=20feat:=20nav=202=EC=B0=A8=20?= =?UTF-8?q?=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sona/week6/mission1/src/hooks/useGetProfile.tsx | 3 +++ sona/week6/mission1/src/pages/LpCard.tsx | 2 +- sona/week6/mission1/src/pages/Navbar.tsx | 15 ++++++++------- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/sona/week6/mission1/src/hooks/useGetProfile.tsx b/sona/week6/mission1/src/hooks/useGetProfile.tsx index 6b907390..83130968 100644 --- a/sona/week6/mission1/src/hooks/useGetProfile.tsx +++ b/sona/week6/mission1/src/hooks/useGetProfile.tsx @@ -1,10 +1,13 @@ import { useQuery } from "@tanstack/react-query"; import axiosInstance from "../apis/axios"; +import { useAuth } from "../context/AuthContext"; export default function useGetProfile() { + const { accessToken } = useAuth(); const { data } = useQuery({ queryKey: ["user"], queryFn: () => axiosInstance.get(`/v1/users/me`), + enabled: !!accessToken, }); const user = data?.data; return { user }; diff --git a/sona/week6/mission1/src/pages/LpCard.tsx b/sona/week6/mission1/src/pages/LpCard.tsx index 1167131e..373460c8 100644 --- a/sona/week6/mission1/src/pages/LpCard.tsx +++ b/sona/week6/mission1/src/pages/LpCard.tsx @@ -6,7 +6,7 @@ interface LpProps { export default function LpCard({ item }: LpProps) { // console.log(item.thumbnail); - console.log(item); + // console.log(item); return (
!item); + // } const { user } = useGetProfile(); - console.log(user); + // // console.log(user); return ( <>