From f9ff7df5ef9e907a39dd5e45eb9ac3c9f12fba68 Mon Sep 17 00:00:00 2001 From: Jina Date: Sat, 9 May 2026 00:07:03 +0900 Subject: [PATCH 1/6] =?UTF-8?q?feat:=204=EC=A3=BC=EC=B0=A8=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week4/Homework/api-project/.env | 1 + Week4/Homework/api-project/.gitignore | 24 + Week4/Homework/api-project/README.md | 73 + Week4/Homework/api-project/eslint.config.js | 22 + Week4/Homework/api-project/index.html | 13 + Week4/Homework/api-project/package.json | 37 + Week4/Homework/api-project/pnpm-lock.yaml | 2293 +++++++++++++++++ Week4/Homework/api-project/public/favicon.svg | 1 + Week4/Homework/api-project/public/icons.svg | 24 + Week4/Homework/api-project/src/App.tsx | 8 + .../Homework/api-project/src/apis/instance.ts | 10 + Week4/Homework/api-project/src/apis/user.ts | 113 + .../authFormLayout/AuthFormLayout.styles.ts | 39 + .../auth/authFormLayout/AuthFormLayout.tsx | 24 + .../components/common/button/Button.styles.ts | 14 + .../src/components/common/button/Button.tsx | 16 + .../components/common/header/Header.styles.ts | 33 + .../src/components/common/header/Header.tsx | 20 + .../dropDownInput/DropDownInput.styles.ts | 18 + .../input/dropDownInput/DropDownInput.tsx | 29 + .../input/inputField/InputField.styles.ts | 18 + .../common/input/inputField/InputField.tsx | 21 + .../mypage/InfoCard/InfoCard.styles.ts | 26 + .../components/mypage/InfoCard/InfoCard.tsx | 25 + Week4/Homework/api-project/src/main.tsx | 15 + .../api-project/src/pages/login/Login.tsx | 74 + .../pages/memberDetail/MemberDetail.styles.ts | 27 + .../src/pages/memberDetail/MemberDetail.tsx | 24 + .../src/pages/members/Member.styles.ts | 8 + .../api-project/src/pages/members/Members.tsx | 14 + .../listSection/ListSection.styles.ts | 20 + .../components/listSection/ListSection.tsx | 31 + .../memberCard/MemberCard.styles.ts | 27 + .../listSection/memberCard/MemberCard.tsx | 17 + .../searchSection/SearchSection.styles.ts | 26 + .../searchSection/SearchSection.tsx | 28 + .../api-project/src/pages/mypage/MyPage.tsx | 100 + .../pages/mypage/components/MyPageLayout.tsx | 13 + .../api-project/src/pages/signup/Signup.tsx | 76 + .../src/pages/signup/components/SignupID.tsx | 48 + .../pages/signup/components/SignupInfo.tsx | 70 + .../signup/components/SignupPassword.tsx | 59 + .../api-project/src/router/Router.tsx | 23 + .../api-project/src/schemas/editInfoSchema.ts | 19 + .../api-project/src/schemas/loginSchema.ts | 8 + .../api-project/src/schemas/signupSchema.ts | 52 + .../api-project/src/styles/GlobalStyle.tsx | 52 + .../api-project/src/styles/emotion.d.ts | 10 + .../Homework/api-project/src/styles/theme.ts | 38 + .../api-project/src/types/userType.ts | 34 + Week4/Homework/api-project/tsconfig.app.json | 25 + Week4/Homework/api-project/tsconfig.json | 7 + Week4/Homework/api-project/tsconfig.node.json | 24 + Week4/Homework/api-project/vite.config.ts | 7 + 54 files changed, 3878 insertions(+) create mode 100644 Week4/Homework/api-project/.env create mode 100644 Week4/Homework/api-project/.gitignore create mode 100644 Week4/Homework/api-project/README.md create mode 100644 Week4/Homework/api-project/eslint.config.js create mode 100644 Week4/Homework/api-project/index.html create mode 100644 Week4/Homework/api-project/package.json create mode 100644 Week4/Homework/api-project/pnpm-lock.yaml create mode 100644 Week4/Homework/api-project/public/favicon.svg create mode 100644 Week4/Homework/api-project/public/icons.svg create mode 100644 Week4/Homework/api-project/src/App.tsx create mode 100644 Week4/Homework/api-project/src/apis/instance.ts create mode 100644 Week4/Homework/api-project/src/apis/user.ts create mode 100644 Week4/Homework/api-project/src/components/auth/authFormLayout/AuthFormLayout.styles.ts create mode 100644 Week4/Homework/api-project/src/components/auth/authFormLayout/AuthFormLayout.tsx create mode 100644 Week4/Homework/api-project/src/components/common/button/Button.styles.ts create mode 100644 Week4/Homework/api-project/src/components/common/button/Button.tsx create mode 100644 Week4/Homework/api-project/src/components/common/header/Header.styles.ts create mode 100644 Week4/Homework/api-project/src/components/common/header/Header.tsx create mode 100644 Week4/Homework/api-project/src/components/common/input/dropDownInput/DropDownInput.styles.ts create mode 100644 Week4/Homework/api-project/src/components/common/input/dropDownInput/DropDownInput.tsx create mode 100644 Week4/Homework/api-project/src/components/common/input/inputField/InputField.styles.ts create mode 100644 Week4/Homework/api-project/src/components/common/input/inputField/InputField.tsx create mode 100644 Week4/Homework/api-project/src/components/mypage/InfoCard/InfoCard.styles.ts create mode 100644 Week4/Homework/api-project/src/components/mypage/InfoCard/InfoCard.tsx create mode 100644 Week4/Homework/api-project/src/main.tsx create mode 100644 Week4/Homework/api-project/src/pages/login/Login.tsx create mode 100644 Week4/Homework/api-project/src/pages/memberDetail/MemberDetail.styles.ts create mode 100644 Week4/Homework/api-project/src/pages/memberDetail/MemberDetail.tsx create mode 100644 Week4/Homework/api-project/src/pages/members/Member.styles.ts create mode 100644 Week4/Homework/api-project/src/pages/members/Members.tsx create mode 100644 Week4/Homework/api-project/src/pages/members/components/listSection/ListSection.styles.ts create mode 100644 Week4/Homework/api-project/src/pages/members/components/listSection/ListSection.tsx create mode 100644 Week4/Homework/api-project/src/pages/members/components/listSection/memberCard/MemberCard.styles.ts create mode 100644 Week4/Homework/api-project/src/pages/members/components/listSection/memberCard/MemberCard.tsx create mode 100644 Week4/Homework/api-project/src/pages/members/components/searchSection/SearchSection.styles.ts create mode 100644 Week4/Homework/api-project/src/pages/members/components/searchSection/SearchSection.tsx create mode 100644 Week4/Homework/api-project/src/pages/mypage/MyPage.tsx create mode 100644 Week4/Homework/api-project/src/pages/mypage/components/MyPageLayout.tsx create mode 100644 Week4/Homework/api-project/src/pages/signup/Signup.tsx create mode 100644 Week4/Homework/api-project/src/pages/signup/components/SignupID.tsx create mode 100644 Week4/Homework/api-project/src/pages/signup/components/SignupInfo.tsx create mode 100644 Week4/Homework/api-project/src/pages/signup/components/SignupPassword.tsx create mode 100644 Week4/Homework/api-project/src/router/Router.tsx create mode 100644 Week4/Homework/api-project/src/schemas/editInfoSchema.ts create mode 100644 Week4/Homework/api-project/src/schemas/loginSchema.ts create mode 100644 Week4/Homework/api-project/src/schemas/signupSchema.ts create mode 100644 Week4/Homework/api-project/src/styles/GlobalStyle.tsx create mode 100644 Week4/Homework/api-project/src/styles/emotion.d.ts create mode 100644 Week4/Homework/api-project/src/styles/theme.ts create mode 100644 Week4/Homework/api-project/src/types/userType.ts create mode 100644 Week4/Homework/api-project/tsconfig.app.json create mode 100644 Week4/Homework/api-project/tsconfig.json create mode 100644 Week4/Homework/api-project/tsconfig.node.json create mode 100644 Week4/Homework/api-project/vite.config.ts diff --git a/Week4/Homework/api-project/.env b/Week4/Homework/api-project/.env new file mode 100644 index 0000000..5a00a91 --- /dev/null +++ b/Week4/Homework/api-project/.env @@ -0,0 +1 @@ +VITE_API_BASE_URL="https://sopt-server.p-e.kr" \ No newline at end of file diff --git a/Week4/Homework/api-project/.gitignore b/Week4/Homework/api-project/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/Week4/Homework/api-project/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/Week4/Homework/api-project/README.md b/Week4/Homework/api-project/README.md new file mode 100644 index 0000000..7dbf7eb --- /dev/null +++ b/Week4/Homework/api-project/README.md @@ -0,0 +1,73 @@ +# 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) uses [Oxc](https://oxc.rs) +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## 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 defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + + // 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, + + // Other configs... + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` + +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 defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + // Enable lint rules for React + reactX.configs['recommended-typescript'], + // Enable lint rules for React DOM + reactDom.configs.recommended, + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` diff --git a/Week4/Homework/api-project/eslint.config.js b/Week4/Homework/api-project/eslint.config.js new file mode 100644 index 0000000..ef614d2 --- /dev/null +++ b/Week4/Homework/api-project/eslint.config.js @@ -0,0 +1,22 @@ +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' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + globals: globals.browser, + }, + }, +]) diff --git a/Week4/Homework/api-project/index.html b/Week4/Homework/api-project/index.html new file mode 100644 index 0000000..9ea7274 --- /dev/null +++ b/Week4/Homework/api-project/index.html @@ -0,0 +1,13 @@ + + + + + + + api-project + + +
+ + + diff --git a/Week4/Homework/api-project/package.json b/Week4/Homework/api-project/package.json new file mode 100644 index 0000000..31be7fb --- /dev/null +++ b/Week4/Homework/api-project/package.json @@ -0,0 +1,37 @@ +{ + "name": "api-project", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@hookform/resolvers": "^5.2.2", + "axios": "^1.16.0", + "react": "^19.2.5", + "react-dom": "^19.2.5", + "react-hook-form": "^7.75.0", + "react-router": "^7.14.2", + "zod": "^4.4.3" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/node": "^24.12.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^10.2.1", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.5.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.58.2", + "vite": "^8.0.10" + } +} diff --git a/Week4/Homework/api-project/pnpm-lock.yaml b/Week4/Homework/api-project/pnpm-lock.yaml new file mode 100644 index 0000000..bc0a0ba --- /dev/null +++ b/Week4/Homework/api-project/pnpm-lock.yaml @@ -0,0 +1,2293 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@emotion/react': + specifier: ^11.14.0 + version: 11.14.0(@types/react@19.2.14)(react@19.2.5) + '@emotion/styled': + specifier: ^11.14.1 + version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5) + '@hookform/resolvers': + specifier: ^5.2.2 + version: 5.2.2(react-hook-form@7.75.0(react@19.2.5)) + axios: + specifier: ^1.16.0 + version: 1.16.0 + react: + specifier: ^19.2.5 + version: 19.2.5 + react-dom: + specifier: ^19.2.5 + version: 19.2.5(react@19.2.5) + react-hook-form: + specifier: ^7.75.0 + version: 7.75.0(react@19.2.5) + react-router: + specifier: ^7.14.2 + version: 7.14.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + zod: + specifier: ^4.4.3 + version: 4.4.3 + devDependencies: + '@eslint/js': + specifier: ^10.0.1 + version: 10.0.1(eslint@10.3.0) + '@types/node': + specifier: ^24.12.2 + version: 24.12.2 + '@types/react': + specifier: ^19.2.14 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: ^6.0.1 + version: 6.0.1(vite@8.0.10(@types/node@24.12.2)) + eslint: + specifier: ^10.2.1 + version: 10.3.0 + eslint-plugin-react-hooks: + specifier: ^7.1.1 + version: 7.1.1(eslint@10.3.0) + eslint-plugin-react-refresh: + specifier: ^0.5.2 + version: 0.5.2(eslint@10.3.0) + globals: + specifier: ^17.5.0 + version: 17.6.0 + typescript: + specifier: ~6.0.2 + version: 6.0.3 + typescript-eslint: + specifier: ^8.58.2 + version: 8.59.1(eslint@10.3.0)(typescript@6.0.3) + vite: + specifier: ^8.0.10 + version: 8.0.10(@types/node@24.12.2) + +packages: + + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.3': + resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.3': + resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@emotion/babel-plugin@11.13.5': + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} + + '@emotion/cache@11.14.0': + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/is-prop-valid@1.4.0': + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/react@11.14.0': + resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.3': + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/styled@11.14.1': + resolution: {integrity: sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0': + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.4.2': + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} + + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/config-helpers@0.5.5': + resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.7.1': + resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@hookform/resolvers@5.2.2': + resolution: {integrity: sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==} + peerDependencies: + react-hook-form: ^7.55.0 + + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@oxc-project/types@0.127.0': + resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} + + '@rolldown/binding-android-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.17': + resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': + resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': + resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': + resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-rc.17': + resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==} + + '@rolldown/pluginutils@1.0.0-rc.7': + resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==} + + '@standard-schema/utils@0.3.0': + resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} + + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@24.12.2': + resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + + '@typescript-eslint/eslint-plugin@8.59.1': + resolution: {integrity: sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.59.1 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.59.1': + resolution: {integrity: sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/project-service@8.59.1': + resolution: {integrity: sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.59.1': + resolution: {integrity: sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.59.1': + resolution: {integrity: sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.59.1': + resolution: {integrity: sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.59.1': + resolution: {integrity: sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.59.1': + resolution: {integrity: sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.59.1': + resolution: {integrity: sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.59.1': + resolution: {integrity: sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitejs/plugin-react@6.0.1': + resolution: {integrity: sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.16.0: + resolution: {integrity: sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.10.27: + resolution: {integrity: sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==} + engines: {node: '>=6.0.0'} + hasBin: true + + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + engines: {node: 18 || 20 || >=22} + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001791: + resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.349: + resolution: {integrity: sha512-QsWVGyRuY07Aqb234QytTfwd5d9AJlfNIQ5wIOl1L+PZDzI9d9+Fn0FRale/QYlFxt/bUnB0/nLd1jFPGxGK1A==} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-react-hooks@7.1.1: + resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 + + eslint-plugin-react-refresh@0.5.2: + resolution: {integrity: sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==} + peerDependencies: + eslint: ^9 || ^10 + + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.3.0: + resolution: {integrity: sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globals@17.6.0: + resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} + engines: {node: '>=18'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + engines: {node: '>= 0.4'} + + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-releases@2.0.38: + resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + postcss@8.5.13: + resolution: {integrity: sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + react-dom@19.2.5: + resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==} + peerDependencies: + react: ^19.2.5 + + react-hook-form@7.75.0: + resolution: {integrity: sha512-Ovv94H+0p3sJ7B9B5QxPuCP1u8V/cHuVGyH55cSwodYDtoJwK+fqk3vjfIgSX59I2U/bU4z0nRJ9HMLpNiWEmw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-router@7.14.2: + resolution: {integrity: sha512-yCqNne6I8IB6rVCH7XUvlBK7/QKyqypBFGv+8dj4QBFJiiRX+FG7/nkdAvGElyvVZ/HQP5N19wzteuTARXi5Gw==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + + react@19.2.5: + resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + rolldown@1.0.0-rc.17: + resolution: {integrity: sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typescript-eslint@8.59.1: + resolution: {integrity: sha512-xqDcFVBmlrltH64lklOVp1wYxgJr6LVdg3NamBgH2OOQDLFdTKfIZXF5PfghrnXQKXZGTQs8tr1vL7fJvq8CTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + vite@8.0.10: + resolution: {integrity: sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@1.10.3: + resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} + engines: {node: '>= 6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + +snapshots: + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.3': {} + + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.3 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.29.3 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.29.2': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + + '@babel/parser@7.29.3': + dependencies: + '@babel/types': 7.29.0 + + '@babel/runtime@7.29.2': {} + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.3 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emotion/babel-plugin@11.13.5': + dependencies: + '@babel/helper-module-imports': 7.28.6 + '@babel/runtime': 7.29.2 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.14.0': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + + '@emotion/hash@0.9.2': {} + + '@emotion/is-prop-valid@1.4.0': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5)': + dependencies: + '@babel/runtime': 7.29.2 + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.5) + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 19.2.5 + optionalDependencies: + '@types/react': 19.2.14 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.3': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.2 + csstype: 3.2.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.5))(@types/react@19.2.14)(react@19.2.5)': + dependencies: + '@babel/runtime': 7.29.2 + '@emotion/babel-plugin': 11.13.5 + '@emotion/is-prop-valid': 1.4.0 + '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.5) + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.5) + '@emotion/utils': 1.4.2 + react: 19.2.5 + optionalDependencies: + '@types/react': 19.2.14 + transitivePeerDependencies: + - supports-color + + '@emotion/unitless@0.10.0': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.2.5)': + dependencies: + react: 19.2.5 + + '@emotion/utils@1.4.2': {} + + '@emotion/weak-memoize@0.4.0': {} + + '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0)': + dependencies: + eslint: 10.3.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.23.5': + dependencies: + '@eslint/object-schema': 3.0.5 + debug: 4.4.3 + minimatch: 10.2.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.5.5': + dependencies: + '@eslint/core': 1.2.1 + + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/js@10.0.1(eslint@10.3.0)': + optionalDependencies: + eslint: 10.3.0 + + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.1': + dependencies: + '@eslint/core': 1.2.1 + levn: 0.4.1 + + '@hookform/resolvers@5.2.2(react-hook-form@7.75.0(react@19.2.5))': + dependencies: + '@standard-schema/utils': 0.3.0 + react-hook-form: 7.75.0(react@19.2.5) + + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + + '@oxc-project/types@0.127.0': {} + + '@rolldown/binding-android-arm64@1.0.0-rc.17': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.17': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': + optional: true + + '@rolldown/pluginutils@1.0.0-rc.17': {} + + '@rolldown/pluginutils@1.0.0-rc.7': {} + + '@standard-schema/utils@0.3.0': {} + + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/esrecurse@4.3.1': {} + + '@types/estree@1.0.8': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@24.12.2': + dependencies: + undici-types: 7.16.0 + + '@types/parse-json@4.0.2': {} + + '@types/react-dom@19.2.3(@types/react@19.2.14)': + dependencies: + '@types/react': 19.2.14 + + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + + '@typescript-eslint/eslint-plugin@8.59.1(@typescript-eslint/parser@8.59.1(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.59.1(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.1 + '@typescript-eslint/type-utils': 8.59.1(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.1(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.1 + eslint: 10.3.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.59.1(eslint@10.3.0)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.59.1 + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.1 + debug: 4.4.3 + eslint: 10.3.0 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.59.1(typescript@6.0.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@6.0.3) + '@typescript-eslint/types': 8.59.1 + debug: 4.4.3 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.59.1': + dependencies: + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/visitor-keys': 8.59.1 + + '@typescript-eslint/tsconfig-utils@8.59.1(typescript@6.0.3)': + dependencies: + typescript: 6.0.3 + + '@typescript-eslint/type-utils@8.59.1(eslint@10.3.0)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.1(eslint@10.3.0)(typescript@6.0.3) + debug: 4.4.3 + eslint: 10.3.0 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.59.1': {} + + '@typescript-eslint/typescript-estree@8.59.1(typescript@6.0.3)': + dependencies: + '@typescript-eslint/project-service': 8.59.1(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.1(typescript@6.0.3) + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/visitor-keys': 8.59.1 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.7.4 + tinyglobby: 0.2.16 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.59.1(eslint@10.3.0)(typescript@6.0.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0) + '@typescript-eslint/scope-manager': 8.59.1 + '@typescript-eslint/types': 8.59.1 + '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) + eslint: 10.3.0 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.59.1': + dependencies: + '@typescript-eslint/types': 8.59.1 + eslint-visitor-keys: 5.0.1 + + '@vitejs/plugin-react@6.0.1(vite@8.0.10(@types/node@24.12.2))': + dependencies: + '@rolldown/pluginutils': 1.0.0-rc.7 + vite: 8.0.10(@types/node@24.12.2) + + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + asynckit@0.4.0: {} + + axios@1.16.0: + dependencies: + follow-redirects: 1.16.0 + form-data: 4.0.5 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.29.2 + cosmiconfig: 7.1.0 + resolve: 1.22.12 + + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.10.27: {} + + brace-expansion@5.0.5: + dependencies: + balanced-match: 4.0.4 + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.27 + caniuse-lite: 1.0.30001791 + electron-to-chromium: 1.5.349 + node-releases: 2.0.38 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001791: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + cookie@1.1.1: {} + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.3 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.2.3: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + delayed-stream@1.0.0: {} + + detect-libc@2.1.2: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.349: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.3 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-plugin-react-hooks@7.1.1(eslint@10.3.0): + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.3 + eslint: 10.3.0 + hermes-parser: 0.25.1 + zod: 4.4.3 + zod-validation-error: 4.0.2(zod@4.4.3) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-refresh@0.5.2(eslint@10.3.0): + dependencies: + eslint: 10.3.0 + + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.8 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@10.3.0: + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.5.5 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.1 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.15.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@11.2.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + find-root@1.1.0: {} + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + + flatted@3.4.2: {} + + follow-redirects@1.16.0: {} + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.3 + mime-types: 2.1.35 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.3.0: + 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.3 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@17.6.0: {} + + gopd@1.2.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.3: + dependencies: + function-bind: 1.1.2 + + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + is-arrayish@0.2.1: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.3 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + isexe@2.0.0: {} + + js-tokens@4.0.0: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + lines-and-columns@1.2.4: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + math-intrinsics@1.1.0: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.5 + + ms@2.1.3: {} + + nanoid@3.3.12: {} + + natural-compare@1.4.0: {} + + node-releases@2.0.38: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.0 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-type@4.0.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.4: {} + + postcss@8.5.13: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + proxy-from-env@2.1.0: {} + + punycode@2.3.1: {} + + react-dom@19.2.5(react@19.2.5): + dependencies: + react: 19.2.5 + scheduler: 0.27.0 + + react-hook-form@7.75.0(react@19.2.5): + dependencies: + react: 19.2.5 + + react-is@16.13.1: {} + + react-router@7.14.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + dependencies: + cookie: 1.1.1 + react: 19.2.5 + set-cookie-parser: 2.7.2 + optionalDependencies: + react-dom: 19.2.5(react@19.2.5) + + react@19.2.5: {} + + resolve-from@4.0.0: {} + + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rolldown@1.0.0-rc.17: + dependencies: + '@oxc-project/types': 0.127.0 + '@rolldown/pluginutils': 1.0.0-rc.17 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-x64': 1.0.0-rc.17 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.17 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.17 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.17 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.17 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.17 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.17 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17 + + scheduler@0.27.0: {} + + semver@6.3.1: {} + + semver@7.7.4: {} + + set-cookie-parser@2.7.2: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + source-map-js@1.2.1: {} + + source-map@0.5.7: {} + + stylis@4.2.0: {} + + supports-preserve-symlinks-flag@1.0.0: {} + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + ts-api-utils@2.5.0(typescript@6.0.3): + dependencies: + typescript: 6.0.3 + + tslib@2.8.1: + optional: true + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typescript-eslint@8.59.1(eslint@10.3.0)(typescript@6.0.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.59.1(@typescript-eslint/parser@8.59.1(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.1(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.1(eslint@10.3.0)(typescript@6.0.3) + eslint: 10.3.0 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + typescript@6.0.3: {} + + undici-types@7.16.0: {} + + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + vite@8.0.10(@types/node@24.12.2): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.13 + rolldown: 1.0.0-rc.17 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 24.12.2 + fsevents: 2.3.3 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + yallist@3.1.1: {} + + yaml@1.10.3: {} + + yocto-queue@0.1.0: {} + + zod-validation-error@4.0.2(zod@4.4.3): + dependencies: + zod: 4.4.3 + + zod@4.4.3: {} diff --git a/Week4/Homework/api-project/public/favicon.svg b/Week4/Homework/api-project/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/Week4/Homework/api-project/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Week4/Homework/api-project/public/icons.svg b/Week4/Homework/api-project/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/Week4/Homework/api-project/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Week4/Homework/api-project/src/App.tsx b/Week4/Homework/api-project/src/App.tsx new file mode 100644 index 0000000..a105043 --- /dev/null +++ b/Week4/Homework/api-project/src/App.tsx @@ -0,0 +1,8 @@ +import { RouterProvider } from "react-router/dom"; +import router from "./router/Router"; + +const App = () => { + return ; +}; + +export default App; diff --git a/Week4/Homework/api-project/src/apis/instance.ts b/Week4/Homework/api-project/src/apis/instance.ts new file mode 100644 index 0000000..a3917f4 --- /dev/null +++ b/Week4/Homework/api-project/src/apis/instance.ts @@ -0,0 +1,10 @@ +import axios from "axios"; + +const api = axios.create({ + baseURL: import.meta.env.VITE_API_BASE_URL, + headers: { + "Content-Type": "application/json", + }, +}); + +export default api; diff --git a/Week4/Homework/api-project/src/apis/user.ts b/Week4/Homework/api-project/src/apis/user.ts new file mode 100644 index 0000000..9c39af6 --- /dev/null +++ b/Week4/Homework/api-project/src/apis/user.ts @@ -0,0 +1,113 @@ +import axios from "axios"; +import api from "./instance"; +import type { + EditInfoRequestData, + LoginRequestData, + SignupRequestData, +} from "../types/userType"; + +/** + * 회원가입 + * @param data - 회원가입 요청 데이터 + * @returns + */ +export const postUser = async (data: SignupRequestData) => { + try { + const res = await api.post("/api/v1/auth/signup", data); + + if (res.data.success) { + return res.data; + } + } catch (error) { + if (axios.isAxiosError(error) && error.response?.data?.message) { + alert(error.response.data.message); // 서버 메시지 직접 사용자에게 표시 + } else { + alert("회원가입 중 오류가 발생했습니다."); + } + } +}; + +/** + * 로그인 + * @param data - 로그인 요청 데이터 + * @returns + */ +export const login = async (data: LoginRequestData) => { + try { + const res = await api.post("/api/v1/auth/signin", data); + if (res.data.success) { + return res.data.data; + } + } catch (error) { + if (axios.isAxiosError(error) && error.response?.data?.message) { + alert(error.response.data.message); + } else { + alert("로그인 중 오류가 발생했습니다."); + } + } +}; + +/** + * 내 정보 조회 + * @param userId - 유저 아이디 + * @returns + */ +export const getMyInfo = async (userId: number) => { + try { + const res = await api.get(`/api/v1/users/${userId}`); + if (res.data.success) { + console.log(res.data.data); + return res.data.data; + } + } catch (error) { + if (axios.isAxiosError(error) && error.response?.data?.message) { + alert(error.response.data.message); + } else { + alert("로그인 중 오류가 발생했습니다."); + } + } +}; + +/** + * 내 정보 수정 + * @param userId - 유저 아이디 + * @returns + */ +export const patchMyInfo = async ( + userId: number, + data: EditInfoRequestData, +) => { + try { + const res = await api.patch(`/api/v1/users/${userId}`, data); + if (res.data.success) { + console.log(res.data); + return res.data.data; + } + } catch (error) { + if (axios.isAxiosError(error) && error.response?.data?.message) { + alert(error.response.data.message); + } else { + alert("로그인 중 오류가 발생했습니다."); + } + } +}; + +/** + * 회원 목록 조회 + * @returns + */ +export const getUsers = async () => { + try { + const res = await api.get("/api/v1/users"); + if (res.data.success) { + console.log(res.data.data); + return res.data.data; + } + } catch (error) { + if (axios.isAxiosError(error) && error.response?.data?.message) { + alert(error.response.data.message); + } else { + alert("로그인 중 오류가 발생했습니다."); + } + } +}; diff --git a/Week4/Homework/api-project/src/components/auth/authFormLayout/AuthFormLayout.styles.ts b/Week4/Homework/api-project/src/components/auth/authFormLayout/AuthFormLayout.styles.ts new file mode 100644 index 0000000..5ea11b2 --- /dev/null +++ b/Week4/Homework/api-project/src/components/auth/authFormLayout/AuthFormLayout.styles.ts @@ -0,0 +1,39 @@ +import styled from "@emotion/styled"; + +export const Container = styled.section` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 20px; + width: 50%; + height: 100vh; + margin: 0 auto; +`; + +export const Title = styled.h2` + font-size: ${({ theme }) => theme.fontSizes.lg}; +`; + +export const FormContent = styled.div` + display: flex; + flex-direction: column; + gap: 20px; + width: 100%; +`; + +export const Form = styled.form` + display: flex; + flex-direction: column; + gap: 20px; + width: 100%; +`; + +export const ErrorMessage = styled.p` + color: ${({ theme }) => theme.colors.error}; + font-size: ${({ theme }) => theme.fontSizes.sm}; +`; + +export const BottomText = styled.p` + font-size: ${({ theme }) => theme.fontSizes.sm}; +`; diff --git a/Week4/Homework/api-project/src/components/auth/authFormLayout/AuthFormLayout.tsx b/Week4/Homework/api-project/src/components/auth/authFormLayout/AuthFormLayout.tsx new file mode 100644 index 0000000..9856870 --- /dev/null +++ b/Week4/Homework/api-project/src/components/auth/authFormLayout/AuthFormLayout.tsx @@ -0,0 +1,24 @@ +import type { ReactNode } from "react"; +import * as S from "./AuthFormLayout.styles"; + +interface AuthFormLayoutProps { + title: string; + children: ReactNode; + bottomContent?: ReactNode; +} + +const AuthFormLayout = ({ + title, + children, + bottomContent, +}: AuthFormLayoutProps) => { + return ( + + {title} + {children} + {bottomContent && {bottomContent}} + + ); +}; + +export default AuthFormLayout; diff --git a/Week4/Homework/api-project/src/components/common/button/Button.styles.ts b/Week4/Homework/api-project/src/components/common/button/Button.styles.ts new file mode 100644 index 0000000..4ab759d --- /dev/null +++ b/Week4/Homework/api-project/src/components/common/button/Button.styles.ts @@ -0,0 +1,14 @@ +import styled from "@emotion/styled"; + +export const Container = styled.button` + width: 100%; + padding: 10px; + color: ${({ theme }) => theme.colors.white}; + background-color: ${({ theme }) => theme.colors.button}; + border-radius: ${({ theme }) => theme.radius.sm}; + + &:disabled { + background-color: ${({ theme }) => theme.colors.buttonDisabled}; + cursor: default; + } +`; diff --git a/Week4/Homework/api-project/src/components/common/button/Button.tsx b/Week4/Homework/api-project/src/components/common/button/Button.tsx new file mode 100644 index 0000000..7aa47f6 --- /dev/null +++ b/Week4/Homework/api-project/src/components/common/button/Button.tsx @@ -0,0 +1,16 @@ +import type { ButtonHTMLAttributes, ReactNode } from "react"; +import * as S from "./Button.styles"; + +interface ButtonProps extends ButtonHTMLAttributes { + children: ReactNode; +} + +const Button = ({ children, type = "button", ...props }: ButtonProps) => { + return ( + + {children} + + ); +}; + +export default Button; diff --git a/Week4/Homework/api-project/src/components/common/header/Header.styles.ts b/Week4/Homework/api-project/src/components/common/header/Header.styles.ts new file mode 100644 index 0000000..6c093f9 --- /dev/null +++ b/Week4/Homework/api-project/src/components/common/header/Header.styles.ts @@ -0,0 +1,33 @@ +import styled from "@emotion/styled"; + +export const Container = styled.header` + position: fixed; + top: 0; + left: 0; + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px 50px; + color: ${({ theme }) => theme.colors.white}; + background-color: ${({ theme }) => theme.colors.primary}; +`; + +export const TitleAndGreet = styled.div` + display: flex; + flex-direction: column; +`; + +export const Title = styled.h1` + font-size: ${({ theme }) => theme.fontSizes.lg}; +`; + +export const Greet = styled.p` + font-size: ${({ theme }) => theme.fontSizes.sm}; +`; + +export const Nav = styled.nav` + display: flex; + gap: 16px; + font-size: ${({ theme }) => theme.fontSizes.sm}; +`; diff --git a/Week4/Homework/api-project/src/components/common/header/Header.tsx b/Week4/Homework/api-project/src/components/common/header/Header.tsx new file mode 100644 index 0000000..3cf8496 --- /dev/null +++ b/Week4/Homework/api-project/src/components/common/header/Header.tsx @@ -0,0 +1,20 @@ +import { Link } from "react-router"; +import * as S from "./Header.styles"; + +const Header = () => { + return ( + + + SOPT MEMBERS + 안녕하세요, {}님! + + + 내 정보 + 회원 조회 + 로그아웃 + + + ); +}; + +export default Header; diff --git a/Week4/Homework/api-project/src/components/common/input/dropDownInput/DropDownInput.styles.ts b/Week4/Homework/api-project/src/components/common/input/dropDownInput/DropDownInput.styles.ts new file mode 100644 index 0000000..cc036e0 --- /dev/null +++ b/Week4/Homework/api-project/src/components/common/input/dropDownInput/DropDownInput.styles.ts @@ -0,0 +1,18 @@ +import styled from "@emotion/styled"; + +export const Container = styled.div` + display: flex; + flex-direction: column; + gap: 10px; + width: 100%; +`; + +export const Label = styled.label` + font-size: ${({ theme }) => theme.fontSizes.sm}; +`; + +export const Select = styled.select` + padding: 10px; + border: 1px solid ${({ theme }) => theme.colors.border}; + border-radius: ${({ theme }) => theme.radius.sm}; +`; diff --git a/Week4/Homework/api-project/src/components/common/input/dropDownInput/DropDownInput.tsx b/Week4/Homework/api-project/src/components/common/input/dropDownInput/DropDownInput.tsx new file mode 100644 index 0000000..ab44dd7 --- /dev/null +++ b/Week4/Homework/api-project/src/components/common/input/dropDownInput/DropDownInput.tsx @@ -0,0 +1,29 @@ +import type { SelectHTMLAttributes } from "react"; +import * as S from "./DropDownInput.styles"; + +interface DropDownInputProps extends SelectHTMLAttributes { + label: string; + options: string[]; +} + +const DropDownInput = ({ + label, + options, + ...InputProps +}: DropDownInputProps) => { + return ( + + {label} + + + {options.map((option) => ( + + ))} + + + ); +}; + +export default DropDownInput; diff --git a/Week4/Homework/api-project/src/components/common/input/inputField/InputField.styles.ts b/Week4/Homework/api-project/src/components/common/input/inputField/InputField.styles.ts new file mode 100644 index 0000000..f3b8fb7 --- /dev/null +++ b/Week4/Homework/api-project/src/components/common/input/inputField/InputField.styles.ts @@ -0,0 +1,18 @@ +import styled from "@emotion/styled"; + +export const Container = styled.div` + display: flex; + flex-direction: column; + gap: 10px; + width: 100%; +`; + +export const Label = styled.label` + font-size: ${({ theme }) => theme.fontSizes.sm}; +`; + +export const Input = styled.input` + padding: 10px; + border: 1px solid ${({ theme }) => theme.colors.border}; + border-radius: ${({ theme }) => theme.radius.sm}; +`; diff --git a/Week4/Homework/api-project/src/components/common/input/inputField/InputField.tsx b/Week4/Homework/api-project/src/components/common/input/inputField/InputField.tsx new file mode 100644 index 0000000..e314345 --- /dev/null +++ b/Week4/Homework/api-project/src/components/common/input/inputField/InputField.tsx @@ -0,0 +1,21 @@ +import type { InputHTMLAttributes } from "react"; +import * as S from "./InputField.styles"; + +interface InputFieldProps extends InputHTMLAttributes { + label: string; +} + +const InputField = ({ + label, + type = "text", + ...inputProps +}: InputFieldProps) => { + return ( + + {label} + + + ); +}; + +export default InputField; diff --git a/Week4/Homework/api-project/src/components/mypage/InfoCard/InfoCard.styles.ts b/Week4/Homework/api-project/src/components/mypage/InfoCard/InfoCard.styles.ts new file mode 100644 index 0000000..90babf0 --- /dev/null +++ b/Week4/Homework/api-project/src/components/mypage/InfoCard/InfoCard.styles.ts @@ -0,0 +1,26 @@ +import styled from "@emotion/styled"; + +export const Container = styled.section` + display: flex; + flex-direction: column; + gap: 5px; + width: 100%; + padding: 20px; + background-color: ${({ theme }) => theme.colors.surface}; + border-radius: ${({ theme }) => theme.radius.lg}; +`; + +export const Info = styled.div` + display: flex; + justify-content: space-between; +`; + +export const InfoLabel = styled.span` + font-size: ${({ theme }) => theme.fontSizes.md}; + font-weight: 700; +`; + +export const InfoContent = styled.span` + font-size: ${({ theme }) => theme.fontSizes.sm}; + color: ${({ theme }) => theme.colors.textSub}; +`; diff --git a/Week4/Homework/api-project/src/components/mypage/InfoCard/InfoCard.tsx b/Week4/Homework/api-project/src/components/mypage/InfoCard/InfoCard.tsx new file mode 100644 index 0000000..bdd25b1 --- /dev/null +++ b/Week4/Homework/api-project/src/components/mypage/InfoCard/InfoCard.tsx @@ -0,0 +1,25 @@ +import * as S from "./InfoCard.styles"; + +interface InfoItem { + label: string; + value: string | number; +} + +interface InfoCardProps { + items: InfoItem[]; +} + +const InfoCard = ({ items }: InfoCardProps) => { + return ( + + {items.map((item) => ( + + {item.label} + {item.value} + + ))} + + ); +}; + +export default InfoCard; diff --git a/Week4/Homework/api-project/src/main.tsx b/Week4/Homework/api-project/src/main.tsx new file mode 100644 index 0000000..2bdf352 --- /dev/null +++ b/Week4/Homework/api-project/src/main.tsx @@ -0,0 +1,15 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import App from "./App.tsx"; +import GlobalStyle from "./styles/GlobalStyle.tsx"; +import { ThemeProvider } from "@emotion/react"; +import theme from "./styles/theme"; + +createRoot(document.getElementById("root")!).render( + + + + + + , +); diff --git a/Week4/Homework/api-project/src/pages/login/Login.tsx b/Week4/Homework/api-project/src/pages/login/Login.tsx new file mode 100644 index 0000000..9850e05 --- /dev/null +++ b/Week4/Homework/api-project/src/pages/login/Login.tsx @@ -0,0 +1,74 @@ +import { Link, useNavigate } from "react-router"; +import AuthFormLayout from "../../components/auth/authFormLayout/AuthFormLayout"; +import InputField from "../../components/common/input/inputField/InputField"; +import Button from "../../components/common/button/Button"; +import { useForm } from "react-hook-form"; +import { type LoginFormData, loginSchema } from "../../schemas/loginSchema"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { + ErrorMessage, + Form, +} from "../../components/auth/authFormLayout/AuthFormLayout.styles"; +import { login } from "../../apis/user"; + +const Login = () => { + const navigate = useNavigate(); + const { + register, + handleSubmit, + formState: { errors, isValid }, + } = useForm({ + resolver: zodResolver(loginSchema), + mode: "onChange", + defaultValues: { + id: "", + password: "", + }, + }); + + const onSubmit = async (data: LoginFormData) => { + if (!data) return; + + const requestBody = { + loginId: data.id, + password: data.password, + }; + + const res = await login(requestBody); + + if (!res) return; + + localStorage.setItem("userId", res.userId); + + navigate("/mypage"); + }; + + const errorMessage = errors.id?.message || errors.password?.message; + + return ( + 회원가입} + > +
+ + + {errorMessage && {errorMessage}} + + +
+ ); +}; + +export default Login; diff --git a/Week4/Homework/api-project/src/pages/memberDetail/MemberDetail.styles.ts b/Week4/Homework/api-project/src/pages/memberDetail/MemberDetail.styles.ts new file mode 100644 index 0000000..e8fc36c --- /dev/null +++ b/Week4/Homework/api-project/src/pages/memberDetail/MemberDetail.styles.ts @@ -0,0 +1,27 @@ +import styled from "@emotion/styled"; + +export const Container = styled.div` + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; + width: 50%; + margin: 150px auto; +`; + +export const Title = styled.h2` + font-size: ${({ theme }) => theme.fontSizes.lg}; +`; + +export const Content = styled.div` + display: flex; + flex-direction: column; + gap: 15px; + width: 100%; +`; + +export const GoBackBtn = styled.button` + width: fit-content; + color: ${({ theme }) => theme.colors.textSub}; + font-size: ${({ theme }) => theme.fontSizes.sm}; +`; diff --git a/Week4/Homework/api-project/src/pages/memberDetail/MemberDetail.tsx b/Week4/Homework/api-project/src/pages/memberDetail/MemberDetail.tsx new file mode 100644 index 0000000..0a66d16 --- /dev/null +++ b/Week4/Homework/api-project/src/pages/memberDetail/MemberDetail.tsx @@ -0,0 +1,24 @@ +import { Link } from "react-router"; +import InfoCard from "../../components/mypage/InfoCard/InfoCard"; +import * as S from "./MemberDetail.styles"; + +const MemberDetail = () => { + return ( + + 상세 정보 + + + ← 뒤로가기 + + + + + ); +}; + +export default MemberDetail; diff --git a/Week4/Homework/api-project/src/pages/members/Member.styles.ts b/Week4/Homework/api-project/src/pages/members/Member.styles.ts new file mode 100644 index 0000000..67d66ab --- /dev/null +++ b/Week4/Homework/api-project/src/pages/members/Member.styles.ts @@ -0,0 +1,8 @@ +import styled from "@emotion/styled"; + +export const Container = styled.section` + display: flex; + flex-direction: column; + gap: 50px; + padding-top: 150px; +`; diff --git a/Week4/Homework/api-project/src/pages/members/Members.tsx b/Week4/Homework/api-project/src/pages/members/Members.tsx new file mode 100644 index 0000000..d47d86e --- /dev/null +++ b/Week4/Homework/api-project/src/pages/members/Members.tsx @@ -0,0 +1,14 @@ +import ListSection from "./components/listSection/ListSection"; +import SearchSection from "./components/searchSection/SearchSection"; +import * as S from "./Member.styles"; + +const Members = () => { + return ( + + + + + ); +}; + +export default Members; diff --git a/Week4/Homework/api-project/src/pages/members/components/listSection/ListSection.styles.ts b/Week4/Homework/api-project/src/pages/members/components/listSection/ListSection.styles.ts new file mode 100644 index 0000000..cc2afbf --- /dev/null +++ b/Week4/Homework/api-project/src/pages/members/components/listSection/ListSection.styles.ts @@ -0,0 +1,20 @@ +import styled from "@emotion/styled"; + +export const Container = styled.section` + display: flex; + flex-direction: column; + gap: 15px; + width: 90%; + margin: 0 auto; +`; + +export const SectionTitle = styled.p` + font-size: ${({ theme }) => theme.fontSizes.md}; + font-weight: 700; +`; + +export const ListContainer = styled.div` + display: grid; + grid-template-columns: repeat(5, 1fr); + gap: 20px; +`; diff --git a/Week4/Homework/api-project/src/pages/members/components/listSection/ListSection.tsx b/Week4/Homework/api-project/src/pages/members/components/listSection/ListSection.tsx new file mode 100644 index 0000000..3943221 --- /dev/null +++ b/Week4/Homework/api-project/src/pages/members/components/listSection/ListSection.tsx @@ -0,0 +1,31 @@ +import { useEffect, useState } from "react"; +import * as S from "./ListSection.styles"; +import MemberCard from "./memberCard/MemberCard"; +import { getUsers } from "../../../../apis/user"; +import type { UserItem } from "../../../../types/userType"; + +const ListSection = () => { + const [userList, setUserList] = useState([]); + + useEffect(() => { + const fetchData = async () => { + const data = await getUsers(); + setUserList(data.users); + }; + + fetchData(); + }, []); + + return ( + + 전체 멤버 리스트 + + {userList.map((user) => ( + + ))} + + + ); +}; + +export default ListSection; diff --git a/Week4/Homework/api-project/src/pages/members/components/listSection/memberCard/MemberCard.styles.ts b/Week4/Homework/api-project/src/pages/members/components/listSection/memberCard/MemberCard.styles.ts new file mode 100644 index 0000000..c25e158 --- /dev/null +++ b/Week4/Homework/api-project/src/pages/members/components/listSection/memberCard/MemberCard.styles.ts @@ -0,0 +1,27 @@ +import styled from "@emotion/styled"; + +export const Container = styled.div` + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 5px; + min-width: 100px; + padding: 10px 0; + border-radius: ${({ theme }) => theme.radius.md}; + background-color: ${({ theme }) => theme.colors.white}; + cursor: pointer; +`; + +export const Name = styled.p` + font-size: ${({ theme }) => theme.fontSizes.sm}; + font-weight: 700; +`; + +export const Part = styled.p` + padding: 5px 10px; + background-color: ${({ theme }) => theme.colors.surface}; + border-radius: ${({ theme }) => theme.radius.md}; + font-size: ${({ theme }) => theme.fontSizes.xs}; + line-height: 1; +`; diff --git a/Week4/Homework/api-project/src/pages/members/components/listSection/memberCard/MemberCard.tsx b/Week4/Homework/api-project/src/pages/members/components/listSection/memberCard/MemberCard.tsx new file mode 100644 index 0000000..066a16c --- /dev/null +++ b/Week4/Homework/api-project/src/pages/members/components/listSection/memberCard/MemberCard.tsx @@ -0,0 +1,17 @@ +import * as S from "./MemberCard.styles"; + +interface MemberCardProps { + name: string; + part: string; +} + +const MemberCard = ({ name, part }: MemberCardProps) => { + return ( + + {name} + {part} + + ); +}; + +export default MemberCard; diff --git a/Week4/Homework/api-project/src/pages/members/components/searchSection/SearchSection.styles.ts b/Week4/Homework/api-project/src/pages/members/components/searchSection/SearchSection.styles.ts new file mode 100644 index 0000000..10fca36 --- /dev/null +++ b/Week4/Homework/api-project/src/pages/members/components/searchSection/SearchSection.styles.ts @@ -0,0 +1,26 @@ +import styled from "@emotion/styled"; + +export const SearchSection = styled.section` + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; + width: 50%; + margin: 0 auto; +`; + +export const Title = styled.h2` + font-size: ${({ theme }) => theme.fontSizes.lg}; +`; + +export const Result = styled.div` + display: flex; + flex-direction: column; + gap: 15px; + width: 100%; +`; + +export const ResultTitle = styled.p` + font-weight: 700; + font-size: ${({ theme }) => theme.fontSizes.md}; +`; diff --git a/Week4/Homework/api-project/src/pages/members/components/searchSection/SearchSection.tsx b/Week4/Homework/api-project/src/pages/members/components/searchSection/SearchSection.tsx new file mode 100644 index 0000000..bbda049 --- /dev/null +++ b/Week4/Homework/api-project/src/pages/members/components/searchSection/SearchSection.tsx @@ -0,0 +1,28 @@ +import { Form } from "../../../../components/auth/authFormLayout/AuthFormLayout.styles"; +import Button from "../../../../components/common/button/Button"; +import InputField from "../../../../components/common/input/inputField/InputField"; +import InfoCard from "../../../../components/mypage/InfoCard/InfoCard"; +import * as S from "./SearchSection.styles"; + +const SearchSection = () => { + return ( + + 회원 조회 +
+ + + + + 검색 결과 + + +
+ ); +}; + +export default SearchSection; diff --git a/Week4/Homework/api-project/src/pages/mypage/MyPage.tsx b/Week4/Homework/api-project/src/pages/mypage/MyPage.tsx new file mode 100644 index 0000000..7dea842 --- /dev/null +++ b/Week4/Homework/api-project/src/pages/mypage/MyPage.tsx @@ -0,0 +1,100 @@ +import { useEffect, useState } from "react"; +import AuthFormLayout from "../../components/auth/authFormLayout/AuthFormLayout"; +import { + ErrorMessage, + Form, +} from "../../components/auth/authFormLayout/AuthFormLayout.styles"; +import Button from "../../components/common/button/Button"; +import InputField from "../../components/common/input/inputField/InputField"; +import InfoCard from "../../components/mypage/InfoCard/InfoCard"; +import { getMyInfo, patchMyInfo } from "../../apis/user"; +import { type EditInfoRequestData, type UserInfo } from "../../types/userType"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { + editInfoSchema, + type EditInfoFormData, +} from "../../schemas/editInfoSchema"; + +const MyPage = () => { + const storedUserId = localStorage.getItem("userId"); + const userId = storedUserId ? Number(storedUserId) : null; + + const [userInfo, setUserInfo] = useState(null); + + const { + register, + handleSubmit, + reset, + formState: { errors, isValid }, + } = useForm({ + resolver: zodResolver(editInfoSchema), + mode: "onChange", + defaultValues: { + name: "", + email: "", + age: 0, + }, + }); + + useEffect(() => { + if (!userId) return; + + const fetchData = async () => { + const data = await getMyInfo(userId); + + setUserInfo(data); + + reset({ + name: data.name, + email: data.email, + age: data.age, + }); + }; + + fetchData(); + }, [userId, reset]); + + if (!userInfo) return null; + + const onSubmit = async (data: EditInfoRequestData) => { + if (!userId) return; + + const res = await patchMyInfo(userId, data); + if (res) { + alert("정보 저장에 성공하셨습니다."); + } + }; + + const errorMessage = + errors.name?.message || errors.email?.message || errors.age?.message; + + return ( + + +
+ + + + + + + {errorMessage && {errorMessage}} + + +
+ ); +}; + +export default MyPage; diff --git a/Week4/Homework/api-project/src/pages/mypage/components/MyPageLayout.tsx b/Week4/Homework/api-project/src/pages/mypage/components/MyPageLayout.tsx new file mode 100644 index 0000000..3b8160a --- /dev/null +++ b/Week4/Homework/api-project/src/pages/mypage/components/MyPageLayout.tsx @@ -0,0 +1,13 @@ +import { Outlet } from "react-router"; +import Header from "../../../components/common/header/Header"; + +const MyPageLayout = () => { + return ( + <> +
+ + + ); +}; + +export default MyPageLayout; diff --git a/Week4/Homework/api-project/src/pages/signup/Signup.tsx b/Week4/Homework/api-project/src/pages/signup/Signup.tsx new file mode 100644 index 0000000..4db3844 --- /dev/null +++ b/Week4/Homework/api-project/src/pages/signup/Signup.tsx @@ -0,0 +1,76 @@ +import { Link } from "react-router"; +import AuthFormLayout from "../../components/auth/authFormLayout/AuthFormLayout"; +import SignupID from "./components/SignupID"; +import { useState } from "react"; +import SignupPassword from "./components/SignupPassword"; +import SignupInfo from "./components/SignupInfo"; +import type { + SignupFormData, + SignupIDFormData, + SignupInfoFormData, + SignupPasswordFormData, +} from "../../schemas/signupSchema"; +import { postUser } from "../../apis/user"; + +const Signup = () => { + const [step, setStep] = useState(1); + const [signupData, setSignupData] = useState>({}); + + const handleNextIdStep = (data: SignupIDFormData) => { + setSignupData((prev) => ({ + ...prev, + ...data, + })); + + setStep(2); + }; + + const handleNextPasswordStep = (data: SignupPasswordFormData) => { + setSignupData((prev) => ({ + ...prev, + ...data, + })); + + setStep(3); + }; + + const handleSignupSubmit = async (data: SignupInfoFormData) => { + const finalSignupData = { + ...signupData, + ...data, + }; + + if (!finalSignupData.id || !finalSignupData.password) { + alert("회원가입을 처음부터 다시 진행해주세요."); + return; + } + + const requestBody = { + loginId: finalSignupData.id, + password: finalSignupData.password, + name: finalSignupData.name, + email: finalSignupData.email, + age: finalSignupData.age, + part: finalSignupData.part, + }; + + await postUser(requestBody); + }; + + return ( + + 이미 계정이 있나요? 로그인 + + } + > + {step === 1 && } + {step === 2 && } + {step === 3 && } + + ); +}; + +export default Signup; diff --git a/Week4/Homework/api-project/src/pages/signup/components/SignupID.tsx b/Week4/Homework/api-project/src/pages/signup/components/SignupID.tsx new file mode 100644 index 0000000..db3cafe --- /dev/null +++ b/Week4/Homework/api-project/src/pages/signup/components/SignupID.tsx @@ -0,0 +1,48 @@ +import { useForm } from "react-hook-form"; +import Button from "../../../components/common/button/Button"; +import InputField from "../../../components/common/input/inputField/InputField"; +import { ErrorMessage } from "../../../components/auth/authFormLayout/AuthFormLayout.styles"; +import { + signupIDSchema, + type SignupIDFormData, +} from "../../../schemas/signupSchema"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { Form } from "../../../components/auth/authFormLayout/AuthFormLayout.styles"; + +interface SignupIDProps { + onNext: (data: SignupIDFormData) => void; +} + +const SignupID = ({ onNext }: SignupIDProps) => { + const { + register, + handleSubmit, + formState: { errors, isValid }, + } = useForm({ + resolver: zodResolver(signupIDSchema), + mode: "onChange", + defaultValues: { + id: "", + }, + }); + + const onSubmit = (data: SignupIDFormData) => { + onNext(data); + }; + + return ( +
+ + {errors.id && {errors.id.message}} + + + ); +}; + +export default SignupID; diff --git a/Week4/Homework/api-project/src/pages/signup/components/SignupInfo.tsx b/Week4/Homework/api-project/src/pages/signup/components/SignupInfo.tsx new file mode 100644 index 0000000..8fed553 --- /dev/null +++ b/Week4/Homework/api-project/src/pages/signup/components/SignupInfo.tsx @@ -0,0 +1,70 @@ +import { useForm } from "react-hook-form"; +import Button from "../../../components/common/button/Button"; +import InputField from "../../../components/common/input/inputField/InputField"; +import { + signupInfoSchema, + type SignupInfoFormData, +} from "../../../schemas/signupSchema"; +import { zodResolver } from "@hookform/resolvers/zod"; +import DropDownInput from "../../../components/common/input/dropDownInput/DropDownInput"; +import { Form } from "../../../components/auth/authFormLayout/AuthFormLayout.styles"; +import { ErrorMessage } from "./../../../components/auth/authFormLayout/AuthFormLayout.styles"; + +const partList = ["웹", "iOS", "안드로이드"]; + +interface SignupInfoProps { + onSubmitSignup: (data: SignupInfoFormData) => void; +} + +const SignupInfo = ({ onSubmitSignup }: SignupInfoProps) => { + const { + register, + handleSubmit, + formState: { errors, isValid }, + } = useForm({ + resolver: zodResolver(signupInfoSchema), + mode: "onChange", + defaultValues: { + name: "", + email: "", + part: "", + }, + }); + + const onSubmit = (data: SignupInfoFormData) => { + onSubmitSignup(data); + }; + + const errorMessage = + errors.name?.message || + errors.email?.message || + errors.age?.message || + errors.part?.message; + + return ( +
+ + + + + {errorMessage && {errorMessage}} + + + ); +}; + +export default SignupInfo; diff --git a/Week4/Homework/api-project/src/pages/signup/components/SignupPassword.tsx b/Week4/Homework/api-project/src/pages/signup/components/SignupPassword.tsx new file mode 100644 index 0000000..a82815d --- /dev/null +++ b/Week4/Homework/api-project/src/pages/signup/components/SignupPassword.tsx @@ -0,0 +1,59 @@ +import { useForm } from "react-hook-form"; +import Button from "../../../components/common/button/Button"; +import InputField from "../../../components/common/input/inputField/InputField"; +import { ErrorMessage } from "../../../components/auth/authFormLayout/AuthFormLayout.styles"; +import { + signupPasswordSchema, + type SignupPasswordFormData, +} from "../../../schemas/signupSchema"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { Form } from "../../../components/auth/authFormLayout/AuthFormLayout.styles"; + +interface SignupPasswordProps { + onNext: (data: SignupPasswordFormData) => void; +} + +const SignupPassword = ({ onNext }: SignupPasswordProps) => { + const { + register, + handleSubmit, + formState: { errors, isValid }, + } = useForm({ + resolver: zodResolver(signupPasswordSchema), + mode: "onChange", + defaultValues: { + password: "", + confirmPassword: "", + }, + }); + + const onSubmit = (data: SignupPasswordFormData) => { + onNext(data); + }; + + const errorMessage = + errors.password?.message || errors.confirmPassword?.message; + + return ( +
+ + + {errorMessage && {errorMessage}} + + + ); +}; + +export default SignupPassword; diff --git a/Week4/Homework/api-project/src/router/Router.tsx b/Week4/Homework/api-project/src/router/Router.tsx new file mode 100644 index 0000000..1ac035d --- /dev/null +++ b/Week4/Homework/api-project/src/router/Router.tsx @@ -0,0 +1,23 @@ +import { createBrowserRouter } from "react-router"; +import Login from "../pages/login/Login"; +import Signup from "../pages/signup/Signup"; +import MyPage from "../pages/mypage/MyPage"; +import Members from "../pages/members/Members"; +import MyPageLayout from "../pages/mypage/components/MyPageLayout"; +import MemberDetail from "../pages/memberDetail/MemberDetail"; + +const router = createBrowserRouter([ + { path: "/login", Component: Login }, + { path: "/signup", Component: Signup }, + { + path: "/mypage", + Component: MyPageLayout, + children: [ + { index: true, Component: MyPage }, + { path: "members", Component: Members }, + { path: "members/:memberId", Component: MemberDetail }, + ], + }, +]); + +export default router; diff --git a/Week4/Homework/api-project/src/schemas/editInfoSchema.ts b/Week4/Homework/api-project/src/schemas/editInfoSchema.ts new file mode 100644 index 0000000..43748fe --- /dev/null +++ b/Week4/Homework/api-project/src/schemas/editInfoSchema.ts @@ -0,0 +1,19 @@ +import z from "zod"; + +export const editInfoSchema = z.object({ + name: z + .string() + .trim() + .min(1, "이름을 입력해주세요.") + .max(10, "이름을 바르게 입력해주세요."), + email: z + .string() + .trim() + .min(1, "이메일을 입력해주세요.") + .pipe(z.email("올바른 이메일 형식이 아닙니다.")), + age: z + .number("나이는 숫자로 입력해주세요.") + .int("올바른 나이를 입력해주세요."), +}); + +export type EditInfoFormData = z.infer; diff --git a/Week4/Homework/api-project/src/schemas/loginSchema.ts b/Week4/Homework/api-project/src/schemas/loginSchema.ts new file mode 100644 index 0000000..8e74a42 --- /dev/null +++ b/Week4/Homework/api-project/src/schemas/loginSchema.ts @@ -0,0 +1,8 @@ +import z from "zod"; + +export const loginSchema = z.object({ + id: z.string().trim().min(1, "아이디를 입력해주세요."), + password: z.string().min(1, "비밀번호를 입력해주세요."), +}); + +export type LoginFormData = z.infer; diff --git a/Week4/Homework/api-project/src/schemas/signupSchema.ts b/Week4/Homework/api-project/src/schemas/signupSchema.ts new file mode 100644 index 0000000..02fa33d --- /dev/null +++ b/Week4/Homework/api-project/src/schemas/signupSchema.ts @@ -0,0 +1,52 @@ +import z from "zod"; + +export const signupIDSchema = z.object({ + id: z + .string() + .trim() + .min(1, "아이디를 입력해주세요.") + .max(20, "아이디는 20자를 넘을 수 없습니다."), +}); + +export const signupPasswordSchema = z + .object({ + password: z + .string() + .min(8, "비밀번호를 8자 이상 입력해주세요.") + .max(20, "비밀번호를 20자 이하로 입력해주세요.") + .regex(/^\S*$/, "비밀번호에는 공백을 사용할 수 없습니다.") + .regex( + /^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^*+=-])[A-Za-z\d!@#$%^*+=-]{8,20}$/, + "비밀번호는 영문자, 숫자, 특수문자를 포함해야 합니다.", + ), + confirmPassword: z.string().min(1, "비밀번호 확인을 진행해주세요."), + }) + .refine((data) => data.password === data.confirmPassword, { + path: ["confirmPassword"], + message: "비밀번호가 일치하지 않습니다.", + }); + +export const signupInfoSchema = z.object({ + name: z + .string() + .trim() + .min(1, "이름을 입력해주세요.") + .max(10, "이름을 바르게 입력해주세요."), + email: z + .string() + .trim() + .min(1, "이메일을 입력해주세요.") + .pipe(z.email("올바른 이메일 형식이 아닙니다.")), + age: z + .number("나이는 숫자로 입력해주세요.") + .int("올바른 나이를 입력해주세요."), + part: z.string().min(1, "파트를 선택해주세요."), +}); + +export type SignupIDFormData = z.infer; +export type SignupPasswordFormData = z.infer; +export type SignupInfoFormData = z.infer; + +export type SignupFormData = SignupIDFormData & + SignupPasswordFormData & + SignupInfoFormData; diff --git a/Week4/Homework/api-project/src/styles/GlobalStyle.tsx b/Week4/Homework/api-project/src/styles/GlobalStyle.tsx new file mode 100644 index 0000000..9b661a5 --- /dev/null +++ b/Week4/Homework/api-project/src/styles/GlobalStyle.tsx @@ -0,0 +1,52 @@ +import { css, Global, useTheme } from "@emotion/react"; + +const GlobalStyle = () => { + const theme = useTheme(); + + return ( + + ); +}; + +export default GlobalStyle; diff --git a/Week4/Homework/api-project/src/styles/emotion.d.ts b/Week4/Homework/api-project/src/styles/emotion.d.ts new file mode 100644 index 0000000..7765cc2 --- /dev/null +++ b/Week4/Homework/api-project/src/styles/emotion.d.ts @@ -0,0 +1,10 @@ +import "@emotion/react"; +import type { CustomTheme } from "./theme"; + +declare module "@emotion/react" { + export interface Theme { + colors: CustomTheme["colors"]; + fontSizes: CustomTheme["fontSizes"]; + radius: CustomTheme["radius"]; + } +} diff --git a/Week4/Homework/api-project/src/styles/theme.ts b/Week4/Homework/api-project/src/styles/theme.ts new file mode 100644 index 0000000..c87d058 --- /dev/null +++ b/Week4/Homework/api-project/src/styles/theme.ts @@ -0,0 +1,38 @@ +const theme = { + colors: { + primary: "#102A43", // 메인 컬러: 헤더, 주요 텍스트, 강조 영역 + primaryLight: "#183B56", // 메인 컬러보다 살짝 밝은 색: hover, 서브 헤더, 보조 강조 + + button: "#38BDF8", + buttonHover: "#0284C7", + buttonDisabled: "#CBD5E1", + + background: "#F1F5F9", //전체 배경 + surface: "#edede8", //콘텐츠 영역 배경 색 + + textMain: "#1E293B", + textSub: "#8595aca5", + + border: "#CBD5E1", + + error: "#EF4444", + white: "#FFFFFF", + }, + + fontSizes: { + lg: "1.5rem", + md: "1rem", + sm: "0.875rem", + xs: "0.75rem", + }, + + radius: { + sm: "6px", + md: "10px", + lg: "16px", + }, +}; + +export default theme; + +export type CustomTheme = typeof theme; diff --git a/Week4/Homework/api-project/src/types/userType.ts b/Week4/Homework/api-project/src/types/userType.ts new file mode 100644 index 0000000..c193218 --- /dev/null +++ b/Week4/Homework/api-project/src/types/userType.ts @@ -0,0 +1,34 @@ +export interface SignupRequestData { + loginId: string; + password: string; + name: string; + email: string; + age: number; + part: string; +} + +export interface LoginRequestData { + loginId: string; + password: string; +} + +export interface EditInfoRequestData { + name: string; + email: string; + age: number; +} + +export interface UserInfo { + age: number; + email: string; + id: number; + loginId: string; + name: string; + part: string; +} + +export interface UserItem { + id: number; + name: string; + part: string; +} diff --git a/Week4/Homework/api-project/tsconfig.app.json b/Week4/Homework/api-project/tsconfig.app.json new file mode 100644 index 0000000..7f42e5f --- /dev/null +++ b/Week4/Homework/api-project/tsconfig.app.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023", "DOM"], + "module": "esnext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/Week4/Homework/api-project/tsconfig.json b/Week4/Homework/api-project/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/Week4/Homework/api-project/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/Week4/Homework/api-project/tsconfig.node.json b/Week4/Homework/api-project/tsconfig.node.json new file mode 100644 index 0000000..d3c52ea --- /dev/null +++ b/Week4/Homework/api-project/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023"], + "module": "esnext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/Week4/Homework/api-project/vite.config.ts b/Week4/Homework/api-project/vite.config.ts new file mode 100644 index 0000000..8b0f57b --- /dev/null +++ b/Week4/Homework/api-project/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) From 24eda0ca8d57799b92c221678aea321ff45b42cc Mon Sep 17 00:00:00 2001 From: Jina Date: Sat, 9 May 2026 00:47:27 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20=EC=83=81=EC=84=B8=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week4/Homework/api-project/src/apis/user.ts | 9 ++---- .../src/pages/memberDetail/MemberDetail.tsx | 29 +++++++++++++++++-- .../components/listSection/ListSection.tsx | 2 +- .../listSection/memberCard/MemberCard.tsx | 15 ++++++---- .../api-project/src/pages/signup/Signup.tsx | 9 ++++-- .../api-project/src/router/Router.tsx | 2 +- 6 files changed, 47 insertions(+), 19 deletions(-) diff --git a/Week4/Homework/api-project/src/apis/user.ts b/Week4/Homework/api-project/src/apis/user.ts index 9c39af6..565ad48 100644 --- a/Week4/Homework/api-project/src/apis/user.ts +++ b/Week4/Homework/api-project/src/apis/user.ts @@ -56,14 +56,13 @@ export const getMyInfo = async (userId: number) => { try { const res = await api.get(`/api/v1/users/${userId}`); if (res.data.success) { - console.log(res.data.data); return res.data.data; } } catch (error) { if (axios.isAxiosError(error) && error.response?.data?.message) { alert(error.response.data.message); } else { - alert("로그인 중 오류가 발생했습니다."); + alert("정보 조회 중 오류가 발생했습니다."); } } }; @@ -80,14 +79,13 @@ export const patchMyInfo = async ( try { const res = await api.patch(`/api/v1/users/${userId}`, data); if (res.data.success) { - console.log(res.data); return res.data.data; } } catch (error) { if (axios.isAxiosError(error) && error.response?.data?.message) { alert(error.response.data.message); } else { - alert("로그인 중 오류가 발생했습니다."); + alert("정보 수정에 오류가 발생했습니다."); } } }; @@ -100,14 +98,13 @@ export const getUsers = async () => { try { const res = await api.get("/api/v1/users"); if (res.data.success) { - console.log(res.data.data); return res.data.data; } } catch (error) { if (axios.isAxiosError(error) && error.response?.data?.message) { alert(error.response.data.message); } else { - alert("로그인 중 오류가 발생했습니다."); + alert("목록 조회 중 오류가 발생했습니다."); } } }; diff --git a/Week4/Homework/api-project/src/pages/memberDetail/MemberDetail.tsx b/Week4/Homework/api-project/src/pages/memberDetail/MemberDetail.tsx index 0a66d16..57107a4 100644 --- a/Week4/Homework/api-project/src/pages/memberDetail/MemberDetail.tsx +++ b/Week4/Homework/api-project/src/pages/memberDetail/MemberDetail.tsx @@ -1,8 +1,28 @@ -import { Link } from "react-router"; +import { Link, useParams } from "react-router"; import InfoCard from "../../components/mypage/InfoCard/InfoCard"; import * as S from "./MemberDetail.styles"; +import { useEffect, useState } from "react"; +import { getMyInfo } from "../../apis/user"; +import type { UserInfo } from "../../types/userType"; const MemberDetail = () => { + const { userId } = useParams(); + const [userInfo, setUserInfo] = useState(null); + + useEffect(() => { + if (!userId) return; + + const fetchData = async () => { + const data = await getMyInfo(Number(userId)); + + setUserInfo(data); + }; + + fetchData(); + }, [userId]); + + if (!userInfo) return null; + return ( 상세 정보 @@ -12,8 +32,11 @@ const MemberDetail = () => { diff --git a/Week4/Homework/api-project/src/pages/members/components/listSection/ListSection.tsx b/Week4/Homework/api-project/src/pages/members/components/listSection/ListSection.tsx index 3943221..aaafb27 100644 --- a/Week4/Homework/api-project/src/pages/members/components/listSection/ListSection.tsx +++ b/Week4/Homework/api-project/src/pages/members/components/listSection/ListSection.tsx @@ -21,7 +21,7 @@ const ListSection = () => { 전체 멤버 리스트 {userList.map((user) => ( - + ))} diff --git a/Week4/Homework/api-project/src/pages/members/components/listSection/memberCard/MemberCard.tsx b/Week4/Homework/api-project/src/pages/members/components/listSection/memberCard/MemberCard.tsx index 066a16c..79f6ece 100644 --- a/Week4/Homework/api-project/src/pages/members/components/listSection/memberCard/MemberCard.tsx +++ b/Week4/Homework/api-project/src/pages/members/components/listSection/memberCard/MemberCard.tsx @@ -1,15 +1,18 @@ +import { useNavigate } from "react-router"; import * as S from "./MemberCard.styles"; +import type { UserItem } from "../../../../../types/userType"; interface MemberCardProps { - name: string; - part: string; + user: UserItem; } -const MemberCard = ({ name, part }: MemberCardProps) => { +const MemberCard = ({ user }: MemberCardProps) => { + const navigate = useNavigate(); + return ( - - {name} - {part} + navigate(`${user.id}`)}> + {user.name} + {user.part} ); }; diff --git a/Week4/Homework/api-project/src/pages/signup/Signup.tsx b/Week4/Homework/api-project/src/pages/signup/Signup.tsx index 4db3844..35c378e 100644 --- a/Week4/Homework/api-project/src/pages/signup/Signup.tsx +++ b/Week4/Homework/api-project/src/pages/signup/Signup.tsx @@ -1,4 +1,4 @@ -import { Link } from "react-router"; +import { Link, useNavigate } from "react-router"; import AuthFormLayout from "../../components/auth/authFormLayout/AuthFormLayout"; import SignupID from "./components/SignupID"; import { useState } from "react"; @@ -15,6 +15,7 @@ import { postUser } from "../../apis/user"; const Signup = () => { const [step, setStep] = useState(1); const [signupData, setSignupData] = useState>({}); + const navigate = useNavigate(); const handleNextIdStep = (data: SignupIDFormData) => { setSignupData((prev) => ({ @@ -54,7 +55,11 @@ const Signup = () => { part: finalSignupData.part, }; - await postUser(requestBody); + const res = await postUser(requestBody); + if (res) { + alert(`${finalSignupData.name}님 환영합니다!`); + navigate("/login"); + } }; return ( diff --git a/Week4/Homework/api-project/src/router/Router.tsx b/Week4/Homework/api-project/src/router/Router.tsx index 1ac035d..583fd56 100644 --- a/Week4/Homework/api-project/src/router/Router.tsx +++ b/Week4/Homework/api-project/src/router/Router.tsx @@ -15,7 +15,7 @@ const router = createBrowserRouter([ children: [ { index: true, Component: MyPage }, { path: "members", Component: Members }, - { path: "members/:memberId", Component: MemberDetail }, + { path: "members/:userId", Component: MemberDetail }, ], }, ]); From b6fd30f13eb1084c5023102071b5f08f89e108d7 Mon Sep 17 00:00:00 2001 From: Jina Date: Sat, 9 May 2026 02:34:42 +0900 Subject: [PATCH 3/6] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/common/header/Header.tsx | 13 ++++- .../searchSection/SearchSection.styles.ts | 12 +++++ .../searchSection/SearchSection.tsx | 50 +++++++++++++++---- .../api-project/src/styles/GlobalStyle.tsx | 1 + 4 files changed, 65 insertions(+), 11 deletions(-) diff --git a/Week4/Homework/api-project/src/components/common/header/Header.tsx b/Week4/Homework/api-project/src/components/common/header/Header.tsx index 3cf8496..7a75efb 100644 --- a/Week4/Homework/api-project/src/components/common/header/Header.tsx +++ b/Week4/Homework/api-project/src/components/common/header/Header.tsx @@ -1,7 +1,14 @@ -import { Link } from "react-router"; +import { Link, useNavigate } from "react-router"; import * as S from "./Header.styles"; const Header = () => { + const navigate = useNavigate(); + + const handleLogout = () => { + localStorage.removeItem("userId"); + navigate("/login"); + }; + return ( @@ -11,7 +18,9 @@ const Header = () => { 내 정보 회원 조회 - 로그아웃 + ); diff --git a/Week4/Homework/api-project/src/pages/members/components/searchSection/SearchSection.styles.ts b/Week4/Homework/api-project/src/pages/members/components/searchSection/SearchSection.styles.ts index 10fca36..0b69046 100644 --- a/Week4/Homework/api-project/src/pages/members/components/searchSection/SearchSection.styles.ts +++ b/Week4/Homework/api-project/src/pages/members/components/searchSection/SearchSection.styles.ts @@ -24,3 +24,15 @@ export const ResultTitle = styled.p` font-weight: 700; font-size: ${({ theme }) => theme.fontSizes.md}; `; + +export const EmptyCard = styled.div` + display: flex; + flex-direction: column; + gap: 5px; + width: 100%; + padding: 20px; + background-color: ${({ theme }) => theme.colors.surface}; + border-radius: ${({ theme }) => theme.radius.lg}; + font-size: ${({ theme }) => theme.fontSizes.sm}; + color: ${({ theme }) => theme.colors.textSub}; +`; diff --git a/Week4/Homework/api-project/src/pages/members/components/searchSection/SearchSection.tsx b/Week4/Homework/api-project/src/pages/members/components/searchSection/SearchSection.tsx index bbda049..ecb48f8 100644 --- a/Week4/Homework/api-project/src/pages/members/components/searchSection/SearchSection.tsx +++ b/Week4/Homework/api-project/src/pages/members/components/searchSection/SearchSection.tsx @@ -1,25 +1,57 @@ +import { useState, type ChangeEvent, type SyntheticEvent } from "react"; import { Form } from "../../../../components/auth/authFormLayout/AuthFormLayout.styles"; import Button from "../../../../components/common/button/Button"; import InputField from "../../../../components/common/input/inputField/InputField"; import InfoCard from "../../../../components/mypage/InfoCard/InfoCard"; import * as S from "./SearchSection.styles"; +import type { UserInfo } from "../../../../types/userType"; +import { getMyInfo } from "../../../../apis/user"; const SearchSection = () => { + const [searchId, setSearchId] = useState(""); + const [searchedUser, setSearchedUser] = useState(null); + + const handleChangeInput = (e: ChangeEvent) => { + setSearchId(e.target.value); + }; + + const handleSearchUser = async ( + e: SyntheticEvent, + ) => { + e.preventDefault(); + + const data = await getMyInfo(Number(searchId)); + setSearchedUser(data); + }; + return ( 회원 조회 -
- - + + + 검색 결과 - + {searchedUser ? ( + + ) : ( + 원하는 ID를 검색해보세요! + )}
); diff --git a/Week4/Homework/api-project/src/styles/GlobalStyle.tsx b/Week4/Homework/api-project/src/styles/GlobalStyle.tsx index 9b661a5..60f5499 100644 --- a/Week4/Homework/api-project/src/styles/GlobalStyle.tsx +++ b/Week4/Homework/api-project/src/styles/GlobalStyle.tsx @@ -35,6 +35,7 @@ const GlobalStyle = () => { } button { + color: ${theme.colors.white}; background-color: transparent; border: none; cursor: pointer; From ef58aa270fc3a83550f4d6c15149d47624388f03 Mon Sep 17 00:00:00 2001 From: Jina Date: Sat, 9 May 2026 03:47:08 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat:=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=ED=86=A0=EA=B8=80=EB=B2=84=ED=8A=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=ED=97=A4=EB=8D=94=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=20=EC=B6=9C=EB=A0=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/common/header/Header.tsx | 8 +++- .../input/inputField/InputField.styles.ts | 9 ++++- .../common/input/inputField/InputField.tsx | 16 +++++++- .../api-project/src/pages/mypage/MyPage.tsx | 38 ++++++------------- .../pages/mypage/components/MyPageLayout.tsx | 25 +++++++++++- .../api-project/src/styles/GlobalStyle.tsx | 9 ++++- 6 files changed, 70 insertions(+), 35 deletions(-) diff --git a/Week4/Homework/api-project/src/components/common/header/Header.tsx b/Week4/Homework/api-project/src/components/common/header/Header.tsx index 7a75efb..29b7346 100644 --- a/Week4/Homework/api-project/src/components/common/header/Header.tsx +++ b/Week4/Homework/api-project/src/components/common/header/Header.tsx @@ -1,7 +1,11 @@ import { Link, useNavigate } from "react-router"; import * as S from "./Header.styles"; -const Header = () => { +interface HeaderProps { + name: string; +} + +const Header = ({ name }: HeaderProps) => { const navigate = useNavigate(); const handleLogout = () => { @@ -13,7 +17,7 @@ const Header = () => { SOPT MEMBERS - 안녕하세요, {}님! + 안녕하세요, {name}님! 내 정보 diff --git a/Week4/Homework/api-project/src/components/common/input/inputField/InputField.styles.ts b/Week4/Homework/api-project/src/components/common/input/inputField/InputField.styles.ts index f3b8fb7..a0bd8b5 100644 --- a/Week4/Homework/api-project/src/components/common/input/inputField/InputField.styles.ts +++ b/Week4/Homework/api-project/src/components/common/input/inputField/InputField.styles.ts @@ -11,8 +11,15 @@ export const Label = styled.label` font-size: ${({ theme }) => theme.fontSizes.sm}; `; -export const Input = styled.input` +export const InputWrapper = styled.div` + display: flex; + align-items: center; + width: 100%; padding: 10px; border: 1px solid ${({ theme }) => theme.colors.border}; border-radius: ${({ theme }) => theme.radius.sm}; `; + +export const Input = styled.input` + width: 100%; +`; diff --git a/Week4/Homework/api-project/src/components/common/input/inputField/InputField.tsx b/Week4/Homework/api-project/src/components/common/input/inputField/InputField.tsx index e314345..c09caf2 100644 --- a/Week4/Homework/api-project/src/components/common/input/inputField/InputField.tsx +++ b/Week4/Homework/api-project/src/components/common/input/inputField/InputField.tsx @@ -1,4 +1,4 @@ -import type { InputHTMLAttributes } from "react"; +import { useState, type InputHTMLAttributes } from "react"; import * as S from "./InputField.styles"; interface InputFieldProps extends InputHTMLAttributes { @@ -10,10 +10,22 @@ const InputField = ({ type = "text", ...inputProps }: InputFieldProps) => { + const [isVisible, setVisible] = useState(false); + const isPassword = type === "password"; + + const inputType = isPassword ? (isVisible ? "text" : "password") : type; + return ( {label} - + + + {isPassword && ( + + )} + ); }; diff --git a/Week4/Homework/api-project/src/pages/mypage/MyPage.tsx b/Week4/Homework/api-project/src/pages/mypage/MyPage.tsx index 7dea842..5d3f5bf 100644 --- a/Week4/Homework/api-project/src/pages/mypage/MyPage.tsx +++ b/Week4/Homework/api-project/src/pages/mypage/MyPage.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from "react"; +import { useEffect } from "react"; import AuthFormLayout from "../../components/auth/authFormLayout/AuthFormLayout"; import { ErrorMessage, @@ -7,7 +7,7 @@ import { import Button from "../../components/common/button/Button"; import InputField from "../../components/common/input/inputField/InputField"; import InfoCard from "../../components/mypage/InfoCard/InfoCard"; -import { getMyInfo, patchMyInfo } from "../../apis/user"; +import { patchMyInfo } from "../../apis/user"; import { type EditInfoRequestData, type UserInfo } from "../../types/userType"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; @@ -15,12 +15,10 @@ import { editInfoSchema, type EditInfoFormData, } from "../../schemas/editInfoSchema"; +import { useOutletContext } from "react-router"; const MyPage = () => { - const storedUserId = localStorage.getItem("userId"); - const userId = storedUserId ? Number(storedUserId) : null; - - const [userInfo, setUserInfo] = useState(null); + const userInfo = useOutletContext(); const { register, @@ -38,29 +36,15 @@ const MyPage = () => { }); useEffect(() => { - if (!userId) return; - - const fetchData = async () => { - const data = await getMyInfo(userId); - - setUserInfo(data); - - reset({ - name: data.name, - email: data.email, - age: data.age, - }); - }; - - fetchData(); - }, [userId, reset]); - - if (!userInfo) return null; + reset({ + name: userInfo.name, + email: userInfo.email, + age: userInfo.age, + }); + }, [userInfo, reset]); const onSubmit = async (data: EditInfoRequestData) => { - if (!userId) return; - - const res = await patchMyInfo(userId, data); + const res = await patchMyInfo(userInfo.id, data); if (res) { alert("정보 저장에 성공하셨습니다."); } diff --git a/Week4/Homework/api-project/src/pages/mypage/components/MyPageLayout.tsx b/Week4/Homework/api-project/src/pages/mypage/components/MyPageLayout.tsx index 3b8160a..4979672 100644 --- a/Week4/Homework/api-project/src/pages/mypage/components/MyPageLayout.tsx +++ b/Week4/Homework/api-project/src/pages/mypage/components/MyPageLayout.tsx @@ -1,11 +1,32 @@ import { Outlet } from "react-router"; import Header from "../../../components/common/header/Header"; +import { useEffect, useState } from "react"; +import type { UserInfo } from "../../../types/userType"; +import { getMyInfo } from "../../../apis/user"; const MyPageLayout = () => { + const storedUserId = localStorage.getItem("userId"); + const userId = storedUserId ? Number(storedUserId) : null; + + const [userInfo, setUserInfo] = useState(null); + + useEffect(() => { + if (!userId) return; + + const fetchData = async () => { + const data = await getMyInfo(userId); + setUserInfo(data); + }; + + fetchData(); + }, [userId]); + + if (!userInfo) return null; + return ( <> -
- +
+ ); }; diff --git a/Week4/Homework/api-project/src/styles/GlobalStyle.tsx b/Week4/Homework/api-project/src/styles/GlobalStyle.tsx index 60f5499..cc72869 100644 --- a/Week4/Homework/api-project/src/styles/GlobalStyle.tsx +++ b/Week4/Homework/api-project/src/styles/GlobalStyle.tsx @@ -41,7 +41,14 @@ const GlobalStyle = () => { cursor: pointer; } - input, + input { + border: none; + outline: none; + background: none; + appearance: none; + color: inherit; + } + select { color: inherit; } From 6f6d0c158b02bd9c484d6dea63ce330ec295331d Mon Sep 17 00:00:00 2001 From: Jina Date: Sat, 9 May 2026 04:29:37 +0900 Subject: [PATCH 5/6] =?UTF-8?q?chore:=20.env=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=B6=94=EC=A0=81=EC=97=90=EC=84=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week4/Homework/api-project/.env | 1 - Week4/Homework/api-project/.gitignore | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 Week4/Homework/api-project/.env diff --git a/Week4/Homework/api-project/.env b/Week4/Homework/api-project/.env deleted file mode 100644 index 5a00a91..0000000 --- a/Week4/Homework/api-project/.env +++ /dev/null @@ -1 +0,0 @@ -VITE_API_BASE_URL="https://sopt-server.p-e.kr" \ No newline at end of file diff --git a/Week4/Homework/api-project/.gitignore b/Week4/Homework/api-project/.gitignore index a547bf3..26a3ac4 100644 --- a/Week4/Homework/api-project/.gitignore +++ b/Week4/Homework/api-project/.gitignore @@ -7,6 +7,8 @@ yarn-error.log* pnpm-debug.log* lerna-debug.log* +.env + node_modules dist dist-ssr From be0025e4e76fbb2af47667115d48dd2cc5f88d50 Mon Sep 17 00:00:00 2001 From: Jina Date: Sat, 9 May 2026 14:11:36 +0900 Subject: [PATCH 6/6] =?UTF-8?q?fix:=20=EC=95=88=EC=93=B0=EB=8A=94=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week4/Homework/api-project/index.html | 1 - Week4/Homework/api-project/public/favicon.svg | 1 - Week4/Homework/api-project/public/icons.svg | 24 ------------------- 3 files changed, 26 deletions(-) delete mode 100644 Week4/Homework/api-project/public/favicon.svg delete mode 100644 Week4/Homework/api-project/public/icons.svg diff --git a/Week4/Homework/api-project/index.html b/Week4/Homework/api-project/index.html index 9ea7274..b2145a8 100644 --- a/Week4/Homework/api-project/index.html +++ b/Week4/Homework/api-project/index.html @@ -2,7 +2,6 @@ - api-project diff --git a/Week4/Homework/api-project/public/favicon.svg b/Week4/Homework/api-project/public/favicon.svg deleted file mode 100644 index 6893eb1..0000000 --- a/Week4/Homework/api-project/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/Week4/Homework/api-project/public/icons.svg b/Week4/Homework/api-project/public/icons.svg deleted file mode 100644 index e952219..0000000 --- a/Week4/Homework/api-project/public/icons.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - -