From 6c376de988ae7b01b96f76ef1f999a262eb39fb5 Mon Sep 17 00:00:00 2001 From: Soy Date: Thu, 7 May 2026 16:51:24 +0900 Subject: [PATCH 01/65] =?UTF-8?q?init:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/{.gitkeep => member/.env} | 0 week4/homework/member/.gitignore | 24 + week4/homework/member/README.md | 73 + week4/homework/member/eslint.config.js | 22 + week4/homework/member/index.html | 13 + week4/homework/member/package.json | 34 + week4/homework/member/pnpm-lock.yaml | 2460 +++++++++++++++++ week4/homework/member/public/favicon.svg | 1 + week4/homework/member/public/icons.svg | 24 + week4/homework/member/routes/router.tsx | 0 week4/homework/member/src/App.tsx | 5 + week4/homework/member/src/main.tsx | 9 + .../member/src/shared/assets/hero.png | Bin 0 -> 13057 bytes .../member/src/shared/assets/react.svg | 1 + .../member/src/shared/assets/vite.svg | 1 + week4/homework/member/tsconfig.app.json | 25 + week4/homework/member/tsconfig.json | 7 + week4/homework/member/tsconfig.node.json | 24 + week4/homework/member/vite.config.ts | 8 + 19 files changed, 2731 insertions(+) rename week4/homework/{.gitkeep => member/.env} (100%) create mode 100644 week4/homework/member/.gitignore create mode 100644 week4/homework/member/README.md create mode 100644 week4/homework/member/eslint.config.js create mode 100644 week4/homework/member/index.html create mode 100644 week4/homework/member/package.json create mode 100644 week4/homework/member/pnpm-lock.yaml create mode 100644 week4/homework/member/public/favicon.svg create mode 100644 week4/homework/member/public/icons.svg create mode 100644 week4/homework/member/routes/router.tsx create mode 100644 week4/homework/member/src/App.tsx create mode 100644 week4/homework/member/src/main.tsx create mode 100644 week4/homework/member/src/shared/assets/hero.png create mode 100644 week4/homework/member/src/shared/assets/react.svg create mode 100644 week4/homework/member/src/shared/assets/vite.svg create mode 100644 week4/homework/member/tsconfig.app.json create mode 100644 week4/homework/member/tsconfig.json create mode 100644 week4/homework/member/tsconfig.node.json create mode 100644 week4/homework/member/vite.config.ts diff --git a/week4/homework/.gitkeep b/week4/homework/member/.env similarity index 100% rename from week4/homework/.gitkeep rename to week4/homework/member/.env diff --git a/week4/homework/member/.gitignore b/week4/homework/member/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/week4/homework/member/.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/member/README.md b/week4/homework/member/README.md new file mode 100644 index 0000000..7dbf7eb --- /dev/null +++ b/week4/homework/member/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/member/eslint.config.js b/week4/homework/member/eslint.config.js new file mode 100644 index 0000000..ef614d2 --- /dev/null +++ b/week4/homework/member/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/member/index.html b/week4/homework/member/index.html new file mode 100644 index 0000000..2156f90 --- /dev/null +++ b/week4/homework/member/index.html @@ -0,0 +1,13 @@ + + + + + + + member + + +
+ + + diff --git a/week4/homework/member/package.json b/week4/homework/member/package.json new file mode 100644 index 0000000..4ebe85c --- /dev/null +++ b/week4/homework/member/package.json @@ -0,0 +1,34 @@ +{ + "name": "member", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@vanilla-extract/css": "^1.20.1", + "@vanilla-extract/recipes": "^0.5.7", + "@vanilla-extract/vite-plugin": "^5.2.2", + "axios": "^1.16.0", + "react": "^19.2.5", + "react-dom": "^19.2.5" + }, + "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/member/pnpm-lock.yaml b/week4/homework/member/pnpm-lock.yaml new file mode 100644 index 0000000..2e7d310 --- /dev/null +++ b/week4/homework/member/pnpm-lock.yaml @@ -0,0 +1,2460 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@vanilla-extract/css': + specifier: ^1.20.1 + version: 1.20.1 + '@vanilla-extract/recipes': + specifier: ^0.5.7 + version: 0.5.7(@vanilla-extract/css@1.20.1) + '@vanilla-extract/vite-plugin': + specifier: ^5.2.2 + version: 5.2.2(@types/node@24.12.2)(esbuild@0.28.0)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.28.0)) + 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) + 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)(esbuild@0.28.0)) + 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.2(eslint@10.3.0)(typescript@6.0.3) + vite: + specifier: ^8.0.10 + version: 8.0.10(@types/node@24.12.2)(esbuild@0.28.0) + +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-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.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/plugin-syntax-typescript@7.28.6': + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@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/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@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} + + '@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] + + '@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] + + '@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] + + '@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] + + '@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] + + '@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] + + '@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==} + + '@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/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.2': + resolution: {integrity: sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.59.2 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.59.2': + resolution: {integrity: sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==} + 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.2': + resolution: {integrity: sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==} + 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.2': + resolution: {integrity: sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.59.2': + resolution: {integrity: sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==} + 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.2': + resolution: {integrity: sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==} + 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.2': + resolution: {integrity: sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.59.2': + resolution: {integrity: sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.59.2': + resolution: {integrity: sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==} + 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.2': + resolution: {integrity: sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vanilla-extract/babel-plugin-debug-ids@1.2.2': + resolution: {integrity: sha512-MeDWGICAF9zA/OZLOKwhoRlsUW+fiMwnfuOAqFVohL31Agj7Q/RBWAYweqjHLgFBCsdnr6XIfwjJnmb2znEWxw==} + + '@vanilla-extract/compiler@0.7.0': + resolution: {integrity: sha512-rZQ40HVmsxfGLjoflwwsaUBLfpbpKDoZC19oiDA0FHq4LdrYtyVbFkc0MfqkNo/qBCvaZfsRezCqk0QQxCqZ8w==} + + '@vanilla-extract/css@1.20.1': + resolution: {integrity: sha512-5I9RNo5uZW9tsBnqrWzJqELegOqTHBrZyDFnES0gR9gJJHBB9dom1N0bwITM9tKwBcfKrTX4a6DHVeQdJ2ubQA==} + + '@vanilla-extract/integration@8.0.10': + resolution: {integrity: sha512-01IB5gbrgTe8IIrtfRXXTmACl5D8Enzqp2cKbCWaMKXmnoilXXVCPbJoA96q88PXkNDXsXepCxUugMvEmL3c7A==} + + '@vanilla-extract/private@1.0.9': + resolution: {integrity: sha512-gT2jbfZuaaCLrAxwXbRgIhGhcXbRZCG3v4TTUnjw0EJ7ArdBRxkq4msNJkbuRkCgfIK5ATmprB5t9ljvLeFDEA==} + + '@vanilla-extract/recipes@0.5.7': + resolution: {integrity: sha512-Fvr+htdyb6LVUu+PhH61UFPhwkjgDEk8L4Zq9oIdte42sntpKrgFy90MyTRtGwjVALmrJ0pwRUVr8UoByYeW8A==} + peerDependencies: + '@vanilla-extract/css': ^1.0.0 + + '@vanilla-extract/vite-plugin@5.2.2': + resolution: {integrity: sha512-AUyB4fDR2b/Mo0lcXhhlf6RxnDPYwFMyKKopalJ4BwQNKYzZSoTwHJ1PLPO9SKhpz7lzXc0Z18GHQZOewzl3YA==} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.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==} + + 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 + + cac@7.0.0: + resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} + engines: {node: '>=20.19.0'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + caniuse-lite@1.0.30001792: + resolution: {integrity: sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + 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 + + dedent@1.7.2: + resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deep-object-diff@1.1.9: + resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + 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.351: + resolution: {integrity: sha512-9D7Iqx8RImSvCnOsj86rCH6eQjZFQoM04Jn6HnZVM0Nu/G58/gmKYQ1d12MZTbjQbQSTGI8nwEy07ErsA2slLA==} + + 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-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + + 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'} + + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + engines: {node: '>=18'} + hasBin: true + + 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'} + + eval@0.1.8: + resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} + engines: {node: '>= 0.8'} + + 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-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==} + + 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'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + 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==} + + javascript-stringify@2.1.0: + resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} + + 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-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] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + 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] + + 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'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + 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'} + + media-query-parser@2.0.2: + resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} + + 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} + + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + + modern-ahocorasick@1.1.0: + resolution: {integrity: sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==} + + 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==} + + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + + 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'} + + 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'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + 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'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} + 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@19.2.5: + resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} + engines: {node: '>=0.10.0'} + + require-like@0.1.2: + resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} + + 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 + + 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'} + + 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.2: + resolution: {integrity: sha512-pJw051uomb3ZeCzGTpRb8RbEqB5Y4WWet8gl/GcTlU35BSx0PVdZ86/bqkQCyKKuraVQEK7r6kBHQXF+fBhkoQ==} + 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 + + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + 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-node@6.0.0: + resolution: {integrity: sha512-oj4PVrT+pDh6GYf5wfUXkcZyekYS8kKPfLPXVl8qe324Ec6l4K2DUKNadRbZ3LQl0qGcDz+PyOo7ZAh00Y+JjQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + 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==} + + 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-plugin-utils@7.28.6': {} + + '@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/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@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/hash@0.9.2': {} + + '@esbuild/aix-ppc64@0.28.0': + optional: true + + '@esbuild/android-arm64@0.28.0': + optional: true + + '@esbuild/android-arm@0.28.0': + optional: true + + '@esbuild/android-x64@0.28.0': + optional: true + + '@esbuild/darwin-arm64@0.28.0': + optional: true + + '@esbuild/darwin-x64@0.28.0': + optional: true + + '@esbuild/freebsd-arm64@0.28.0': + optional: true + + '@esbuild/freebsd-x64@0.28.0': + optional: true + + '@esbuild/linux-arm64@0.28.0': + optional: true + + '@esbuild/linux-arm@0.28.0': + optional: true + + '@esbuild/linux-ia32@0.28.0': + optional: true + + '@esbuild/linux-loong64@0.28.0': + optional: true + + '@esbuild/linux-mips64el@0.28.0': + optional: true + + '@esbuild/linux-ppc64@0.28.0': + optional: true + + '@esbuild/linux-riscv64@0.28.0': + optional: true + + '@esbuild/linux-s390x@0.28.0': + optional: true + + '@esbuild/linux-x64@0.28.0': + optional: true + + '@esbuild/netbsd-arm64@0.28.0': + optional: true + + '@esbuild/netbsd-x64@0.28.0': + optional: true + + '@esbuild/openbsd-arm64@0.28.0': + optional: true + + '@esbuild/openbsd-x64@0.28.0': + optional: true + + '@esbuild/openharmony-arm64@0.28.0': + optional: true + + '@esbuild/sunos-x64@0.28.0': + optional: true + + '@esbuild/win32-arm64@0.28.0': + optional: true + + '@esbuild/win32-ia32@0.28.0': + optional: true + + '@esbuild/win32-x64@0.28.0': + optional: true + + '@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 + + '@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': {} + + '@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/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.2(@typescript-eslint/parser@8.59.2(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.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/type-utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.2 + 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.2(eslint@10.3.0)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.2 + debug: 4.4.3 + eslint: 10.3.0 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.59.2(typescript@6.0.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 + debug: 4.4.3 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.59.2': + dependencies: + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 + + '@typescript-eslint/tsconfig-utils@8.59.2(typescript@6.0.3)': + dependencies: + typescript: 6.0.3 + + '@typescript-eslint/type-utils@8.59.2(eslint@10.3.0)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(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.2': {} + + '@typescript-eslint/typescript-estree@8.59.2(typescript@6.0.3)': + dependencies: + '@typescript-eslint/project-service': 8.59.2(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 + 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.2(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.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + eslint: 10.3.0 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.59.2': + dependencies: + '@typescript-eslint/types': 8.59.2 + eslint-visitor-keys: 5.0.1 + + '@vanilla-extract/babel-plugin-debug-ids@1.2.2': + dependencies: + '@babel/core': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@vanilla-extract/compiler@0.7.0(@types/node@24.12.2)(esbuild@0.28.0)': + dependencies: + '@vanilla-extract/css': 1.20.1 + '@vanilla-extract/integration': 8.0.10 + vite: 8.0.10(@types/node@24.12.2)(esbuild@0.28.0) + vite-node: 6.0.0(@types/node@24.12.2)(esbuild@0.28.0) + transitivePeerDependencies: + - '@types/node' + - '@vitejs/devtools' + - babel-plugin-macros + - esbuild + - jiti + - less + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@vanilla-extract/css@1.20.1': + dependencies: + '@emotion/hash': 0.9.2 + '@vanilla-extract/private': 1.0.9 + css-what: 6.2.2 + csstype: 3.2.3 + dedent: 1.7.2 + deep-object-diff: 1.1.9 + deepmerge: 4.3.1 + lru-cache: 10.4.3 + media-query-parser: 2.0.2 + modern-ahocorasick: 1.1.0 + picocolors: 1.1.1 + transitivePeerDependencies: + - babel-plugin-macros + + '@vanilla-extract/integration@8.0.10': + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@vanilla-extract/babel-plugin-debug-ids': 1.2.2 + '@vanilla-extract/css': 1.20.1 + dedent: 1.7.2 + esbuild: 0.28.0 + eval: 0.1.8 + find-up: 5.0.0 + javascript-stringify: 2.1.0 + mlly: 1.8.2 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + '@vanilla-extract/private@1.0.9': {} + + '@vanilla-extract/recipes@0.5.7(@vanilla-extract/css@1.20.1)': + dependencies: + '@vanilla-extract/css': 1.20.1 + + '@vanilla-extract/vite-plugin@5.2.2(@types/node@24.12.2)(esbuild@0.28.0)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.28.0))': + dependencies: + '@vanilla-extract/compiler': 0.7.0(@types/node@24.12.2)(esbuild@0.28.0) + '@vanilla-extract/integration': 8.0.10 + vite: 8.0.10(@types/node@24.12.2)(esbuild@0.28.0) + transitivePeerDependencies: + - '@types/node' + - '@vitejs/devtools' + - babel-plugin-macros + - esbuild + - jiti + - less + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@vitejs/plugin-react@6.0.1(vite@8.0.10(@types/node@24.12.2)(esbuild@0.28.0))': + dependencies: + '@rolldown/pluginutils': 1.0.0-rc.7 + vite: 8.0.10(@types/node@24.12.2)(esbuild@0.28.0) + + 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 + + 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.30001792 + electron-to-chromium: 1.5.351 + node-releases: 2.0.38 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + cac@7.0.0: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + caniuse-lite@1.0.30001792: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + confbox@0.1.8: {} + + convert-source-map@2.0.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-what@6.2.2: {} + + csstype@3.2.3: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + dedent@1.7.2: {} + + deep-is@0.1.4: {} + + deep-object-diff@1.1.9: {} + + deepmerge@4.3.1: {} + + 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.351: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@2.1.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 + + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 + + 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: {} + + eval@0.1.8: + dependencies: + '@types/node': 24.12.2 + require-like: 0.1.2 + + 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-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 + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + imurmurhash@0.1.4: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + isexe@2.0.0: {} + + javascript-stringify@2.1.0: {} + + js-tokens@4.0.0: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.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 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + math-intrinsics@1.1.0: {} + + media-query-parser@2.0.2: + dependencies: + '@babel/runtime': 7.29.2 + + 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 + + mlly@1.8.2: + dependencies: + acorn: 8.16.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + + modern-ahocorasick@1.1.0: {} + + ms@2.1.3: {} + + nanoid@3.3.12: {} + + natural-compare@1.4.0: {} + + node-releases@2.0.38: {} + + obug@2.1.1: {} + + 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 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@4.0.4: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + postcss@8.5.14: + 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@19.2.5: {} + + require-like@0.1.2: {} + + 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: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + source-map-js@1.2.1: {} + + 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.2(eslint@10.3.0)(typescript@6.0.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + eslint: 10.3.0 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + typescript@6.0.3: {} + + ufo@1.6.4: {} + + 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-node@6.0.0(@types/node@24.12.2)(esbuild@0.28.0): + dependencies: + cac: 7.0.0 + es-module-lexer: 2.1.0 + obug: 2.1.1 + pathe: 2.0.3 + vite: 8.0.10(@types/node@24.12.2)(esbuild@0.28.0) + transitivePeerDependencies: + - '@types/node' + - '@vitejs/devtools' + - esbuild + - jiti + - less + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + + vite@8.0.10(@types/node@24.12.2)(esbuild@0.28.0): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.14 + rolldown: 1.0.0-rc.17 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 24.12.2 + esbuild: 0.28.0 + fsevents: 2.3.3 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + yallist@3.1.1: {} + + 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/member/public/favicon.svg b/week4/homework/member/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/week4/homework/member/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/week4/homework/member/public/icons.svg b/week4/homework/member/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/week4/homework/member/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/week4/homework/member/routes/router.tsx b/week4/homework/member/routes/router.tsx new file mode 100644 index 0000000..e69de29 diff --git a/week4/homework/member/src/App.tsx b/week4/homework/member/src/App.tsx new file mode 100644 index 0000000..b4f6543 --- /dev/null +++ b/week4/homework/member/src/App.tsx @@ -0,0 +1,5 @@ +function App() { + return <>; +} + +export default App; diff --git a/week4/homework/member/src/main.tsx b/week4/homework/member/src/main.tsx new file mode 100644 index 0000000..5d4a2be --- /dev/null +++ b/week4/homework/member/src/main.tsx @@ -0,0 +1,9 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import App from "./App.tsx"; + +createRoot(document.getElementById("root")!).render( + + + , +); diff --git a/week4/homework/member/src/shared/assets/hero.png b/week4/homework/member/src/shared/assets/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..02251f4b956c55af2d76fd0788124d7eee2b45eb GIT binary patch literal 13057 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 P00000NkvXXu0mjft=yBf literal 0 HcmV?d00001 diff --git a/week4/homework/member/src/shared/assets/react.svg b/week4/homework/member/src/shared/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/week4/homework/member/src/shared/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/week4/homework/member/src/shared/assets/vite.svg b/week4/homework/member/src/shared/assets/vite.svg new file mode 100644 index 0000000..5101b67 --- /dev/null +++ b/week4/homework/member/src/shared/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/week4/homework/member/tsconfig.app.json b/week4/homework/member/tsconfig.app.json new file mode 100644 index 0000000..7f42e5f --- /dev/null +++ b/week4/homework/member/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/member/tsconfig.json b/week4/homework/member/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/week4/homework/member/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/week4/homework/member/tsconfig.node.json b/week4/homework/member/tsconfig.node.json new file mode 100644 index 0000000..d3c52ea --- /dev/null +++ b/week4/homework/member/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/member/vite.config.ts b/week4/homework/member/vite.config.ts new file mode 100644 index 0000000..fb845f2 --- /dev/null +++ b/week4/homework/member/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin"; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react(), vanillaExtractPlugin()], +}); From 2ab35fb1b0f97ab26cc471c4f15dfda73584bd9d Mon Sep 17 00:00:00 2001 From: Soy Date: Thu, 7 May 2026 16:52:04 +0900 Subject: [PATCH 02/65] =?UTF-8?q?init:=20gitignore=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/week4/homework/member/.gitignore b/week4/homework/member/.gitignore index a547bf3..438657a 100644 --- a/week4/homework/member/.gitignore +++ b/week4/homework/member/.gitignore @@ -11,6 +11,7 @@ node_modules dist dist-ssr *.local +.env # Editor directories and files .vscode/* From 1731ffb64fb47c7a7764ed3a677d70cadc28bb01 Mon Sep 17 00:00:00 2001 From: Soy Date: Thu, 7 May 2026 17:10:48 +0900 Subject: [PATCH 03/65] =?UTF-8?q?feat:=20path=20alias=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/vite.config.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/week4/homework/member/vite.config.ts b/week4/homework/member/vite.config.ts index fb845f2..d082386 100644 --- a/week4/homework/member/vite.config.ts +++ b/week4/homework/member/vite.config.ts @@ -1,8 +1,25 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin"; +import path from "path"; // https://vite.dev/config/ export default defineConfig({ plugins: [react(), vanillaExtractPlugin()], + resolve: { + alias: { + "@": path.resolve(__dirname, "src"), + "@pages": path.resolve(__dirname, "src/pages"), + "@routes": path.resolve(__dirname, "src/routes"), + "@shared": path.resolve(__dirname, "src/shared"), + "@apis": path.resolve(__dirname, "src/shared/apis"), + "@assets": path.resolve(__dirname, "src/shared/assets"), + "@components": path.resolve(__dirname, "src/shared/components"), + "@constants": path.resolve(__dirname, "src/shared/constants"), + "@hooks": path.resolve(__dirname, "src/shared/hooks"), + "@styles": path.resolve(__dirname, "src/shared/styles"), + // @types는 npm @types 스코프와 충돌하므로 사용 불가 → @shared/types/ 사용 + "@utils": path.resolve(__dirname, "src/shared/utils"), + }, + }, }); From 89f389654df26460e123d4d246fd46d9e53f1d0d Mon Sep 17 00:00:00 2001 From: Soy Date: Thu, 7 May 2026 17:10:59 +0900 Subject: [PATCH 04/65] =?UTF-8?q?init:=20=EC=8A=A4=ED=83=80=EC=9D=BC=20?= =?UTF-8?q?=EC=84=B8=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/shared/styles/global.css.ts | 25 +++++++++ .../member/src/shared/styles/reset.css.ts | 55 +++++++++++++++++++ .../member/src/shared/styles/theme.css.ts | 19 +++++++ 3 files changed, 99 insertions(+) create mode 100644 week4/homework/member/src/shared/styles/global.css.ts create mode 100644 week4/homework/member/src/shared/styles/reset.css.ts create mode 100644 week4/homework/member/src/shared/styles/theme.css.ts diff --git a/week4/homework/member/src/shared/styles/global.css.ts b/week4/homework/member/src/shared/styles/global.css.ts new file mode 100644 index 0000000..89ea66e --- /dev/null +++ b/week4/homework/member/src/shared/styles/global.css.ts @@ -0,0 +1,25 @@ +import './reset.css.ts'; +import { globalStyle } from '@vanilla-extract/css'; + +globalStyle('*', { + boxSizing: 'border-box', +}); + +globalStyle('body', { + margin: 0, + fontFamily: 'sans-serif', + background: '#fff', + color: '#222', +}); + +globalStyle('main', { + width: '100%', +}); + +globalStyle('button', { + all: 'unset', + cursor: 'pointer', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', +}); \ No newline at end of file diff --git a/week4/homework/member/src/shared/styles/reset.css.ts b/week4/homework/member/src/shared/styles/reset.css.ts new file mode 100644 index 0000000..1da9090 --- /dev/null +++ b/week4/homework/member/src/shared/styles/reset.css.ts @@ -0,0 +1,55 @@ +import { globalStyle } from '@vanilla-extract/css'; + +globalStyle('html, body, div, span, applet, object, iframe, \ +h1, h2, h3, h4, h5, h6, p, blockquote, pre, \ +a, abbr, acronym, address, big, cite, code, \ +del, dfn, em, img, ins, kbd, q, s, samp, \ +small, strike, strong, sub, sup, tt, var, \ +b, u, i, center, \ +dl, dt, dd, ol, ul, li, \ +fieldset, form, label, legend, \ +table, caption, tbody, tfoot, thead, tr, th, td, \ +article, aside, canvas, details, embed, \ +figure, figcaption, footer, header, hgroup, \ +menu, nav, output, ruby, section, summary, \ +time, mark, audio, video', { + margin: 0, + padding: 0, + border: 0, + fontSize: '100%', + font: 'inherit', + verticalAlign: 'baseline', +}); + +globalStyle('html', { + fontSize: '62.5%', /*rem 세팅*/ +}); + +/* HTML5 display-role reset for older browsers */ +globalStyle('article, aside, details, figcaption, figure, \ +footer, header, hgroup, menu, nav, section', { + display: 'block', +}); + + +globalStyle('body', { + lineHeight: 1, +}); + +globalStyle('ol, ul', { + listStyle: 'none', +}); + +globalStyle('blockquote, q', { + quotes: 'none', +}); + + +globalStyle('blockquote:before, blockquote:after, q:before, q:after', { + content: "''", +}); + +globalStyle('table', { + borderCollapse: 'collapse', + borderSpacing: 0, +}); \ No newline at end of file diff --git a/week4/homework/member/src/shared/styles/theme.css.ts b/week4/homework/member/src/shared/styles/theme.css.ts new file mode 100644 index 0000000..1cc0d7c --- /dev/null +++ b/week4/homework/member/src/shared/styles/theme.css.ts @@ -0,0 +1,19 @@ +import { createTheme } from "@vanilla-extract/css"; + +export const [themeClass, vars] = createTheme({ + fontSize: { + sm: "0.875rem", + md: "1rem", + lg: "1.25rem", + xl: "2.5rem", + }, + color: { + red: "#FF0000", + gray: "#828282", + black: "#222222", + white: "#F9F7F7", + lightBlue: "#DBE2EF", + blue: "#3F72AF", + navy: "#112D4E", + }, +}); \ No newline at end of file From d08175035a171761b9339557ea33ef7c8b55fbdc Mon Sep 17 00:00:00 2001 From: Soy Date: Thu, 7 May 2026 17:11:13 +0900 Subject: [PATCH 05/65] =?UTF-8?q?remove:=20asset=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../homework/member/src/shared/assets/hero.png | Bin 13057 -> 0 bytes .../homework/member/src/shared/assets/react.svg | 1 - .../homework/member/src/shared/assets/vite.svg | 1 - 3 files changed, 2 deletions(-) delete mode 100644 week4/homework/member/src/shared/assets/hero.png delete mode 100644 week4/homework/member/src/shared/assets/react.svg delete mode 100644 week4/homework/member/src/shared/assets/vite.svg diff --git a/week4/homework/member/src/shared/assets/hero.png b/week4/homework/member/src/shared/assets/hero.png deleted file mode 100644 index 02251f4b956c55af2d76fd0788124d7eee2b45eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13057 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 P00000NkvXXu0mjft=yBf diff --git a/week4/homework/member/src/shared/assets/react.svg b/week4/homework/member/src/shared/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/week4/homework/member/src/shared/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/week4/homework/member/src/shared/assets/vite.svg b/week4/homework/member/src/shared/assets/vite.svg deleted file mode 100644 index 5101b67..0000000 --- a/week4/homework/member/src/shared/assets/vite.svg +++ /dev/null @@ -1 +0,0 @@ -Vite From 36c0e52031a3dad33f4393a92737670799dac04a Mon Sep 17 00:00:00 2001 From: Soy Date: Thu, 7 May 2026 17:11:42 +0900 Subject: [PATCH 06/65] =?UTF-8?q?setting:=20react-router-dom=20=EC=84=A4?= =?UTF-8?q?=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/package.json | 3 +- week4/homework/member/pnpm-lock.yaml | 45 ++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/week4/homework/member/package.json b/week4/homework/member/package.json index 4ebe85c..a8599a8 100644 --- a/week4/homework/member/package.json +++ b/week4/homework/member/package.json @@ -15,7 +15,8 @@ "@vanilla-extract/vite-plugin": "^5.2.2", "axios": "^1.16.0", "react": "^19.2.5", - "react-dom": "^19.2.5" + "react-dom": "^19.2.5", + "react-router-dom": "^7.15.0" }, "devDependencies": { "@eslint/js": "^10.0.1", diff --git a/week4/homework/member/pnpm-lock.yaml b/week4/homework/member/pnpm-lock.yaml index 2e7d310..5fac764 100644 --- a/week4/homework/member/pnpm-lock.yaml +++ b/week4/homework/member/pnpm-lock.yaml @@ -26,6 +26,9 @@ importers: react-dom: specifier: ^19.2.5 version: 19.2.5(react@19.2.5) + react-router-dom: + specifier: ^7.15.0 + version: 7.15.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) devDependencies: '@eslint/js': specifier: ^10.0.1 @@ -672,6 +675,10 @@ packages: 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'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1141,6 +1148,23 @@ packages: peerDependencies: react: ^19.2.5 + react-router-dom@7.15.0: + resolution: {integrity: sha512-VcrVg64Fo8nwBvDscajG8gRTLIuTC6N50nb22l2HOOV4PTOHgoGp8mUjy9wLiHYoYTSYI36tUnXZgasSRFZorQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + react-router@7.15.0: + resolution: {integrity: sha512-HW9vYwuM8f4yx66Izy8xfrzCM+SBJluoZcCbww9A1TySax11S5Vgw6fi3ZjMONw9J4gQwngL7PzkyIpJJpJ7RQ==} + 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'} @@ -1165,6 +1189,9 @@ packages: 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'} @@ -1894,6 +1921,8 @@ snapshots: convert-source-map@2.0.0: {} + cookie@1.1.1: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -2328,6 +2357,20 @@ snapshots: react: 19.2.5 scheduler: 0.27.0 + react-router-dom@7.15.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + dependencies: + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + react-router: 7.15.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + + react-router@7.15.0(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: {} require-like@0.1.2: {} @@ -2359,6 +2402,8 @@ snapshots: semver@7.7.4: {} + set-cookie-parser@2.7.2: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 From abeb8694297129cf562b0ce0280909b3126737c4 Mon Sep 17 00:00:00 2001 From: Soy Date: Thu, 7 May 2026 17:13:01 +0900 Subject: [PATCH 07/65] =?UTF-8?q?fix:=20env=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=BA=90=EC=8B=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/.env | 0 week4/homework/member/.gitignore | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 week4/homework/member/.env diff --git a/week4/homework/member/.env b/week4/homework/member/.env deleted file mode 100644 index e69de29..0000000 diff --git a/week4/homework/member/.gitignore b/week4/homework/member/.gitignore index 438657a..3b0b403 100644 --- a/week4/homework/member/.gitignore +++ b/week4/homework/member/.gitignore @@ -11,7 +11,6 @@ node_modules dist dist-ssr *.local -.env # Editor directories and files .vscode/* @@ -23,3 +22,5 @@ dist-ssr *.njsproj *.sln *.sw? + +.env \ No newline at end of file From 48647496b7b853044ea1e9f08a139dcc112ee65c Mon Sep 17 00:00:00 2001 From: Soy Date: Thu, 7 May 2026 17:13:19 +0900 Subject: [PATCH 08/65] =?UTF-8?q?setting:=20index.html=20=EA=B8=B0?= =?UTF-8?q?=EB=B3=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/week4/homework/member/index.html b/week4/homework/member/index.html index 2156f90..0b978cb 100644 --- a/week4/homework/member/index.html +++ b/week4/homework/member/index.html @@ -1,10 +1,10 @@ - + - member + SOPT 회원 조회
From 0b880d96f4041e9262d18a642ea4621313748d35 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 01:09:47 +0900 Subject: [PATCH 09/65] =?UTF-8?q?setting:=20pnpm=20=EC=9E=AC=EC=84=A4?= =?UTF-8?q?=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 6148 -> 6148 bytes week4/.DS_Store | Bin 0 -> 6148 bytes week4/homework/member/pnpm-lock.yaml | 224 +++++++++++++-------------- 3 files changed, 112 insertions(+), 112 deletions(-) create mode 100644 week4/.DS_Store diff --git a/.DS_Store b/.DS_Store index 9b98823e6c7eb266100b89c6f1a735ed422e208d..75e298845de3a37d52cd3e480f9d21cad6e4ce85 100644 GIT binary patch literal 6148 zcmeHK&1(}u6n~R!nvJax#A@kjq2R@!`9csc+Zg`=R}|EeW=%-eZgxUG%%Mbrx2A{w z0bcwA^dM5aih^Dhu{Uqls|RnMeDe`9lcXL+WL}v0&CYvoe{X;6&SU_9l=`(CKpFsS zYz(ba*ex*TXKl`6a%LTouzQ4!ocDmX+H;X+!YE)A_!kvm->wChpaB8&wD0#~O!Kv9 zx$KA3$9Vhc&sPWT(T7bnw?%7z^tYSJ+OYWsQz1Fwg(mdD*VrMkG9RJVFn*ahIDE@% zn7NNy$;nY#J$(Ix1Pq{#za7Z=gKk?s?Q6ds2HjpZdqiS!E3uTcllHQ`s5RG zZmHV2$F6Qs8v2uQ)xRCo2bJ{M>on?BgQ(u&2|=xnA@}bDQH>5tv>(;FJl7KrJ7uRT z>GQk0SMwRCkjo7-4i2*!r&zc$9H#8mjmy_=R(8TxME972xbEV@%k8wp35;=|Jdh@C zaQsB~s=^+R&#c5habcBwRn)~1nxGFqvO1LfM_wliY1F`3R`Jx6*D8Z#QTM8qrGKrz z*m^%xSzfJdafDVGWRXDOFR1)W7k+%zy(<4k_1ym9ml^(o%D*^5>twmvx67`hTi z0{PN`9X|pfS~$%O$LuV@avX`S#F0Sspb?RZC{l?$Vi1vz^Nx&jC5{A&bRe7=?<1Ls zJfRTIj`I!=2jU7ey-~m@peqm;mua^D-#GdFuP2!+qkvK1zfyo$Wv^VqN0NK%+{3ZG w*1@)ojTws@3FIl*$?cdA*jBuTjT`zLHb8VGjs)Tin)xHZWiXvl;IAt18w^(eOaK4? delta 107 zcmZoMXfc=|#>B`mF;Q%yo}w@l0|Nsi1A_nqgJDv6aY0f}e$vFmm6HubSSE|J-r*?= zF3QWv&r1iX+APQ+#C7vpAj4t@@x5kP_O%#-;=EP=Ygrhp6snZ~j?LSzjy0C&t6 AoB#j- diff --git a/week4/.DS_Store b/week4/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d46ddeaddb66c95d67f90c734cfc7063a9f8832c GIT binary patch literal 6148 zcmeHK%}N6?5T0nU>krbSc*A*V>ba&cMuh6rlLh^Bd;bM(Fv_m2RF+hg>;7RkQ#i)^!;bvSNJX(>z~f| ze)Dzz_QB-)P0TR&Nn_IcD86al$L#0aX+4wu%kD>jh+X&kHmf#re(07WLh6XXhz>hNU0WIu^#sB~S literal 0 HcmV?d00001 diff --git a/week4/homework/member/pnpm-lock.yaml b/week4/homework/member/pnpm-lock.yaml index 5fac764..8b89102 100644 --- a/week4/homework/member/pnpm-lock.yaml +++ b/week4/homework/member/pnpm-lock.yaml @@ -16,19 +16,19 @@ importers: version: 0.5.7(@vanilla-extract/css@1.20.1) '@vanilla-extract/vite-plugin': specifier: ^5.2.2 - version: 5.2.2(@types/node@24.12.2)(esbuild@0.28.0)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.28.0)) + version: 5.2.2(@types/node@24.12.2)(esbuild@0.28.0)(vite@8.0.11(@types/node@24.12.2)(esbuild@0.28.0)) axios: specifier: ^1.16.0 version: 1.16.0 react: specifier: ^19.2.5 - version: 19.2.5 + version: 19.2.6 react-dom: specifier: ^19.2.5 - version: 19.2.5(react@19.2.5) + version: 19.2.6(react@19.2.6) react-router-dom: specifier: ^7.15.0 - version: 7.15.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 7.15.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) devDependencies: '@eslint/js': specifier: ^10.0.1 @@ -44,7 +44,7 @@ importers: 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)(esbuild@0.28.0)) + version: 6.0.1(vite@8.0.11(@types/node@24.12.2)(esbuild@0.28.0)) eslint: specifier: ^10.2.1 version: 10.3.0 @@ -65,7 +65,7 @@ importers: version: 8.59.2(eslint@10.3.0)(typescript@6.0.3) vite: specifier: ^8.0.10 - version: 8.0.10(@types/node@24.12.2)(esbuild@0.28.0) + version: 8.0.11(@types/node@24.12.2)(esbuild@0.28.0) packages: @@ -399,100 +399,100 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@oxc-project/types@0.127.0': - resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} + '@oxc-project/types@0.128.0': + resolution: {integrity: sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==} - '@rolldown/binding-android-arm64@1.0.0-rc.17': - resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==} + '@rolldown/binding-android-arm64@1.0.0-rc.18': + resolution: {integrity: sha512-lIDyUAfD7U3+BWKzdxMbJcsYHuqXqmGz40aeRqvuAm3y5TkJSYTBW2RDrn65DJFPQqVjUAUqq5uz8urzQ8aBdQ==} 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==} + '@rolldown/binding-darwin-arm64@1.0.0-rc.18': + resolution: {integrity: sha512-apJq2ktnGp27nSInMR5Vcj8kY6xJzDAvfdIFlpDcAK/w4cDO58qVoi1YQsES/SKiFNge/6e4CUzgjfHduYqWpQ==} 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==} + '@rolldown/binding-darwin-x64@1.0.0-rc.18': + resolution: {integrity: sha512-5Ofot8xbs+pxRHJqm9/9N/4sTQOvdrwEsmPE9pdLEEoAbdZtG6F2LMDfO1sp6ZAtXJuJV/21ew2srq3W8NXB5g==} 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==} + '@rolldown/binding-freebsd-x64@1.0.0-rc.18': + resolution: {integrity: sha512-7h8eeOTT1eyqJyx64BFCnWZpNm486hGWt2sqeLLgDxA0xI1oGZ9H7gK1S85uNGmBhkdPwa/6reTxfFFKvIsebw==} 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==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.18': + resolution: {integrity: sha512-eRcm/HVt9U/JFu5RKAEKwGQYtDCKWLiaH6wOnsSEp6NMBb/3Os8LgHZlNyzMpFVNmiiMFlfb2zEnebfzJrHFmg==} 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==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.18': + resolution: {integrity: sha512-SOrT/cT4ukTmgnrEz/Hg3m7LBnuCLW9psDeMKrimRWY4I8DmnO7Lco8W2vtqPmMkbVu8iJ+g4GFLVLLOVjJ9DQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': - resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.18': + resolution: {integrity: sha512-QWjdxN1HJCpBTAcZ5N5F7wju3gVPzRzSpmGzx7na0c/1qpN9CFil+xt+l9lV/1M6/gqHSNXCiqPfwhVJPeLnug==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': - resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.18': + resolution: {integrity: sha512-ugCOyj7a4d9h3q9B+wXmf6g3a68UsjGh6dob5DHevHGMwDUbhsYNbSPxJsENcIttJZ9jv7qGM2UesLw5jqIhdg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': - resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==} + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.18': + resolution: {integrity: sha512-kKWRhbsotpXkGbcd5dllUWg5gEXcDAa8u5YnP9AV5DYNbvJHGzzuwv7dpmhc8NqKMJldl0a+x76IHbspEpEmdA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': - resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==} + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.18': + resolution: {integrity: sha512-uCo8ElcCIAMyYAZyuIZ81oFkhTSIllNvUCHCAlbhlN4ji3uC28h7IIdlXyIvGO7HsuqnV9p3rD/bpH7XhIyhRw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': - resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.18': + resolution: {integrity: sha512-XNOQZtuE6yUIvx4rwGemwh8kpL1xvU41FXy/s9K7T/3JVcqGzo3NfKM2HrbrGgfPYGFW42f07Wk++aOC6B9NWA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': - resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==} + '@rolldown/binding-openharmony-arm64@1.0.0-rc.18': + resolution: {integrity: sha512-tSn/kzrfa7tNOXr7sEacDBN4YsIqTyLqh45IO0nHDwtpKIDNDJr+VFojt+4klSpChxB29JLyduSsE0MKEwa65A==} 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==} + '@rolldown/binding-wasm32-wasi@1.0.0-rc.18': + resolution: {integrity: sha512-+J9YGmc+czgqlhYmwun3S3O0FIZhsH8ep2456xwjAdIOmuJxM7xz4P4PtrxU+Bz17a/5bqPA8o3HAAoX0teUdg==} 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==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.18': + resolution: {integrity: sha512-zsu47DgU0FQzSwi6sU9dZoEdUv7pc1AptSEz/Z8HBg54sV0Pbs3N0+CrIbTsgiu6EyoaNN9CHboqbLaz9lhOyQ==} 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==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.18': + resolution: {integrity: sha512-7H+3yqGgmnlDTRRhw/xpYY9J1kf4GC681nVc4GqKhExZTDrVVrV2tsOR9kso0fvgBdcTCcQShx4SLLoHgaLwhg==} 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.18': + resolution: {integrity: sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==} '@rolldown/pluginutils@1.0.0-rc.7': resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==} @@ -503,8 +503,8 @@ packages: '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -729,8 +729,8 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - electron-to-chromium@1.5.351: - resolution: {integrity: sha512-9D7Iqx8RImSvCnOsj86rCH6eQjZFQoM04Jn6HnZVM0Nu/G58/gmKYQ1d12MZTbjQbQSTGI8nwEy07ErsA2slLA==} + electron-to-chromium@1.5.352: + resolution: {integrity: sha512-9wHk8x6dyuimoe18EdiDPWKExNdxYqo4fn4FwOVVper6RxT3cmpBwBkWWfSOCYJjQdIco/nPhJhNLmn4Ufg1Yg==} es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} @@ -1143,10 +1143,10 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - react-dom@19.2.5: - resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==} + react-dom@19.2.6: + resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==} peerDependencies: - react: ^19.2.5 + react: ^19.2.6 react-router-dom@7.15.0: resolution: {integrity: sha512-VcrVg64Fo8nwBvDscajG8gRTLIuTC6N50nb22l2HOOV4PTOHgoGp8mUjy9wLiHYoYTSYI36tUnXZgasSRFZorQ==} @@ -1165,15 +1165,15 @@ packages: react-dom: optional: true - react@19.2.5: - resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} + react@19.2.6: + resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} engines: {node: '>=0.10.0'} require-like@0.1.2: resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} - rolldown@1.0.0-rc.17: - resolution: {integrity: sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==} + rolldown@1.0.0-rc.18: + resolution: {integrity: sha512-phmyKBpuBdRYDf4hgyynGAYn/rDDe+iZXKVJ7WX5b1zQzpLkP5oJRPGsfJuHdzPMlyyEO/4sPW6yfSx2gf7lVg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -1253,13 +1253,13 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - vite@8.0.10: - resolution: {integrity: sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==} + vite@8.0.11: + resolution: {integrity: sha512-Jz1mxtUBR5xTT65VOdJZUUeoyLtqljmFkiUXhPTLZka3RDc9vpi/xXkyrnsdRcm2lIi3l3GPMnAidTsEGIj3Ow==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.1.0 + '@vitejs/devtools': ^0.1.18 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 @@ -1604,58 +1604,58 @@ snapshots: '@tybys/wasm-util': 0.10.2 optional: true - '@oxc-project/types@0.127.0': {} + '@oxc-project/types@0.128.0': {} - '@rolldown/binding-android-arm64@1.0.0-rc.17': + '@rolldown/binding-android-arm64@1.0.0-rc.18': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.17': + '@rolldown/binding-darwin-arm64@1.0.0-rc.18': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.17': + '@rolldown/binding-darwin-x64@1.0.0-rc.18': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.17': + '@rolldown/binding-freebsd-x64@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.18': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.18': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.18': 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': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.18': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.18': optional: true - '@rolldown/pluginutils@1.0.0-rc.17': {} + '@rolldown/pluginutils@1.0.0-rc.18': {} '@rolldown/pluginutils@1.0.0-rc.7': {} @@ -1666,7 +1666,7 @@ snapshots: '@types/esrecurse@4.3.1': {} - '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} '@types/json-schema@7.0.15': {} @@ -1783,7 +1783,7 @@ snapshots: dependencies: '@vanilla-extract/css': 1.20.1 '@vanilla-extract/integration': 8.0.10 - vite: 8.0.10(@types/node@24.12.2)(esbuild@0.28.0) + vite: 8.0.11(@types/node@24.12.2)(esbuild@0.28.0) vite-node: 6.0.0(@types/node@24.12.2)(esbuild@0.28.0) transitivePeerDependencies: - '@types/node' @@ -1839,11 +1839,11 @@ snapshots: dependencies: '@vanilla-extract/css': 1.20.1 - '@vanilla-extract/vite-plugin@5.2.2(@types/node@24.12.2)(esbuild@0.28.0)(vite@8.0.10(@types/node@24.12.2)(esbuild@0.28.0))': + '@vanilla-extract/vite-plugin@5.2.2(@types/node@24.12.2)(esbuild@0.28.0)(vite@8.0.11(@types/node@24.12.2)(esbuild@0.28.0))': dependencies: '@vanilla-extract/compiler': 0.7.0(@types/node@24.12.2)(esbuild@0.28.0) '@vanilla-extract/integration': 8.0.10 - vite: 8.0.10(@types/node@24.12.2)(esbuild@0.28.0) + vite: 8.0.11(@types/node@24.12.2)(esbuild@0.28.0) transitivePeerDependencies: - '@types/node' - '@vitejs/devtools' @@ -1860,10 +1860,10 @@ snapshots: - tsx - yaml - '@vitejs/plugin-react@6.0.1(vite@8.0.10(@types/node@24.12.2)(esbuild@0.28.0))': + '@vitejs/plugin-react@6.0.1(vite@8.0.11(@types/node@24.12.2)(esbuild@0.28.0))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 - vite: 8.0.10(@types/node@24.12.2)(esbuild@0.28.0) + vite: 8.0.11(@types/node@24.12.2)(esbuild@0.28.0) acorn-jsx@5.3.2(acorn@8.16.0): dependencies: @@ -1900,7 +1900,7 @@ snapshots: dependencies: baseline-browser-mapping: 2.10.27 caniuse-lite: 1.0.30001792 - electron-to-chromium: 1.5.351 + electron-to-chromium: 1.5.352 node-releases: 2.0.38 update-browserslist-db: 1.2.3(browserslist@4.28.2) @@ -1955,7 +1955,7 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - electron-to-chromium@1.5.351: {} + electron-to-chromium@1.5.352: {} es-define-property@1.0.1: {} @@ -2025,7 +2025,7 @@ snapshots: eslint-scope@9.1.2: dependencies: '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -2044,7 +2044,7 @@ snapshots: '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3 @@ -2352,49 +2352,49 @@ snapshots: punycode@2.3.1: {} - react-dom@19.2.5(react@19.2.5): + react-dom@19.2.6(react@19.2.6): dependencies: - react: 19.2.5 + react: 19.2.6 scheduler: 0.27.0 - react-router-dom@7.15.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + react-router-dom@7.15.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - react-router: 7.15.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + react-router: 7.15.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - react-router@7.15.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + react-router@7.15.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: cookie: 1.1.1 - react: 19.2.5 + react: 19.2.6 set-cookie-parser: 2.7.2 optionalDependencies: - react-dom: 19.2.5(react@19.2.5) + react-dom: 19.2.6(react@19.2.6) - react@19.2.5: {} + react@19.2.6: {} require-like@0.1.2: {} - rolldown@1.0.0-rc.17: + rolldown@1.0.0-rc.18: dependencies: - '@oxc-project/types': 0.127.0 - '@rolldown/pluginutils': 1.0.0-rc.17 + '@oxc-project/types': 0.128.0 + '@rolldown/pluginutils': 1.0.0-rc.18 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 + '@rolldown/binding-android-arm64': 1.0.0-rc.18 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.18 + '@rolldown/binding-darwin-x64': 1.0.0-rc.18 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.18 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.18 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.18 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.18 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.18 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.18 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.18 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.18 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.18 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.18 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.18 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.18 scheduler@0.27.0: {} @@ -2461,7 +2461,7 @@ snapshots: es-module-lexer: 2.1.0 obug: 2.1.1 pathe: 2.0.3 - vite: 8.0.10(@types/node@24.12.2)(esbuild@0.28.0) + vite: 8.0.11(@types/node@24.12.2)(esbuild@0.28.0) transitivePeerDependencies: - '@types/node' - '@vitejs/devtools' @@ -2476,12 +2476,12 @@ snapshots: - tsx - yaml - vite@8.0.10(@types/node@24.12.2)(esbuild@0.28.0): + vite@8.0.11(@types/node@24.12.2)(esbuild@0.28.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 postcss: 8.5.14 - rolldown: 1.0.0-rc.17 + rolldown: 1.0.0-rc.18 tinyglobby: 0.2.16 optionalDependencies: '@types/node': 24.12.2 From e984d2c7d2171960aa4c994b7f9bab7762d2b23f Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 01:09:59 +0900 Subject: [PATCH 10/65] =?UTF-8?q?fix:=20path=20alias=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/tsconfig.app.json | 14 +++++++++++++ week4/homework/member/vite.config.ts | 28 +++++++++++++++---------- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/week4/homework/member/tsconfig.app.json b/week4/homework/member/tsconfig.app.json index 7f42e5f..9deeaca 100644 --- a/week4/homework/member/tsconfig.app.json +++ b/week4/homework/member/tsconfig.app.json @@ -1,5 +1,19 @@ { "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["src/*"], + "@pages/*": ["src/pages/*"], + "@routes/*": ["src/routes/*"], + "@shared/*": ["src/shared/*"], + "@apis/*": ["src/shared/apis/*"], + "@assets/*": ["src/shared/assets/*"], + "@components/*": ["src/shared/components/*"], + "@constants/*": ["src/shared/constants/*"], + "@hooks/*": ["src/shared/hooks/*"], + "@styles/*": ["src/shared/styles/*"], + "@utils/*": ["src/shared/utils/*"], + }, "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", "target": "es2023", "lib": ["ES2023", "DOM"], diff --git a/week4/homework/member/vite.config.ts b/week4/homework/member/vite.config.ts index d082386..e113673 100644 --- a/week4/homework/member/vite.config.ts +++ b/week4/homework/member/vite.config.ts @@ -2,24 +2,30 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin"; import path from "path"; +import { fileURLToPath } from "node:url"; + +const dirname = + typeof __dirname !== "undefined" + ? __dirname + : path.dirname(fileURLToPath(import.meta.url)); // https://vite.dev/config/ export default defineConfig({ plugins: [react(), vanillaExtractPlugin()], resolve: { alias: { - "@": path.resolve(__dirname, "src"), - "@pages": path.resolve(__dirname, "src/pages"), - "@routes": path.resolve(__dirname, "src/routes"), - "@shared": path.resolve(__dirname, "src/shared"), - "@apis": path.resolve(__dirname, "src/shared/apis"), - "@assets": path.resolve(__dirname, "src/shared/assets"), - "@components": path.resolve(__dirname, "src/shared/components"), - "@constants": path.resolve(__dirname, "src/shared/constants"), - "@hooks": path.resolve(__dirname, "src/shared/hooks"), - "@styles": path.resolve(__dirname, "src/shared/styles"), + "@": path.resolve(dirname, "src"), + "@pages": path.resolve(dirname, "src/pages"), + "@routes": path.resolve(dirname, "src/routes"), + "@shared": path.resolve(dirname, "src/shared"), + "@apis": path.resolve(dirname, "src/shared/apis"), + "@assets": path.resolve(dirname, "src/shared/assets"), + "@components": path.resolve(dirname, "src/shared/components"), + "@constants": path.resolve(dirname, "src/shared/constants"), + "@hooks": path.resolve(dirname, "src/shared/hooks"), + "@styles": path.resolve(dirname, "src/shared/styles"), // @types는 npm @types 스코프와 충돌하므로 사용 불가 → @shared/types/ 사용 - "@utils": path.resolve(__dirname, "src/shared/utils"), + "@utils": path.resolve(dirname, "src/shared/utils"), }, }, }); From 2e20dc543a28c174eeedbfa616d6969a571c2be3 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 01:10:20 +0900 Subject: [PATCH 11/65] =?UTF-8?q?feat:=20=EB=9D=BC=EC=9A=B0=ED=84=B0=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/routes/router.tsx | 0 week4/homework/member/src/App.tsx | 9 ++++++- week4/homework/member/src/routes/router.tsx | 26 +++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) delete mode 100644 week4/homework/member/routes/router.tsx create mode 100644 week4/homework/member/src/routes/router.tsx diff --git a/week4/homework/member/routes/router.tsx b/week4/homework/member/routes/router.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/week4/homework/member/src/App.tsx b/week4/homework/member/src/App.tsx index b4f6543..c9eac4d 100644 --- a/week4/homework/member/src/App.tsx +++ b/week4/homework/member/src/App.tsx @@ -1,5 +1,12 @@ +import Router from "@routes/router"; +import { themeClass } from "@styles/theme.css"; + function App() { - return <>; + return ( +
+ +
+ ); } export default App; diff --git a/week4/homework/member/src/routes/router.tsx b/week4/homework/member/src/routes/router.tsx new file mode 100644 index 0000000..447605e --- /dev/null +++ b/week4/homework/member/src/routes/router.tsx @@ -0,0 +1,26 @@ +import { createBrowserRouter, RouterProvider } from "react-router-dom"; +import Layout from "./RootLayout"; +import LoginPage from "@pages/login/LoginPage.tsx"; +import SignupPage from "@pages/signup/SignupPage"; +import MyPage from "@pages/mypage/MyPage"; +import SearchPage from "@pages/search/SearchPage"; + +const router = createBrowserRouter([ + { + path: "/", + element: , + children: [ + // { index: true, element: }, + { path: "login", element: }, + { path: "signup", element: }, + { path: "mypage/info", element: }, + { path: "mypage/search", element: }, + ], + }, +]); + +const Router = () => { + return ; +}; + +export default Router; From 2b69590fcf555c12291e7e6968dd56ac88effa7c Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 01:27:14 +0900 Subject: [PATCH 12/65] =?UTF-8?q?style:=20=EC=A0=84=EC=97=AD=20=EC=8A=A4?= =?UTF-8?q?=ED=83=80=EC=9D=BC=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/App.tsx | 1 + .../member/src/shared/styles/theme.css.ts | 26 +++++++------------ 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/week4/homework/member/src/App.tsx b/week4/homework/member/src/App.tsx index c9eac4d..f6814e2 100644 --- a/week4/homework/member/src/App.tsx +++ b/week4/homework/member/src/App.tsx @@ -1,4 +1,5 @@ import Router from "@routes/router"; +import "@styles/global.css"; import { themeClass } from "@styles/theme.css"; function App() { diff --git a/week4/homework/member/src/shared/styles/theme.css.ts b/week4/homework/member/src/shared/styles/theme.css.ts index 1cc0d7c..7194fcb 100644 --- a/week4/homework/member/src/shared/styles/theme.css.ts +++ b/week4/homework/member/src/shared/styles/theme.css.ts @@ -1,19 +1,13 @@ import { createTheme } from "@vanilla-extract/css"; export const [themeClass, vars] = createTheme({ - fontSize: { - sm: "0.875rem", - md: "1rem", - lg: "1.25rem", - xl: "2.5rem", - }, - color: { - red: "#FF0000", - gray: "#828282", - black: "#222222", - white: "#F9F7F7", - lightBlue: "#DBE2EF", - blue: "#3F72AF", - navy: "#112D4E", - }, -}); \ No newline at end of file + color: { + red: "#FF0000", + gray: "#828282", + black: "#222222", + white: "#F9F7F7", + lightBlue: "#DBE2EF", + blue: "#3F72AF", + navy: "#112D4E", + }, +}); From f94f5b4fc1b27233446895b293c3832d4972a83d Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 01:27:25 +0900 Subject: [PATCH 13/65] =?UTF-8?q?chore:=20=EB=9D=BC=EC=9A=B0=ED=84=B0=20ur?= =?UTF-8?q?l=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/routes/router.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/week4/homework/member/src/routes/router.tsx b/week4/homework/member/src/routes/router.tsx index 447605e..c7842d8 100644 --- a/week4/homework/member/src/routes/router.tsx +++ b/week4/homework/member/src/routes/router.tsx @@ -13,7 +13,7 @@ const router = createBrowserRouter([ // { index: true, element: }, { path: "login", element: }, { path: "signup", element: }, - { path: "mypage/info", element: }, + { path: "mypage", element: }, { path: "mypage/search", element: }, ], }, From b3f755ca4e4151b4db0c6e9030d96238114cd3e7 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 01:30:21 +0900 Subject: [PATCH 14/65] =?UTF-8?q?feat:=20outlet=20=ED=99=9C=EC=9A=A9=20+?= =?UTF-8?q?=20=ED=97=A4=EB=8D=94=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/routes/RootLayout.css.ts | 15 ++++++ .../homework/member/src/routes/RootLayout.tsx | 19 +++++++ .../shared/components/header/Header.css.ts | 49 +++++++++++++++++++ .../src/shared/components/header/Header.tsx | 41 ++++++++++++++++ 4 files changed, 124 insertions(+) create mode 100644 week4/homework/member/src/routes/RootLayout.css.ts create mode 100644 week4/homework/member/src/routes/RootLayout.tsx create mode 100644 week4/homework/member/src/shared/components/header/Header.css.ts create mode 100644 week4/homework/member/src/shared/components/header/Header.tsx diff --git a/week4/homework/member/src/routes/RootLayout.css.ts b/week4/homework/member/src/routes/RootLayout.css.ts new file mode 100644 index 0000000..a74fd14 --- /dev/null +++ b/week4/homework/member/src/routes/RootLayout.css.ts @@ -0,0 +1,15 @@ +import { style } from "@vanilla-extract/css"; + +export const wrapper = style({ + height: "100dvh", + display: "flex", + flexDirection: "column", + alignItems: "center", +}); + +export const container = style({ + flex: 1, + display: "flex", + justifyContent: "center", + alignItems: "center", +}); diff --git a/week4/homework/member/src/routes/RootLayout.tsx b/week4/homework/member/src/routes/RootLayout.tsx new file mode 100644 index 0000000..160f938 --- /dev/null +++ b/week4/homework/member/src/routes/RootLayout.tsx @@ -0,0 +1,19 @@ +import { Outlet, useLocation } from "react-router-dom"; +import * as styles from "./RootLayout.css"; +import Header from "@components/header/Header"; + +const RootLayout = () => { + const location = useLocation(); + const showHeader = location.pathname.startsWith("/mypage"); + + return ( +
+ {showHeader &&
} +
+ +
+
+ ); +}; + +export default RootLayout; diff --git a/week4/homework/member/src/shared/components/header/Header.css.ts b/week4/homework/member/src/shared/components/header/Header.css.ts new file mode 100644 index 0000000..2aaff7d --- /dev/null +++ b/week4/homework/member/src/shared/components/header/Header.css.ts @@ -0,0 +1,49 @@ +import { style } from "@vanilla-extract/css"; +import { vars } from "@styles/theme.css"; + +export const HeaderContainer = style({ + display: "flex", + justifyContent: "space-between", + alignItems: "center", + padding: "2rem", + gap: "1rem", + width: "100%", + backgroundColor: vars.color.navy, + color: vars.color.white, +}); + +export const LeftText = style({ + display: "flex", + flexDirection: "column", + justifyContent: "flex-start", + alignItems: "center", + gap: "1rem", +}); + +export const RightText = style({ + display: "flex", + justifyContent: "flex-start", + alignItems: "center", + gap: "1rem", +}); + +export const headerText = style({ + fontSize: "2rem", + fontWeight: "bold", +}); + +export const btnText = style({ + fontSize: "1.5rem", + fontWeight: "bold", + + selectors: { + "&:hover": { + color: vars.color.lightBlue, + cursor: "pointer", + }, + }, +}); + +export const pText = style({ + fontSize: "1.2rem", +}); diff --git a/week4/homework/member/src/shared/components/header/Header.tsx b/week4/homework/member/src/shared/components/header/Header.tsx new file mode 100644 index 0000000..8c76bce --- /dev/null +++ b/week4/homework/member/src/shared/components/header/Header.tsx @@ -0,0 +1,41 @@ +import * as styles from "./Header.css"; +import { useNavigate } from "react-router-dom"; + +const nickname = "웨비들아따랑해"; + +const Header = () => { + const navigate = useNavigate(); + + const handleNavigate = (select: string) => { + if (select === "me") { + navigate("/mypage/info"); + } else if (select === "search") { + navigate("/mypage/search"); + } + }; + + return ( +
+
+

SOPT MEMBERS

+

안녕하세요 {nickname}님

+
+ +
+ + + + {/*

닉네임

*/} +
+
+ ); +}; + +export default Header; From d41d7b720ce3e23f22953dd6d4d44eb9fc8b7e71 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 01:30:31 +0900 Subject: [PATCH 15/65] =?UTF-8?q?feat:=20=EA=B8=B0=EB=B3=B8=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/pages/login/LoginPage.tsx | 10 ++++++++++ week4/homework/member/src/pages/mypage/MyPage.tsx | 10 ++++++++++ week4/homework/member/src/pages/search/SearchPage.tsx | 10 ++++++++++ week4/homework/member/src/pages/signup/SignupPage.tsx | 10 ++++++++++ 4 files changed, 40 insertions(+) create mode 100644 week4/homework/member/src/pages/login/LoginPage.tsx create mode 100644 week4/homework/member/src/pages/mypage/MyPage.tsx create mode 100644 week4/homework/member/src/pages/search/SearchPage.tsx create mode 100644 week4/homework/member/src/pages/signup/SignupPage.tsx diff --git a/week4/homework/member/src/pages/login/LoginPage.tsx b/week4/homework/member/src/pages/login/LoginPage.tsx new file mode 100644 index 0000000..febc5ca --- /dev/null +++ b/week4/homework/member/src/pages/login/LoginPage.tsx @@ -0,0 +1,10 @@ +const LoginPage = () => { + return ( + <> + 로그인페이지 +

네..

+ + ); +}; + +export default LoginPage; diff --git a/week4/homework/member/src/pages/mypage/MyPage.tsx b/week4/homework/member/src/pages/mypage/MyPage.tsx new file mode 100644 index 0000000..b055972 --- /dev/null +++ b/week4/homework/member/src/pages/mypage/MyPage.tsx @@ -0,0 +1,10 @@ +const MyPage = () => { + return ( + <> + 마이페이지 +

네..

+ + ); +}; + +export default MyPage; diff --git a/week4/homework/member/src/pages/search/SearchPage.tsx b/week4/homework/member/src/pages/search/SearchPage.tsx new file mode 100644 index 0000000..6f794fc --- /dev/null +++ b/week4/homework/member/src/pages/search/SearchPage.tsx @@ -0,0 +1,10 @@ +const SearchPage = () => { + return ( + <> + 검색페이지 +

네..

+ + ); +}; + +export default SearchPage; diff --git a/week4/homework/member/src/pages/signup/SignupPage.tsx b/week4/homework/member/src/pages/signup/SignupPage.tsx new file mode 100644 index 0000000..1de9cf0 --- /dev/null +++ b/week4/homework/member/src/pages/signup/SignupPage.tsx @@ -0,0 +1,10 @@ +const SignupPage = () => { + return ( + <> + 회원가입페이지 +

네..

+ + ); +}; + +export default SignupPage; From 8d7bb6c0f6f5227b034e2c4d7f313655dab27edf Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 02:14:51 +0900 Subject: [PATCH 16/65] =?UTF-8?q?chore:=20react=20icon=20=EC=84=A4?= =?UTF-8?q?=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/package.json | 1 + week4/homework/member/pnpm-lock.yaml | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/week4/homework/member/package.json b/week4/homework/member/package.json index a8599a8..40df3ab 100644 --- a/week4/homework/member/package.json +++ b/week4/homework/member/package.json @@ -16,6 +16,7 @@ "axios": "^1.16.0", "react": "^19.2.5", "react-dom": "^19.2.5", + "react-icons": "^5.6.0", "react-router-dom": "^7.15.0" }, "devDependencies": { diff --git a/week4/homework/member/pnpm-lock.yaml b/week4/homework/member/pnpm-lock.yaml index 8b89102..2105bc9 100644 --- a/week4/homework/member/pnpm-lock.yaml +++ b/week4/homework/member/pnpm-lock.yaml @@ -26,6 +26,9 @@ importers: react-dom: specifier: ^19.2.5 version: 19.2.6(react@19.2.6) + react-icons: + specifier: ^5.6.0 + version: 5.6.0(react@19.2.6) react-router-dom: specifier: ^7.15.0 version: 7.15.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -1148,6 +1151,11 @@ packages: peerDependencies: react: ^19.2.6 + react-icons@5.6.0: + resolution: {integrity: sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==} + peerDependencies: + react: '*' + react-router-dom@7.15.0: resolution: {integrity: sha512-VcrVg64Fo8nwBvDscajG8gRTLIuTC6N50nb22l2HOOV4PTOHgoGp8mUjy9wLiHYoYTSYI36tUnXZgasSRFZorQ==} engines: {node: '>=20.0.0'} @@ -2357,6 +2365,10 @@ snapshots: react: 19.2.6 scheduler: 0.27.0 + react-icons@5.6.0(react@19.2.6): + dependencies: + react: 19.2.6 + react-router-dom@7.15.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: react: 19.2.6 From cce8e944e771f4ed8dcff05452ac27f6ecfd6dc4 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 02:15:00 +0900 Subject: [PATCH 17/65] =?UTF-8?q?feat:=20=EB=B2=84=ED=8A=BC=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shared/components/button/Button.css.ts | 31 +++++++++++++++++++ .../src/shared/components/button/Button.tsx | 29 +++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 week4/homework/member/src/shared/components/button/Button.css.ts create mode 100644 week4/homework/member/src/shared/components/button/Button.tsx diff --git a/week4/homework/member/src/shared/components/button/Button.css.ts b/week4/homework/member/src/shared/components/button/Button.css.ts new file mode 100644 index 0000000..be2266a --- /dev/null +++ b/week4/homework/member/src/shared/components/button/Button.css.ts @@ -0,0 +1,31 @@ +import { recipe } from "@vanilla-extract/recipes"; +import { vars } from "@styles/theme.css"; + +export const button = recipe({ + base: { + alignItems: "center", + gap: "0.8rem", + border: "none", + borderRadius: "999px", + padding: "0rem 1.2rem", + height: "2.8rem", + }, + variants: { + state: { + active: { + backgroundColor: vars.color.blue, + ":active": { + backgroundColor: vars.color.lightBlue, + }, + }, + disabled: { + backgroundColor: vars.color.gray, + cursor: "not-allowed", + color: vars.color.white, + }, + }, + }, + defaultVariants: { + state: "active", + }, +}); diff --git a/week4/homework/member/src/shared/components/button/Button.tsx b/week4/homework/member/src/shared/components/button/Button.tsx new file mode 100644 index 0000000..49cb170 --- /dev/null +++ b/week4/homework/member/src/shared/components/button/Button.tsx @@ -0,0 +1,29 @@ +import * as styles from "./Button.css"; + +interface ButtonProps extends React.ComponentProps<"button"> { + children: React.ReactNode; + isActive?: boolean; +} + +const Button = ({ + children, + isActive = true, + disabled = false, + ...props +}: ButtonProps) => { + const isDisabled = disabled || !isActive; + return ( + + ); +}; + +export default Button; From 47e509eaf0e3ae15a152fa26df0d6d119c095822 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 02:15:12 +0900 Subject: [PATCH 18/65] =?UTF-8?q?feat:=20textField=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=88=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/textField/TextField.css.ts | 57 +++++++++++++++ .../shared/components/textField/TextField.tsx | 70 +++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 week4/homework/member/src/shared/components/textField/TextField.css.ts create mode 100644 week4/homework/member/src/shared/components/textField/TextField.tsx diff --git a/week4/homework/member/src/shared/components/textField/TextField.css.ts b/week4/homework/member/src/shared/components/textField/TextField.css.ts new file mode 100644 index 0000000..0a3186b --- /dev/null +++ b/week4/homework/member/src/shared/components/textField/TextField.css.ts @@ -0,0 +1,57 @@ +import { vars } from "@styles/theme.css"; +import { style } from "@vanilla-extract/css"; + +export const container = style({ + display: "flex", + flexDirection: "column", + gap: "1rem", + alignItems: "center", + width: "100%", +}); + +export const label = style({ + fontSize: "1.3rem", + fontWeight: "bold", +}); + +export const inputWrapper = style({ + position: "relative", + display: "flex", + alignItems: "center", + width: "100%", +}); + +export const input = style({ + width: "100%", + fontSize: "1.3rem", + padding: "1rem", + paddingRight: "3rem", + borderRadius: "8px", + border: `1px solid ${vars.color.gray}`, + selectors: { + "&:focus": { + outline: "none", + borderColor: vars.color.blue, + }, + }, +}); + +export const iconBtn = style({ + position: "absolute", + right: "1rem", + background: "none", + border: "none", + cursor: "pointer", + display: "flex", + alignItems: "center", + justifyContent: "center", + padding: 0, + color: vars.color.gray, + fontSize: "1.2rem", +}); + +export const errorMessage = style({ + fontSize: "1.3rem", + color: vars.color.red, + marginTop: "0.2rem", +}); diff --git a/week4/homework/member/src/shared/components/textField/TextField.tsx b/week4/homework/member/src/shared/components/textField/TextField.tsx new file mode 100644 index 0000000..2b840f0 --- /dev/null +++ b/week4/homework/member/src/shared/components/textField/TextField.tsx @@ -0,0 +1,70 @@ +import { useState, type ChangeEvent, type ComponentProps } from "react"; +import * as styles from "./TextField.css"; +import { FaEyeSlash, FaEye } from "react-icons/fa"; + +interface TextFieldProps extends Omit< + ComponentProps<"input">, + "value" | "onChange" +> { + label: string; + value: string; + onChange: (value: string) => void; + errorMessage?: string; +} + +const TextField = ({ + label, + value, + onChange, + errorMessage, + id, + type, + ...props +}: TextFieldProps) => { + const inputId = id ?? label; + const hasError = Boolean(errorMessage); + + // 비밀번호 보이기 + const [showPassword, setShowPassword] = useState(false); + + const handleChange = (event: ChangeEvent) => { + onChange(event.target.value); + }; + + const isPasswordType = type === "password"; + const currentType = isPasswordType && showPassword ? "text" : type; + + return ( +
+ + +
+ + + {isPasswordType && ( + + )} +
+ + {errorMessage &&

{errorMessage}

} +
+ ); +}; + +export default TextField; From a9979c6636c08cb4dd876f094bf92406e2e6f10f Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 02:31:02 +0900 Subject: [PATCH 19/65] =?UTF-8?q?chore:=20createGlobalTheme=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/App.tsx | 8 +--- .../member/src/shared/styles/global.css.ts | 44 +++++++++++-------- .../member/src/shared/styles/theme.css.ts | 4 +- 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/week4/homework/member/src/App.tsx b/week4/homework/member/src/App.tsx index f6814e2..a3fce1a 100644 --- a/week4/homework/member/src/App.tsx +++ b/week4/homework/member/src/App.tsx @@ -1,13 +1,9 @@ import Router from "@routes/router"; import "@styles/global.css"; -import { themeClass } from "@styles/theme.css"; +import "@styles/theme.css"; function App() { - return ( -
- -
- ); + return ; } export default App; diff --git a/week4/homework/member/src/shared/styles/global.css.ts b/week4/homework/member/src/shared/styles/global.css.ts index 89ea66e..f769094 100644 --- a/week4/homework/member/src/shared/styles/global.css.ts +++ b/week4/homework/member/src/shared/styles/global.css.ts @@ -1,25 +1,33 @@ -import './reset.css.ts'; -import { globalStyle } from '@vanilla-extract/css'; +import { vars } from "@styles/theme.css"; +import "./reset.css.ts"; +import { globalStyle } from "@vanilla-extract/css"; -globalStyle('*', { - boxSizing: 'border-box', +globalStyle("*", { + boxSizing: "border-box", }); -globalStyle('body', { - margin: 0, - fontFamily: 'sans-serif', - background: '#fff', - color: '#222', +globalStyle("html, body", { + margin: 0, + padding: 0, + height: "100%", + minHeight: "100vh", }); -globalStyle('main', { - width: '100%', +globalStyle("body", { + margin: 0, + fontFamily: "sans-serif", + background: vars.color.lightBlue, + color: "#222", }); -globalStyle('button', { - all: 'unset', - cursor: 'pointer', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', -}); \ No newline at end of file +globalStyle("main", { + width: "100%", +}); + +globalStyle("button", { + all: "unset", + cursor: "pointer", + display: "flex", + justifyContent: "center", + alignItems: "center", +}); diff --git a/week4/homework/member/src/shared/styles/theme.css.ts b/week4/homework/member/src/shared/styles/theme.css.ts index 7194fcb..dbbf311 100644 --- a/week4/homework/member/src/shared/styles/theme.css.ts +++ b/week4/homework/member/src/shared/styles/theme.css.ts @@ -1,6 +1,6 @@ -import { createTheme } from "@vanilla-extract/css"; +import { createGlobalTheme } from "@vanilla-extract/css"; -export const [themeClass, vars] = createTheme({ +export const vars = createGlobalTheme(":root", { color: { red: "#FF0000", gray: "#828282", From 46bf1c5f8c21eada34fbcdc9b3848f7a23d01ab6 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 02:44:58 +0900 Subject: [PATCH 20/65] =?UTF-8?q?style:=20button,=20textField=20=EC=8A=A4?= =?UTF-8?q?=ED=83=80=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/shared/components/button/Button.css.ts | 14 +++++++++----- .../shared/components/textField/TextField.css.ts | 5 +++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/week4/homework/member/src/shared/components/button/Button.css.ts b/week4/homework/member/src/shared/components/button/Button.css.ts index be2266a..f2c6e4a 100644 --- a/week4/homework/member/src/shared/components/button/Button.css.ts +++ b/week4/homework/member/src/shared/components/button/Button.css.ts @@ -6,16 +6,20 @@ export const button = recipe({ alignItems: "center", gap: "0.8rem", border: "none", - borderRadius: "999px", - padding: "0rem 1.2rem", + borderRadius: "8px", + padding: "0.5rem 0", height: "2.8rem", + backgroundColor: vars.color.blue, + color: vars.color.white, + width: "100%", + fontSize: "1.3rem", + fontWeight: "bold", }, variants: { state: { active: { - backgroundColor: vars.color.blue, - ":active": { - backgroundColor: vars.color.lightBlue, + ":hover": { + backgroundColor: vars.color.navy, }, }, disabled: { diff --git a/week4/homework/member/src/shared/components/textField/TextField.css.ts b/week4/homework/member/src/shared/components/textField/TextField.css.ts index 0a3186b..94b916a 100644 --- a/week4/homework/member/src/shared/components/textField/TextField.css.ts +++ b/week4/homework/member/src/shared/components/textField/TextField.css.ts @@ -12,6 +12,7 @@ export const container = style({ export const label = style({ fontSize: "1.3rem", fontWeight: "bold", + alignSelf: "flex-start", }); export const inputWrapper = style({ @@ -38,7 +39,7 @@ export const input = style({ export const iconBtn = style({ position: "absolute", - right: "1rem", + right: "1.3rem", background: "none", border: "none", cursor: "pointer", @@ -47,7 +48,7 @@ export const iconBtn = style({ justifyContent: "center", padding: 0, color: vars.color.gray, - fontSize: "1.2rem", + fontSize: "1.5rem", }); export const errorMessage = style({ From 8543ad7032a519298f7ae6ab70e439300f5b1fe4 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 02:45:15 +0900 Subject: [PATCH 21/65] =?UTF-8?q?feat:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20UI=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/pages/login/Login.css.ts | 48 +++++++++++++++++++ .../member/src/pages/login/LoginPage.tsx | 39 +++++++++++++-- 2 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 week4/homework/member/src/pages/login/Login.css.ts diff --git a/week4/homework/member/src/pages/login/Login.css.ts b/week4/homework/member/src/pages/login/Login.css.ts new file mode 100644 index 0000000..8daefb8 --- /dev/null +++ b/week4/homework/member/src/pages/login/Login.css.ts @@ -0,0 +1,48 @@ +import { vars } from "@styles/theme.css"; +import { style } from "@vanilla-extract/css"; + +export const wrapper = style({ + display: "flex", + flexDirection: "column", + gap: "3rem", + alignItems: "center", + justifyContent: "center", + width: "100%", +}); + +export const header = style({ + fontSize: "3rem", + fontWeight: "bold", +}); + +export const container = style({ + display: "flex", + flexDirection: "column", + gap: "3rem", + alignItems: "center", + justifyContent: "center", + width: "70%", +}); + +export const btnContainer = style({ + display: "flex", + flexDirection: "column", + gap: "1.3rem", + alignItems: "center", + justifyContent: "center", + width: "70%", + marginTop: "2rem", +}); + +export const btn = style({ + color: vars.color.blue, + fontSize: "1.3rem", + fontWeight: "bold", + + selectors: { + "&:hover": { + textDecoration: "underline", + color: vars.color.navy, + }, + }, +}); diff --git a/week4/homework/member/src/pages/login/LoginPage.tsx b/week4/homework/member/src/pages/login/LoginPage.tsx index febc5ca..2ea96e9 100644 --- a/week4/homework/member/src/pages/login/LoginPage.tsx +++ b/week4/homework/member/src/pages/login/LoginPage.tsx @@ -1,9 +1,40 @@ +import TextField from "@components/textField/TextField"; +import { useState } from "react"; +import * as styles from "./Login.css"; +import Button from "@components/button/Button"; +import { useNavigate } from "react-router-dom"; + const LoginPage = () => { + const [id, setId] = useState(""); + const [password, setPassword] = useState(""); + const navigate = useNavigate(); + + const handleGoToSignup = () => { + navigate("/signup"); + }; + + // 버튼 비활성화 조건 + const isNextDisabled = !id || !password; + return ( - <> - 로그인페이지 -

네..

- +
+

SOPT MEMBERS

+
+ + +
+
+ + +
+
); }; From 2ed01d4141eacaa81b8df42c1851f57d8408f22a Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 02:46:43 +0900 Subject: [PATCH 22/65] =?UTF-8?q?style:=20=EB=B2=84=ED=8A=BC=EC=97=90=20tr?= =?UTF-8?q?ansition=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/shared/components/button/Button.css.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/week4/homework/member/src/shared/components/button/Button.css.ts b/week4/homework/member/src/shared/components/button/Button.css.ts index f2c6e4a..07e675a 100644 --- a/week4/homework/member/src/shared/components/button/Button.css.ts +++ b/week4/homework/member/src/shared/components/button/Button.css.ts @@ -14,6 +14,7 @@ export const button = recipe({ width: "100%", fontSize: "1.3rem", fontWeight: "bold", + transition: "background-color 0.2s ease-in-out, transform 0.1s active", }, variants: { state: { From cc4169f4e73f01302491c067635cce5e6fbe1cd5 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 03:13:21 +0900 Subject: [PATCH 23/65] =?UTF-8?q?feat:=20=ED=98=95=EC=8B=9D=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC=20=EA=B5=AC=ED=98=84=20(=EC=97=90=EB=9F=AC=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80,=20=ED=98=95=EC=8B=9D=20=EC=A1=B0=EA=B1=B4?= =?UTF-8?q?=20=EC=83=81=EC=88=98=ED=99=94)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/signup/constants/errorMessages.ts | 22 +++++++++ .../src/pages/signup/constants/validation.ts | 9 ++++ .../member/src/pages/signup/utils/validate.ts | 49 +++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 week4/homework/member/src/pages/signup/constants/errorMessages.ts create mode 100644 week4/homework/member/src/pages/signup/constants/validation.ts create mode 100644 week4/homework/member/src/pages/signup/utils/validate.ts diff --git a/week4/homework/member/src/pages/signup/constants/errorMessages.ts b/week4/homework/member/src/pages/signup/constants/errorMessages.ts new file mode 100644 index 0000000..94db380 --- /dev/null +++ b/week4/homework/member/src/pages/signup/constants/errorMessages.ts @@ -0,0 +1,22 @@ +export const SIGNUP_ERROR_MESSAGE = { + id: { + invalid: "아이디는 50자를 넘을 수 없습니다", + }, + password: { + invalid: + "비밀번호는 8~64자, 공백 없이 영문/숫자/대소문자 각 1자 이상 포함해야 합니다", + }, + passwordCheck: { + mismatch: "비밀번호가 일치하지 않습니다.", + }, + email: { + invalid: "이메일 형식이 올바르지 않습니다.", + }, + name: { + required: "닉네임을 입력해주세요.", + invalid: "닉네임은 1~20자, 한글/영어/숫자만 가능합니다.", + }, + age: { + invalid: "숫자만 입력 가능합니다.", + }, +}; diff --git a/week4/homework/member/src/pages/signup/constants/validation.ts b/week4/homework/member/src/pages/signup/constants/validation.ts new file mode 100644 index 0000000..2c12361 --- /dev/null +++ b/week4/homework/member/src/pages/signup/constants/validation.ts @@ -0,0 +1,9 @@ +// field 검증 관련 상수 +export const VALIDATION_RULES = { + ID_MAX_LENGTH: 50, + PASSWORD_REGEX: + /^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,64}$/, + PASSWORD_NO_SPACE: /^\S*$/, + EMAIL_REGEX: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/, + AGE_REGEX: /^[0-9]*$/, +}; diff --git a/week4/homework/member/src/pages/signup/utils/validate.ts b/week4/homework/member/src/pages/signup/utils/validate.ts new file mode 100644 index 0000000..46a64d1 --- /dev/null +++ b/week4/homework/member/src/pages/signup/utils/validate.ts @@ -0,0 +1,49 @@ +// 회원가입 필드 유효성 검사 로직 +import { SIGNUP_ERROR_MESSAGE } from "../constants/errorMessages"; +import { VALIDATION_RULES } from "../constants/validation"; + +// 아이디 +export const validateId = (id: string) => { + if (!id) return; + if (id.length > VALIDATION_RULES.ID_MAX_LENGTH) { + return SIGNUP_ERROR_MESSAGE.id.invalid; + } + return ""; +}; + +// 비밀번호 +export const validatePassword = (password: string) => { + if (!password) return; + if (!VALIDATION_RULES.PASSWORD_NO_SPACE.test(password)) { + return SIGNUP_ERROR_MESSAGE.password.invalid; + } + if (!VALIDATION_RULES.PASSWORD_REGEX.test(password)) { + return SIGNUP_ERROR_MESSAGE.password.invalid; + } + return ""; +}; + +// 비밀번호 일치 +export const validatePasswordConfirm = (password: string, confirm: string) => { + if (!confirm) return; + if (password !== confirm) return SIGNUP_ERROR_MESSAGE.passwordCheck.mismatch; + return ""; +}; + +// 이메일 형식 +export const validateEmail = (email: string) => { + if (!email) return; + if (!VALIDATION_RULES.EMAIL_REGEX.test(email)) { + return SIGNUP_ERROR_MESSAGE.email.invalid; + } + return ""; +}; + +// 나이 +export const validateAge = (age: string) => { + if (!age) return; + if (!VALIDATION_RULES.AGE_REGEX.test(age)) { + return SIGNUP_ERROR_MESSAGE.age.invalid; + } + return ""; +}; From faa07844b7305128cd1deb3eb744786e6cb90495 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 03:59:17 +0900 Subject: [PATCH 24/65] =?UTF-8?q?chore:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=EC=97=90=20placeholder=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/login/{Login.css.ts => LoginPage.css.ts} | 0 week4/homework/member/src/pages/login/LoginPage.tsx | 11 +++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) rename week4/homework/member/src/pages/login/{Login.css.ts => LoginPage.css.ts} (100%) diff --git a/week4/homework/member/src/pages/login/Login.css.ts b/week4/homework/member/src/pages/login/LoginPage.css.ts similarity index 100% rename from week4/homework/member/src/pages/login/Login.css.ts rename to week4/homework/member/src/pages/login/LoginPage.css.ts diff --git a/week4/homework/member/src/pages/login/LoginPage.tsx b/week4/homework/member/src/pages/login/LoginPage.tsx index 2ea96e9..8a2e3af 100644 --- a/week4/homework/member/src/pages/login/LoginPage.tsx +++ b/week4/homework/member/src/pages/login/LoginPage.tsx @@ -1,6 +1,6 @@ import TextField from "@components/textField/TextField"; import { useState } from "react"; -import * as styles from "./Login.css"; +import * as styles from "./LoginPage.css"; import Button from "@components/button/Button"; import { useNavigate } from "react-router-dom"; @@ -20,11 +20,18 @@ const LoginPage = () => {

SOPT MEMBERS

- +
From 9b2ebb4568885b07b03fe5a6a4eeda56cdfa6d78 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 03:59:51 +0900 Subject: [PATCH 25/65] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20step=EB=B3=84=20field=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EA=B2=80=EC=82=AC=20=ED=9B=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/signup/hooks/useSignupForm.ts | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 week4/homework/member/src/pages/signup/hooks/useSignupForm.ts diff --git a/week4/homework/member/src/pages/signup/hooks/useSignupForm.ts b/week4/homework/member/src/pages/signup/hooks/useSignupForm.ts new file mode 100644 index 0000000..025553a --- /dev/null +++ b/week4/homework/member/src/pages/signup/hooks/useSignupForm.ts @@ -0,0 +1,108 @@ +import { + validateAge, + validateEmail, + validateId, + validatePassword, + validatePasswordConfirm, +} from "../utils/validate"; +import { useMemo, useState } from "react"; + +interface InitialFormData { + id: string; + password: string; + passwordConfirm: string; + name: string; + email: string; + age: string; + part: string; +} + +const initialValues: InitialFormData = { + id: "", + password: "", + passwordConfirm: "", + name: "", + email: "", + age: "", + part: "", +}; + +const useSignupForm = () => { + const [step, setStep] = useState(1); + const [values, setValues] = useState(initialValues); + const [touched, setTouched] = useState>({}); + + // 현재 스템의 에러 메시지 + const errors = useMemo(() => { + const currentErrors: Record = {}; + + if (step === 1) { + const error = validateId(values.id); + if (error) currentErrors.id = error; + } + + if (step === 2) { + const passwordError = validatePassword(values.password); + const confirmError = validatePasswordConfirm( + values.password, + values.passwordConfirm, + ); + if (passwordError) currentErrors.password = passwordError; + if (confirmError) currentErrors.passwordConfirm = confirmError; + } + + if (step === 3) { + const emailError = validateEmail(values.email); + const ageError = validateAge(values.age); + + if (!values.name) currentErrors.name = "이름을 입력해주세요."; + if (emailError) currentErrors.email = emailError; + if (ageError) currentErrors.age = ageError; + if (!values.part) currentErrors.part = "파트를 선택해주세요."; + } + + return currentErrors; + }, [values, step]); + + // 다 입려되었는지 + const isStepFilled = useMemo(() => { + if (step === 1) return !!values.id; + if (step === 2) return !!values.password && !!values.passwordConfirm; + if (step === 3) + return !!values.name && !!values.email && !!values.age && !!values.part; + return false; + }, [values, step]); + + const isNextDisabled = Object.keys(errors).length > 0 || !isStepFilled; + + const nextStep = () => { + if (!isNextDisabled) setStep((prev) => prev + 1); + }; + + // 입력 + const handleChange = (name: string, value: string) => { + setValues((prev) => ({ ...prev, [name]: value })); + }; + + // 포커스 아웃 되었을 때 에러 메시지 띄우기 + const handleBlur = (name: string) => { + setTouched((prev) => ({ ...prev, [name]: true })); + }; + + const getInputProps = (name: keyof typeof values) => ({ + value: values[name], + onChange: (val: string) => handleChange(name, val), + onBlur: () => handleBlur(name), + errorMessage: touched[name] ? errors[name] : "", + }); + + return { + step, + nextStep, + isNextDisabled, + getInputProps, + values, + }; +}; + +export default useSignupForm; From 88b7758afb3f927fb1e083cdd924f4f009981e16 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 04:03:51 +0900 Subject: [PATCH 26/65] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EB=8B=A8=EA=B3=84=EB=B3=84=20UI=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(=ED=8C=8C=ED=8A=B8=20=EB=93=9C=EB=A1=AD=EB=8B=A4?= =?UTF-8?q?=EC=9A=B4=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/pages/signup/SignupPage.css.ts | 48 +++++++++++ .../member/src/pages/signup/SignupPage.tsx | 82 ++++++++++++++++++- .../src/pages/signup/constants/partOption.ts | 1 + .../components/textField/PartSelect.tsx | 44 ++++++++++ .../components/textField/TextField.css.ts | 1 + 5 files changed, 172 insertions(+), 4 deletions(-) create mode 100644 week4/homework/member/src/pages/signup/SignupPage.css.ts create mode 100644 week4/homework/member/src/pages/signup/constants/partOption.ts create mode 100644 week4/homework/member/src/shared/components/textField/PartSelect.tsx diff --git a/week4/homework/member/src/pages/signup/SignupPage.css.ts b/week4/homework/member/src/pages/signup/SignupPage.css.ts new file mode 100644 index 0000000..8daefb8 --- /dev/null +++ b/week4/homework/member/src/pages/signup/SignupPage.css.ts @@ -0,0 +1,48 @@ +import { vars } from "@styles/theme.css"; +import { style } from "@vanilla-extract/css"; + +export const wrapper = style({ + display: "flex", + flexDirection: "column", + gap: "3rem", + alignItems: "center", + justifyContent: "center", + width: "100%", +}); + +export const header = style({ + fontSize: "3rem", + fontWeight: "bold", +}); + +export const container = style({ + display: "flex", + flexDirection: "column", + gap: "3rem", + alignItems: "center", + justifyContent: "center", + width: "70%", +}); + +export const btnContainer = style({ + display: "flex", + flexDirection: "column", + gap: "1.3rem", + alignItems: "center", + justifyContent: "center", + width: "70%", + marginTop: "2rem", +}); + +export const btn = style({ + color: vars.color.blue, + fontSize: "1.3rem", + fontWeight: "bold", + + selectors: { + "&:hover": { + textDecoration: "underline", + color: vars.color.navy, + }, + }, +}); diff --git a/week4/homework/member/src/pages/signup/SignupPage.tsx b/week4/homework/member/src/pages/signup/SignupPage.tsx index 1de9cf0..bd8fe7c 100644 --- a/week4/homework/member/src/pages/signup/SignupPage.tsx +++ b/week4/homework/member/src/pages/signup/SignupPage.tsx @@ -1,9 +1,83 @@ +import { useNavigate } from "react-router-dom"; +import TextField from "@components/textField/TextField"; +import Button from "@components/button/Button"; +import PartSelect from "@components/textField/partSelect"; +import useSignupForm from "./hooks/useSignupForm"; +import { PART_OPTIONS } from "./constants/partOption"; +import * as styles from "./SignupPage.css"; + const SignupPage = () => { + const navigate = useNavigate(); + + const handleGoToLogin = () => { + navigate("/login"); + }; + + const { step, nextStep, isNextDisabled, getInputProps } = useSignupForm(); + return ( - <> - 회원가입페이지 -

네..

- +
+

회원가입

+
+ {step === 1 && ( + + )} + + {step === 2 && ( + <> + + + + )} + + {step === 3 && ( + <> + + + + + + )} +
+
+ + +
+
); }; diff --git a/week4/homework/member/src/pages/signup/constants/partOption.ts b/week4/homework/member/src/pages/signup/constants/partOption.ts new file mode 100644 index 0000000..6ca0d0b --- /dev/null +++ b/week4/homework/member/src/pages/signup/constants/partOption.ts @@ -0,0 +1 @@ +export const PART_OPTIONS = ["웹", "iOS", "안드로이드"]; diff --git a/week4/homework/member/src/shared/components/textField/PartSelect.tsx b/week4/homework/member/src/shared/components/textField/PartSelect.tsx new file mode 100644 index 0000000..46eb09e --- /dev/null +++ b/week4/homework/member/src/shared/components/textField/PartSelect.tsx @@ -0,0 +1,44 @@ +import * as styles from "./TextField.css"; + +interface PartSelectProps { + label: string; + options: string[]; + value: string; + onChange: (value: string) => void; + errorMessage?: string; +} + +const PartSelect = ({ + label, + options, + value, + onChange, + errorMessage, +}: PartSelectProps) => { + return ( +
+ + +
+ +
+ + {errorMessage &&

{errorMessage}

} +
+ ); +}; + +export default PartSelect; diff --git a/week4/homework/member/src/shared/components/textField/TextField.css.ts b/week4/homework/member/src/shared/components/textField/TextField.css.ts index 94b916a..c2b1f80 100644 --- a/week4/homework/member/src/shared/components/textField/TextField.css.ts +++ b/week4/homework/member/src/shared/components/textField/TextField.css.ts @@ -55,4 +55,5 @@ export const errorMessage = style({ fontSize: "1.3rem", color: vars.color.red, marginTop: "0.2rem", + alignSelf: "flex-start", }); From a9b096434e96015e6e01c32b66ddf81687ccde19 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 04:05:11 +0900 Subject: [PATCH 27/65] =?UTF-8?q?chore:=20=EA=B8=B0=EB=B3=B8=20=EB=9D=BC?= =?UTF-8?q?=EC=9A=B0=ED=8C=85=EC=9D=84=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/routes/router.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/week4/homework/member/src/routes/router.tsx b/week4/homework/member/src/routes/router.tsx index c7842d8..8c5cdeb 100644 --- a/week4/homework/member/src/routes/router.tsx +++ b/week4/homework/member/src/routes/router.tsx @@ -10,8 +10,7 @@ const router = createBrowserRouter([ path: "/", element: , children: [ - // { index: true, element: }, - { path: "login", element: }, + { path: "", element: }, { path: "signup", element: }, { path: "mypage", element: }, { path: "mypage/search", element: }, From fda901079ce7fe90c2f62d443f9f4bafa20cf411 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 04:07:34 +0900 Subject: [PATCH 28/65] =?UTF-8?q?feat:=20api=20base=20response=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=EC=84=A0=EC=96=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/shared/types/baseResponse.ts | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 week4/homework/member/src/shared/types/baseResponse.ts diff --git a/week4/homework/member/src/shared/types/baseResponse.ts b/week4/homework/member/src/shared/types/baseResponse.ts new file mode 100644 index 0000000..57d91ad --- /dev/null +++ b/week4/homework/member/src/shared/types/baseResponse.ts @@ -0,0 +1,7 @@ +export interface BaseResponse { + success: boolean; + status: number; + code: string; + message: string; + meta: T; +} From a7ad86a87d079ededcbb3f66a24c01c9b2a5a4f0 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 04:08:15 +0900 Subject: [PATCH 29/65] =?UTF-8?q?fix:=20import=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EB=8C=80=EC=86=8C=EB=AC=B8=EC=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/pages/signup/SignupPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/week4/homework/member/src/pages/signup/SignupPage.tsx b/week4/homework/member/src/pages/signup/SignupPage.tsx index bd8fe7c..3359701 100644 --- a/week4/homework/member/src/pages/signup/SignupPage.tsx +++ b/week4/homework/member/src/pages/signup/SignupPage.tsx @@ -1,7 +1,7 @@ import { useNavigate } from "react-router-dom"; import TextField from "@components/textField/TextField"; import Button from "@components/button/Button"; -import PartSelect from "@components/textField/partSelect"; +import PartSelect from "@components/textField/PartSelect"; import useSignupForm from "./hooks/useSignupForm"; import { PART_OPTIONS } from "./constants/partOption"; import * as styles from "./SignupPage.css"; From afe54bc917548feb45586229c1b83d19b74f9693 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 04:33:21 +0900 Subject: [PATCH 30/65] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20type=20=EC=84=A0=EC=96=B8=20=EB=B0=8F=20api=20?= =?UTF-8?q?=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/pages/signup/SignupPage.tsx | 36 +++++++++++++++++-- .../member/src/pages/signup/apis/signup.ts | 8 +++++ .../member/src/pages/signup/types/signup.ts | 8 +++++ 3 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 week4/homework/member/src/pages/signup/apis/signup.ts create mode 100644 week4/homework/member/src/pages/signup/types/signup.ts diff --git a/week4/homework/member/src/pages/signup/SignupPage.tsx b/week4/homework/member/src/pages/signup/SignupPage.tsx index 3359701..64d00ae 100644 --- a/week4/homework/member/src/pages/signup/SignupPage.tsx +++ b/week4/homework/member/src/pages/signup/SignupPage.tsx @@ -5,15 +5,36 @@ import PartSelect from "@components/textField/PartSelect"; import useSignupForm from "./hooks/useSignupForm"; import { PART_OPTIONS } from "./constants/partOption"; import * as styles from "./SignupPage.css"; +import { postSignup } from "@/pages/signup/apis/signup"; const SignupPage = () => { const navigate = useNavigate(); const handleGoToLogin = () => { - navigate("/login"); + navigate("/"); }; - const { step, nextStep, isNextDisabled, getInputProps } = useSignupForm(); + const { values, step, nextStep, isNextDisabled, getInputProps } = + useSignupForm(); + + const handleSignup = async () => { + const requestBody = { + loginId: values.id, + password: values.password, + name: values.name, + email: values.email, + age: Number(values.age), + part: values.part, + }; + + try { + await postSignup(requestBody); + alert(`${values.name}님, 회원가입을 축하합니다!`); + handleGoToLogin(); + } catch { + alert("회원가입 실패"); + } + }; return (
@@ -70,7 +91,16 @@ const SignupPage = () => { )}
-
- + diff --git a/week4/homework/member/src/pages/login/apis/login.ts b/week4/homework/member/src/pages/login/apis/login.ts new file mode 100644 index 0000000..0b233b4 --- /dev/null +++ b/week4/homework/member/src/pages/login/apis/login.ts @@ -0,0 +1,8 @@ +import type { RequestLogin } from "../types/login"; +import { axiosInstance } from "@apis/axiosInstance"; + +export const postLogin = async (body: RequestLogin): Promise => { + const { data } = await axiosInstance.post("/api/v1/auth/signin", body); + + return data; +}; diff --git a/week4/homework/member/src/pages/login/types/login.ts b/week4/homework/member/src/pages/login/types/login.ts new file mode 100644 index 0000000..f680d4a --- /dev/null +++ b/week4/homework/member/src/pages/login/types/login.ts @@ -0,0 +1,4 @@ +export type RequestLogin = { + loginId: string; + password: string; +}; From f8b91cb431e83be33b8ed20110b30b8f87968070 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 05:09:00 +0900 Subject: [PATCH 34/65] =?UTF-8?q?remove:=20=ED=86=A0=ED=81=B0=20=EB=AF=B8?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=84=B0?= =?UTF-8?q?=EC=85=89=ED=84=B0=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/shared/apis/axiosInstance.ts | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/week4/homework/member/src/shared/apis/axiosInstance.ts b/week4/homework/member/src/shared/apis/axiosInstance.ts index eb5208b..e60c5d4 100644 --- a/week4/homework/member/src/shared/apis/axiosInstance.ts +++ b/week4/homework/member/src/shared/apis/axiosInstance.ts @@ -1,21 +1,5 @@ import axios from "axios"; -import { LOCAL_STORAGE_KEY } from "../constants/key"; export const axiosInstance = axios.create({ baseURL: import.meta.env.VITE_SERVER_API_URL, }); - -axiosInstance.interceptors.request.use( - (config) => { - const token = localStorage.getItem(LOCAL_STORAGE_KEY.accessToken); - - if (token) { - config.headers.Authorization = `Bearer ${token}`; - } - - return config; - }, - (error) => { - return Promise.reject(error); - }, -); From 19505addb3f7ed932301d252eeecf2b1d8a82d6d Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 05:09:16 +0900 Subject: [PATCH 35/65] =?UTF-8?q?feat:=20userId=20=EB=A1=9C=EC=BB=AC?= =?UTF-8?q?=EC=8A=A4=ED=86=A0=EB=A6=AC=EC=A7=80=EC=97=90=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/pages/signup/SignupPage.tsx | 7 ++++++- week4/homework/member/src/shared/constants/key.ts | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/week4/homework/member/src/pages/signup/SignupPage.tsx b/week4/homework/member/src/pages/signup/SignupPage.tsx index 64d00ae..a8da936 100644 --- a/week4/homework/member/src/pages/signup/SignupPage.tsx +++ b/week4/homework/member/src/pages/signup/SignupPage.tsx @@ -6,6 +6,7 @@ import useSignupForm from "./hooks/useSignupForm"; import { PART_OPTIONS } from "./constants/partOption"; import * as styles from "./SignupPage.css"; import { postSignup } from "@/pages/signup/apis/signup"; +import { LOCAL_STORAGE_KEY } from "@/shared/constants/key"; const SignupPage = () => { const navigate = useNavigate(); @@ -28,7 +29,11 @@ const SignupPage = () => { }; try { - await postSignup(requestBody); + const response = await postSignup(requestBody); + + const userId = response.data.userId; + localStorage.setItem(LOCAL_STORAGE_KEY.userID, String(userId)); + alert(`${values.name}님, 회원가입을 축하합니다!`); handleGoToLogin(); } catch { diff --git a/week4/homework/member/src/shared/constants/key.ts b/week4/homework/member/src/shared/constants/key.ts index c6e1379..27ccf24 100644 --- a/week4/homework/member/src/shared/constants/key.ts +++ b/week4/homework/member/src/shared/constants/key.ts @@ -1,3 +1,3 @@ export const LOCAL_STORAGE_KEY = { - accessToken: "accessToken", + userID: "USER_ID", }; From cd6f372c5016decf33d99b034b47896985ff0dd0 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 05:18:23 +0900 Subject: [PATCH 36/65] =?UTF-8?q?feat:=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?api=EC=97=B0=EB=8F=99=20=EB=B0=8F=20=ED=97=A4=EB=8D=94=EC=97=90?= =?UTF-8?q?=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/pages/mypage/apis/mypage.ts | 0 .../member/src/pages/mypage/types/mypage.ts | 16 ++++++++++++++ .../member/src/shared/apis/getUserInfo.ts | 11 ++++++++++ .../src/shared/components/header/Header.tsx | 22 ++++++++++++++----- 4 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 week4/homework/member/src/pages/mypage/apis/mypage.ts create mode 100644 week4/homework/member/src/pages/mypage/types/mypage.ts create mode 100644 week4/homework/member/src/shared/apis/getUserInfo.ts diff --git a/week4/homework/member/src/pages/mypage/apis/mypage.ts b/week4/homework/member/src/pages/mypage/apis/mypage.ts new file mode 100644 index 0000000..e69de29 diff --git a/week4/homework/member/src/pages/mypage/types/mypage.ts b/week4/homework/member/src/pages/mypage/types/mypage.ts new file mode 100644 index 0000000..5bf05f2 --- /dev/null +++ b/week4/homework/member/src/pages/mypage/types/mypage.ts @@ -0,0 +1,16 @@ +import type { BaseResponse } from "@shared/types/baseResponse"; + +export type ResponseUserInfo = BaseResponse<{ + id: number; + loginId: string; + name: string; + email: string; + age: number; + part: string; +}>; + +export type PatchProfile = BaseResponse<{ + name: string; + email: string; + age: number; +}>; diff --git a/week4/homework/member/src/shared/apis/getUserInfo.ts b/week4/homework/member/src/shared/apis/getUserInfo.ts new file mode 100644 index 0000000..9e96c8c --- /dev/null +++ b/week4/homework/member/src/shared/apis/getUserInfo.ts @@ -0,0 +1,11 @@ +import { axiosInstance } from "@apis/axiosInstance"; +import type { ResponseUserInfo } from "@pages/mypage/types/mypage"; + +// 개인정보 조회 +export const getUserInfo = async ( + userId: string, +): Promise => { + const { data } = await axiosInstance.get(`/api/v1/users/${userId}`); + + return data; +}; diff --git a/week4/homework/member/src/shared/components/header/Header.tsx b/week4/homework/member/src/shared/components/header/Header.tsx index 8c76bce..4d51d1d 100644 --- a/week4/homework/member/src/shared/components/header/Header.tsx +++ b/week4/homework/member/src/shared/components/header/Header.tsx @@ -1,24 +1,37 @@ +import { LOCAL_STORAGE_KEY } from "@constants/key"; import * as styles from "./Header.css"; import { useNavigate } from "react-router-dom"; - -const nickname = "웨비들아따랑해"; +import { getUserInfo } from "@apis/getUserInfo"; +import { useEffect, useState } from "react"; +import type { ResponseUserInfo } from "@/pages/mypage/types/mypage"; const Header = () => { const navigate = useNavigate(); + const [userInfo, setUserInfo] = useState(); const handleNavigate = (select: string) => { if (select === "me") { - navigate("/mypage/info"); + navigate("/mypage"); } else if (select === "search") { navigate("/mypage/search"); } }; + useEffect(() => { + const userId = localStorage.getItem(LOCAL_STORAGE_KEY.userID); + + if (userId) { + getUserInfo(userId).then((data) => { + setUserInfo(data); + }); + } + }, []); + return (

SOPT MEMBERS

-

안녕하세요 {nickname}님

+

안녕하세요 {userInfo?.meta.name}님

@@ -32,7 +45,6 @@ const Header = () => { 회원 조회 - {/*

닉네임

*/}
); From bdfcb02cf37ad96ca47ce33a366de86bdb0be601 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 05:21:29 +0900 Subject: [PATCH 37/65] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20=ED=83=80=EC=9E=85=20=EC=84=A0?= =?UTF-8?q?=EC=96=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/pages/mypage/types/mypage.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/week4/homework/member/src/pages/mypage/types/mypage.ts b/week4/homework/member/src/pages/mypage/types/mypage.ts index 5bf05f2..928450f 100644 --- a/week4/homework/member/src/pages/mypage/types/mypage.ts +++ b/week4/homework/member/src/pages/mypage/types/mypage.ts @@ -14,3 +14,13 @@ export type PatchProfile = BaseResponse<{ email: string; age: number; }>; + +export type ResponsetUsers = BaseResponse<{ + users: users[]; +}>; + +type users = { + id: number; + name: string; + part: string; +}; From 72c1f66f52ee9e6012e2d723617ba2517f61c219 Mon Sep 17 00:00:00 2001 From: Soy Date: Fri, 8 May 2026 05:43:11 +0900 Subject: [PATCH 38/65] =?UTF-8?q?refactor:=20title=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../homework/member/src/pages/login/LoginPage.css.ts | 5 ----- week4/homework/member/src/pages/login/LoginPage.tsx | 3 ++- .../member/src/pages/signup/SignupPage.css.ts | 5 ----- week4/homework/member/src/pages/signup/SignupPage.tsx | 3 ++- .../member/src/shared/components/title/Title.css.ts | 6 ++++++ .../member/src/shared/components/title/Title.tsx | 11 +++++++++++ 6 files changed, 21 insertions(+), 12 deletions(-) create mode 100644 week4/homework/member/src/shared/components/title/Title.css.ts create mode 100644 week4/homework/member/src/shared/components/title/Title.tsx diff --git a/week4/homework/member/src/pages/login/LoginPage.css.ts b/week4/homework/member/src/pages/login/LoginPage.css.ts index 8daefb8..cfa5aeb 100644 --- a/week4/homework/member/src/pages/login/LoginPage.css.ts +++ b/week4/homework/member/src/pages/login/LoginPage.css.ts @@ -10,11 +10,6 @@ export const wrapper = style({ width: "100%", }); -export const header = style({ - fontSize: "3rem", - fontWeight: "bold", -}); - export const container = style({ display: "flex", flexDirection: "column", diff --git a/week4/homework/member/src/pages/login/LoginPage.tsx b/week4/homework/member/src/pages/login/LoginPage.tsx index 5be1169..8738f1f 100644 --- a/week4/homework/member/src/pages/login/LoginPage.tsx +++ b/week4/homework/member/src/pages/login/LoginPage.tsx @@ -4,6 +4,7 @@ import * as styles from "./LoginPage.css"; import Button from "@components/button/Button"; import { useNavigate } from "react-router-dom"; import { postLogin } from "@/pages/login/apis/login"; +import Title from "@components/title/Title"; const LoginPage = () => { const [id, setId] = useState(""); @@ -33,7 +34,7 @@ const LoginPage = () => { return (
-

SOPT MEMBERS

+ <div className={styles.container}> <TextField label="아이디" diff --git a/week4/homework/member/src/pages/signup/SignupPage.css.ts b/week4/homework/member/src/pages/signup/SignupPage.css.ts index 8daefb8..cfa5aeb 100644 --- a/week4/homework/member/src/pages/signup/SignupPage.css.ts +++ b/week4/homework/member/src/pages/signup/SignupPage.css.ts @@ -10,11 +10,6 @@ export const wrapper = style({ width: "100%", }); -export const header = style({ - fontSize: "3rem", - fontWeight: "bold", -}); - export const container = style({ display: "flex", flexDirection: "column", diff --git a/week4/homework/member/src/pages/signup/SignupPage.tsx b/week4/homework/member/src/pages/signup/SignupPage.tsx index a8da936..9c0984e 100644 --- a/week4/homework/member/src/pages/signup/SignupPage.tsx +++ b/week4/homework/member/src/pages/signup/SignupPage.tsx @@ -7,6 +7,7 @@ import { PART_OPTIONS } from "./constants/partOption"; import * as styles from "./SignupPage.css"; import { postSignup } from "@/pages/signup/apis/signup"; import { LOCAL_STORAGE_KEY } from "@/shared/constants/key"; +import Title from "@components/title/Title"; const SignupPage = () => { const navigate = useNavigate(); @@ -43,7 +44,7 @@ const SignupPage = () => { return ( <div className={styles.wrapper}> - <h1 className={styles.header}>회원가입</h1> + <Title title="회원가입" /> <div className={styles.container}> {step === 1 && ( <TextField diff --git a/week4/homework/member/src/shared/components/title/Title.css.ts b/week4/homework/member/src/shared/components/title/Title.css.ts new file mode 100644 index 0000000..4c59baf --- /dev/null +++ b/week4/homework/member/src/shared/components/title/Title.css.ts @@ -0,0 +1,6 @@ +import { style } from "@vanilla-extract/css"; + +export const header = style({ + fontSize: "3rem", + fontWeight: "bold", +}); diff --git a/week4/homework/member/src/shared/components/title/Title.tsx b/week4/homework/member/src/shared/components/title/Title.tsx new file mode 100644 index 0000000..de2595c --- /dev/null +++ b/week4/homework/member/src/shared/components/title/Title.tsx @@ -0,0 +1,11 @@ +import * as styles from "./Title.css"; + +interface TitleProps { + title: string; +} + +const Title = ({ title }: TitleProps) => { + return <h1 className={styles.header}>{title}</h1>; +}; + +export default Title; From 2b59cc0d7ca2e7b5f6746f81eb619260266a5a4b Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 05:43:30 +0900 Subject: [PATCH 39/65] =?UTF-8?q?fix:=20userId=20number=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/pages/mypage/types/mypage.ts | 2 +- week4/homework/member/src/shared/apis/getUserInfo.ts | 2 +- week4/homework/member/src/shared/components/header/Header.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/week4/homework/member/src/pages/mypage/types/mypage.ts b/week4/homework/member/src/pages/mypage/types/mypage.ts index 928450f..dd0918d 100644 --- a/week4/homework/member/src/pages/mypage/types/mypage.ts +++ b/week4/homework/member/src/pages/mypage/types/mypage.ts @@ -15,7 +15,7 @@ export type PatchProfile = BaseResponse<{ age: number; }>; -export type ResponsetUsers = BaseResponse<{ +export type ResponseUsers = BaseResponse<{ users: users[]; }>; diff --git a/week4/homework/member/src/shared/apis/getUserInfo.ts b/week4/homework/member/src/shared/apis/getUserInfo.ts index 9e96c8c..03cd0db 100644 --- a/week4/homework/member/src/shared/apis/getUserInfo.ts +++ b/week4/homework/member/src/shared/apis/getUserInfo.ts @@ -3,7 +3,7 @@ import type { ResponseUserInfo } from "@pages/mypage/types/mypage"; // 개인정보 조회 export const getUserInfo = async ( - userId: string, + userId: number, ): Promise<ResponseUserInfo> => { const { data } = await axiosInstance.get(`/api/v1/users/${userId}`); diff --git a/week4/homework/member/src/shared/components/header/Header.tsx b/week4/homework/member/src/shared/components/header/Header.tsx index 4d51d1d..caafa00 100644 --- a/week4/homework/member/src/shared/components/header/Header.tsx +++ b/week4/homework/member/src/shared/components/header/Header.tsx @@ -18,7 +18,7 @@ const Header = () => { }; useEffect(() => { - const userId = localStorage.getItem(LOCAL_STORAGE_KEY.userID); + const userId = Number(localStorage.getItem(LOCAL_STORAGE_KEY.userID)); if (userId) { getUserInfo(userId).then((data) => { From 7943f12ddb167a899fc6e7dea7f30cbd65f8a901 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 05:43:54 +0900 Subject: [PATCH 40/65] =?UTF-8?q?feat:=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20api=20=EC=8A=A4=ED=8E=99=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/pages/mypage/apis/mypage.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/week4/homework/member/src/pages/mypage/apis/mypage.ts b/week4/homework/member/src/pages/mypage/apis/mypage.ts index e69de29..21a8f24 100644 --- a/week4/homework/member/src/pages/mypage/apis/mypage.ts +++ b/week4/homework/member/src/pages/mypage/apis/mypage.ts @@ -0,0 +1,18 @@ +import type { ResponseUsers, ResponseUserInfo } from "../types/mypage"; +import { axiosInstance } from "@apis/axiosInstance"; + +// 전체 유저 정보 조회 +export const getUsers = async (): Promise<ResponseUsers> => { + const { data } = await axiosInstance.get(`/api/v1/users`); + + return data; +}; + +// 정보 수정 +export const patchUserInfo = async ( + userId: number, +): Promise<ResponseUserInfo> => { + const { data } = await axiosInstance.patch(`/api/v1/users/${userId}`); + + return data; +}; From 05a44e0390b97ef678a81401fd515137ec697357 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 05:59:10 +0900 Subject: [PATCH 41/65] =?UTF-8?q?fix:=20login=20=EC=9D=91=EB=8B=B5=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/pages/login/apis/login.ts | 4 ++-- week4/homework/member/src/pages/login/types/login.ts | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/week4/homework/member/src/pages/login/apis/login.ts b/week4/homework/member/src/pages/login/apis/login.ts index 0b233b4..d8aca44 100644 --- a/week4/homework/member/src/pages/login/apis/login.ts +++ b/week4/homework/member/src/pages/login/apis/login.ts @@ -1,7 +1,7 @@ -import type { RequestLogin } from "../types/login"; +import type { RequestLogin, ResponseLogin } from "../types/login"; import { axiosInstance } from "@apis/axiosInstance"; -export const postLogin = async (body: RequestLogin): Promise<RequestLogin> => { +export const postLogin = async (body: RequestLogin): Promise<ResponseLogin> => { const { data } = await axiosInstance.post("/api/v1/auth/signin", body); return data; diff --git a/week4/homework/member/src/pages/login/types/login.ts b/week4/homework/member/src/pages/login/types/login.ts index f680d4a..4a467b0 100644 --- a/week4/homework/member/src/pages/login/types/login.ts +++ b/week4/homework/member/src/pages/login/types/login.ts @@ -1,4 +1,10 @@ +import type { BaseResponse } from "@/shared/types/baseResponse"; + export type RequestLogin = { loginId: string; password: string; }; + +export type ResponseLogin = BaseResponse<{ + userId: number; +}>; From a858cc9ed169c8823143eb0a3ea0790d06076953 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 05:59:36 +0900 Subject: [PATCH 42/65] =?UTF-8?q?chore:=20=EB=A1=9C=EC=BB=AC=EC=8A=A4?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=EC=A7=80=20set=20=ED=83=80=EC=9D=B4=EB=B0=8D?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/pages/login/LoginPage.tsx | 6 +++++- week4/homework/member/src/pages/signup/SignupPage.tsx | 6 +----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/week4/homework/member/src/pages/login/LoginPage.tsx b/week4/homework/member/src/pages/login/LoginPage.tsx index 8738f1f..d3c8368 100644 --- a/week4/homework/member/src/pages/login/LoginPage.tsx +++ b/week4/homework/member/src/pages/login/LoginPage.tsx @@ -5,6 +5,7 @@ import Button from "@components/button/Button"; import { useNavigate } from "react-router-dom"; import { postLogin } from "@/pages/login/apis/login"; import Title from "@components/title/Title"; +import { LOCAL_STORAGE_KEY } from "@constants/key"; const LoginPage = () => { const [id, setId] = useState(""); @@ -22,7 +23,10 @@ const LoginPage = () => { }; try { - await postLogin(requestBody); + const response = await postLogin(requestBody); + const userId = response.meta.userId; + localStorage.setItem(LOCAL_STORAGE_KEY.userID, String(userId)); + navigate("/mypage"); } catch { alert("로그인 실패"); diff --git a/week4/homework/member/src/pages/signup/SignupPage.tsx b/week4/homework/member/src/pages/signup/SignupPage.tsx index 9c0984e..a336b2d 100644 --- a/week4/homework/member/src/pages/signup/SignupPage.tsx +++ b/week4/homework/member/src/pages/signup/SignupPage.tsx @@ -6,7 +6,6 @@ import useSignupForm from "./hooks/useSignupForm"; import { PART_OPTIONS } from "./constants/partOption"; import * as styles from "./SignupPage.css"; import { postSignup } from "@/pages/signup/apis/signup"; -import { LOCAL_STORAGE_KEY } from "@/shared/constants/key"; import Title from "@components/title/Title"; const SignupPage = () => { @@ -30,10 +29,7 @@ const SignupPage = () => { }; try { - const response = await postSignup(requestBody); - - const userId = response.data.userId; - localStorage.setItem(LOCAL_STORAGE_KEY.userID, String(userId)); + await postSignup(requestBody); alert(`${values.name}님, 회원가입을 축하합니다!`); handleGoToLogin(); From 908aa31077244ef6c33919cf2d3846e3dff9bb9a Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 05:59:47 +0900 Subject: [PATCH 43/65] =?UTF-8?q?feat:=20=EB=82=B4=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mypage/components/myCard/MyCard.css.ts | 28 +++++++++++++++++++ .../pages/mypage/components/myCard/MyCard.tsx | 23 +++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 week4/homework/member/src/pages/mypage/components/myCard/MyCard.css.ts create mode 100644 week4/homework/member/src/pages/mypage/components/myCard/MyCard.tsx diff --git a/week4/homework/member/src/pages/mypage/components/myCard/MyCard.css.ts b/week4/homework/member/src/pages/mypage/components/myCard/MyCard.css.ts new file mode 100644 index 0000000..c48818b --- /dev/null +++ b/week4/homework/member/src/pages/mypage/components/myCard/MyCard.css.ts @@ -0,0 +1,28 @@ +import { vars } from "@styles/theme.css"; +import { style } from "@vanilla-extract/css"; + +export const wrapper = style({ + display: "flex", + flexDirection: "column", + gap: "2rem", + padding: "3rem", + backgroundColor: vars.color.white, + borderRadius: "8px", + width: "80%", +}); + +export const container = style({ + display: "flex", + justifyContent: "space-between", +}); + +export const title = style({ + fontSize: "1.8rem", + fontWeight: "bold", + color: vars.color.navy, +}); + +export const content = style({ + fontSize: "1.5rem", + color: vars.color.gray, +}); diff --git a/week4/homework/member/src/pages/mypage/components/myCard/MyCard.tsx b/week4/homework/member/src/pages/mypage/components/myCard/MyCard.tsx new file mode 100644 index 0000000..fe5d274 --- /dev/null +++ b/week4/homework/member/src/pages/mypage/components/myCard/MyCard.tsx @@ -0,0 +1,23 @@ +import * as styles from "./MyCard.css"; + +interface MyCardProps { + id: string; + part: string; +} + +const MyCard = ({ id, part }: MyCardProps) => { + return ( + <div className={styles.wrapper}> + <div className={styles.container}> + <p className={styles.title}>아이디</p> + <p className={styles.content}>{id}</p> + </div> + <div className={styles.container}> + <p className={styles.title}>파트</p> + <p className={styles.content}>{part}</p> + </div> + </div> + ); +}; + +export default MyCard; From 92d5c7e9249f95e91b03dddba4e3a17e42c13302 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 06:08:57 +0900 Subject: [PATCH 44/65] =?UTF-8?q?fix:=20baseResponse=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=20=EC=84=B1=EA=B3=B5=EC=8B=9C=EC=97=90=EB=A7=8C=20=EB=A1=9C?= =?UTF-8?q?=EC=BB=AC=EC=8A=A4=ED=86=A0=EB=A6=AC=EC=A7=80=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/pages/login/LoginPage.tsx | 19 ++++++++++++++----- .../src/shared/components/header/Header.tsx | 2 +- .../member/src/shared/types/baseResponse.ts | 2 +- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/week4/homework/member/src/pages/login/LoginPage.tsx b/week4/homework/member/src/pages/login/LoginPage.tsx index d3c8368..d974aad 100644 --- a/week4/homework/member/src/pages/login/LoginPage.tsx +++ b/week4/homework/member/src/pages/login/LoginPage.tsx @@ -24,12 +24,21 @@ const LoginPage = () => { try { const response = await postLogin(requestBody); - const userId = response.meta.userId; - localStorage.setItem(LOCAL_STORAGE_KEY.userID, String(userId)); + console.log("로그인 응답 데이터:", response); - navigate("/mypage"); - } catch { - alert("로그인 실패"); + if (response.success && response.data) { + localStorage.setItem( + LOCAL_STORAGE_KEY.userID, + String(response.data.userId), + ); + alert("로그인 성공!"); + navigate("/mypage"); + } else { + alert(response.message || "로그인 실패"); + } + } catch (error) { + console.error("실제 발생한 에러:", error); + alert("로그인 실패/내부에러"); } }; diff --git a/week4/homework/member/src/shared/components/header/Header.tsx b/week4/homework/member/src/shared/components/header/Header.tsx index caafa00..5a87e99 100644 --- a/week4/homework/member/src/shared/components/header/Header.tsx +++ b/week4/homework/member/src/shared/components/header/Header.tsx @@ -31,7 +31,7 @@ const Header = () => { <header className={styles.HeaderContainer}> <div className={styles.LeftText}> <h1 className={styles.headerText}>SOPT MEMBERS</h1> - <p className={styles.pText}>안녕하세요 {userInfo?.meta.name}님</p> + <p className={styles.pText}>안녕하세요 {userInfo?.data.name}님</p> </div> <div className={styles.RightText}> diff --git a/week4/homework/member/src/shared/types/baseResponse.ts b/week4/homework/member/src/shared/types/baseResponse.ts index 57d91ad..bd5a4b8 100644 --- a/week4/homework/member/src/shared/types/baseResponse.ts +++ b/week4/homework/member/src/shared/types/baseResponse.ts @@ -3,5 +3,5 @@ export interface BaseResponse<T = null> { status: number; code: string; message: string; - meta: T; + data: T; } From 15c3d68a50fb0f76a4ac657e8fbf801b778e00c7 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 06:09:16 +0900 Subject: [PATCH 45/65] =?UTF-8?q?remove:=20test=20console=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/pages/login/LoginPage.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/week4/homework/member/src/pages/login/LoginPage.tsx b/week4/homework/member/src/pages/login/LoginPage.tsx index d974aad..95353ae 100644 --- a/week4/homework/member/src/pages/login/LoginPage.tsx +++ b/week4/homework/member/src/pages/login/LoginPage.tsx @@ -24,7 +24,6 @@ const LoginPage = () => { try { const response = await postLogin(requestBody); - console.log("로그인 응답 데이터:", response); if (response.success && response.data) { localStorage.setItem( From 5a0d85e2abbd615d15b19009b128401a49791512 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 06:14:35 +0900 Subject: [PATCH 46/65] =?UTF-8?q?chore:=20main=EC=98=81=EC=97=AD=20?= =?UTF-8?q?=EC=B5=9C=EC=86=8C=20=EB=86=92=EC=9D=B4=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/routes/RootLayout.css.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/week4/homework/member/src/routes/RootLayout.css.ts b/week4/homework/member/src/routes/RootLayout.css.ts index a74fd14..dd1df77 100644 --- a/week4/homework/member/src/routes/RootLayout.css.ts +++ b/week4/homework/member/src/routes/RootLayout.css.ts @@ -12,4 +12,5 @@ export const container = style({ display: "flex", justifyContent: "center", alignItems: "center", + minHeight: "100vh", }); From 72ab913713a970ee3ca3331330e90f3587a25091 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 06:14:59 +0900 Subject: [PATCH 47/65] =?UTF-8?q?feat:=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20UI=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=EB=94=94,=20=ED=8C=8C=ED=8A=B8=20=EB=B6=88?= =?UTF-8?q?=EB=9F=AC=EC=98=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/pages/mypage/MyPage.css.ts | 20 ++++++++ .../member/src/pages/mypage/MyPage.tsx | 47 +++++++++++++++++-- 2 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 week4/homework/member/src/pages/mypage/MyPage.css.ts diff --git a/week4/homework/member/src/pages/mypage/MyPage.css.ts b/week4/homework/member/src/pages/mypage/MyPage.css.ts new file mode 100644 index 0000000..183ced1 --- /dev/null +++ b/week4/homework/member/src/pages/mypage/MyPage.css.ts @@ -0,0 +1,20 @@ +import { vars } from "@styles/theme.css"; +import { style } from "@vanilla-extract/css"; + +export const wrapper = style({ + display: "flex", + flexDirection: "column", + gap: "3rem", + alignItems: "center", + justifyContent: "center", + width: "100%", +}); + +export const editArea = style({ + display: "flex", + flexDirection: "column", + gap: "2rem", + alignItems: "center", + justifyContent: "center", + width: "80%", +}); diff --git a/week4/homework/member/src/pages/mypage/MyPage.tsx b/week4/homework/member/src/pages/mypage/MyPage.tsx index b055972..4dcb978 100644 --- a/week4/homework/member/src/pages/mypage/MyPage.tsx +++ b/week4/homework/member/src/pages/mypage/MyPage.tsx @@ -1,9 +1,48 @@ +import MyCard from "@/pages/mypage/components/myCard/MyCard"; +import * as styles from "./MyPage.css"; +import Title from "@components/title/Title"; +import type { ResponseUserInfo } from "@pages/mypage/types/mypage"; +import { getUserInfo } from "@apis/getUserInfo"; +import { LOCAL_STORAGE_KEY } from "@constants/key"; +import { useState, useEffect } from "react"; +import { PART_OPTIONS } from "@/pages/signup/constants/partOption"; +import PartSelect from "@components/textField/PartSelect"; +import TextField from "@components/textField/TextField"; +import useSignupForm from "@pages/signup/hooks/useSignupForm"; +import Button from "@components/button/Button"; + const MyPage = () => { + const [userInfo, setUserInfo] = useState<ResponseUserInfo>(); + const { getInputProps } = useSignupForm(); + + useEffect(() => { + const userId = Number(localStorage.getItem(LOCAL_STORAGE_KEY.userID)); + + if (userId) { + getUserInfo(userId).then((data) => { + setUserInfo(data); + }); + } + }, []); + + const data = userInfo?.data; + return ( - <> - 마이페이지 - <h1>네..</h1> - </> + <div className={styles.wrapper}> + <Title title="내 정보" /> + <MyCard id={data?.loginId || ""} part={data?.part || ""} /> + <section className={styles.editArea}> + <TextField label="이름" {...getInputProps("name")} /> + <TextField label="이메일" {...getInputProps("email")} /> + <TextField label="나이" {...getInputProps("age")} /> + <PartSelect + label="파트" + options={PART_OPTIONS} + {...getInputProps("part")} + /> + <Button>정보 수정</Button> + </section> + </div> ); }; From 389ceea75517f0699d923610fe00da358e95d205 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 06:21:29 +0900 Subject: [PATCH 48/65] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20textField=EC=97=90=20=EB=AF=B8=EB=A6=AC=20=EC=B1=84?= =?UTF-8?q?=EC=9B=8C=EB=91=90=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/pages/mypage/MyPage.tsx | 30 ++++++++++++------- .../src/pages/signup/hooks/useSignupForm.ts | 3 +- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/week4/homework/member/src/pages/mypage/MyPage.tsx b/week4/homework/member/src/pages/mypage/MyPage.tsx index 4dcb978..50c1df5 100644 --- a/week4/homework/member/src/pages/mypage/MyPage.tsx +++ b/week4/homework/member/src/pages/mypage/MyPage.tsx @@ -5,15 +5,28 @@ import type { ResponseUserInfo } from "@pages/mypage/types/mypage"; import { getUserInfo } from "@apis/getUserInfo"; import { LOCAL_STORAGE_KEY } from "@constants/key"; import { useState, useEffect } from "react"; -import { PART_OPTIONS } from "@/pages/signup/constants/partOption"; -import PartSelect from "@components/textField/PartSelect"; import TextField from "@components/textField/TextField"; -import useSignupForm from "@pages/signup/hooks/useSignupForm"; +import useSignupForm, { + type InitialFormData, +} from "@pages/signup/hooks/useSignupForm"; import Button from "@components/button/Button"; const MyPage = () => { const [userInfo, setUserInfo] = useState<ResponseUserInfo>(); - const { getInputProps } = useSignupForm(); + const { setValues, getInputProps } = useSignupForm(); + const data = userInfo?.data; + + // 정보 채워두기 (이름, 이메일, 나이) + useEffect(() => { + if (data) { + setValues((prev: InitialFormData) => ({ + ...prev, + name: data.name || "", + email: data.email || "", + age: String(data.age || ""), + })); + } + }, [data, setValues]); useEffect(() => { const userId = Number(localStorage.getItem(LOCAL_STORAGE_KEY.userID)); @@ -25,7 +38,7 @@ const MyPage = () => { } }, []); - const data = userInfo?.data; + const handleEdit = async () => {}; return ( <div className={styles.wrapper}> @@ -35,12 +48,7 @@ const MyPage = () => { <TextField label="이름" {...getInputProps("name")} /> <TextField label="이메일" {...getInputProps("email")} /> <TextField label="나이" {...getInputProps("age")} /> - <PartSelect - label="파트" - options={PART_OPTIONS} - {...getInputProps("part")} - /> - <Button>정보 수정</Button> + <Button onClick={handleEdit}>정보 수정</Button> </section> </div> ); diff --git a/week4/homework/member/src/pages/signup/hooks/useSignupForm.ts b/week4/homework/member/src/pages/signup/hooks/useSignupForm.ts index 025553a..424a776 100644 --- a/week4/homework/member/src/pages/signup/hooks/useSignupForm.ts +++ b/week4/homework/member/src/pages/signup/hooks/useSignupForm.ts @@ -7,7 +7,7 @@ import { } from "../utils/validate"; import { useMemo, useState } from "react"; -interface InitialFormData { +export interface InitialFormData { id: string; password: string; passwordConfirm: string; @@ -102,6 +102,7 @@ const useSignupForm = () => { isNextDisabled, getInputProps, values, + setValues, }; }; From 67e5218b6cc305bbc73ce5d9154efea791c45801 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 06:35:43 +0900 Subject: [PATCH 49/65] =?UTF-8?q?feat:=20=EC=A0=95=EB=B3=B4=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20api=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/pages/mypage/MyPage.css.ts | 1 - .../member/src/pages/mypage/MyPage.tsx | 31 ++++++++++++++++--- .../member/src/pages/mypage/apis/mypage.ts | 9 ++++-- .../member/src/pages/mypage/types/mypage.ts | 4 +-- 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/week4/homework/member/src/pages/mypage/MyPage.css.ts b/week4/homework/member/src/pages/mypage/MyPage.css.ts index 183ced1..58a4a5f 100644 --- a/week4/homework/member/src/pages/mypage/MyPage.css.ts +++ b/week4/homework/member/src/pages/mypage/MyPage.css.ts @@ -1,4 +1,3 @@ -import { vars } from "@styles/theme.css"; import { style } from "@vanilla-extract/css"; export const wrapper = style({ diff --git a/week4/homework/member/src/pages/mypage/MyPage.tsx b/week4/homework/member/src/pages/mypage/MyPage.tsx index 50c1df5..2890874 100644 --- a/week4/homework/member/src/pages/mypage/MyPage.tsx +++ b/week4/homework/member/src/pages/mypage/MyPage.tsx @@ -10,10 +10,11 @@ import useSignupForm, { type InitialFormData, } from "@pages/signup/hooks/useSignupForm"; import Button from "@components/button/Button"; +import { patchUserInfo } from "@/pages/mypage/apis/mypage"; const MyPage = () => { const [userInfo, setUserInfo] = useState<ResponseUserInfo>(); - const { setValues, getInputProps } = useSignupForm(); + const { values, setValues, getInputProps } = useSignupForm(); const data = userInfo?.data; // 정보 채워두기 (이름, 이메일, 나이) @@ -24,21 +25,41 @@ const MyPage = () => { name: data.name || "", email: data.email || "", age: String(data.age || ""), + part: data.part || "", })); } }, [data, setValues]); - useEffect(() => { - const userId = Number(localStorage.getItem(LOCAL_STORAGE_KEY.userID)); + const userId = Number(localStorage.getItem(LOCAL_STORAGE_KEY.userID)); + useEffect(() => { if (userId) { getUserInfo(userId).then((data) => { setUserInfo(data); }); } - }, []); + }, [userId]); + + const handleEdit = async () => { + try { + const requestBody = { + name: values.name, + email: values.email, + age: Number(values.age), + }; - const handleEdit = async () => {}; + const response = await patchUserInfo(userId, requestBody); + + if (response.success) { + alert("정보 수정 성공"); + // window.location.reload(); + } else { + alert("정보 수정 실패"); + } + } catch (err) { + console.error("정보 수정 에러", err); + } + }; return ( <div className={styles.wrapper}> diff --git a/week4/homework/member/src/pages/mypage/apis/mypage.ts b/week4/homework/member/src/pages/mypage/apis/mypage.ts index 21a8f24..6c27311 100644 --- a/week4/homework/member/src/pages/mypage/apis/mypage.ts +++ b/week4/homework/member/src/pages/mypage/apis/mypage.ts @@ -1,4 +1,8 @@ -import type { ResponseUsers, ResponseUserInfo } from "../types/mypage"; +import type { + ResponseUsers, + ResponseUserInfo, + PatchProfile, +} from "../types/mypage"; import { axiosInstance } from "@apis/axiosInstance"; // 전체 유저 정보 조회 @@ -11,8 +15,9 @@ export const getUsers = async (): Promise<ResponseUsers> => { // 정보 수정 export const patchUserInfo = async ( userId: number, + body: PatchProfile, ): Promise<ResponseUserInfo> => { - const { data } = await axiosInstance.patch(`/api/v1/users/${userId}`); + const { data } = await axiosInstance.patch(`/api/v1/users/${userId}`, body); return data; }; diff --git a/week4/homework/member/src/pages/mypage/types/mypage.ts b/week4/homework/member/src/pages/mypage/types/mypage.ts index dd0918d..12b2939 100644 --- a/week4/homework/member/src/pages/mypage/types/mypage.ts +++ b/week4/homework/member/src/pages/mypage/types/mypage.ts @@ -9,11 +9,11 @@ export type ResponseUserInfo = BaseResponse<{ part: string; }>; -export type PatchProfile = BaseResponse<{ +export type PatchProfile = { name: string; email: string; age: number; -}>; +}; export type ResponseUsers = BaseResponse<{ users: users[]; From d8ef20dde85e721dee5b1b5fbdb4b7fbd9986f43 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 06:45:04 +0900 Subject: [PATCH 50/65] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=ED=9B=85=EC=97=90=20initialstep=20=EC=9D=B8?= =?UTF-8?q?=EC=9E=90=EB=A1=9C=20=EC=A0=84=EB=8B=AC=ED=95=B4=EC=84=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=A9=94=EC=9D=BC=20=ED=98=95=EC=8B=9D=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/pages/mypage/MyPage.tsx | 8 ++++++-- .../member/src/pages/signup/hooks/useSignupForm.ts | 5 +++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/week4/homework/member/src/pages/mypage/MyPage.tsx b/week4/homework/member/src/pages/mypage/MyPage.tsx index 2890874..3b205a0 100644 --- a/week4/homework/member/src/pages/mypage/MyPage.tsx +++ b/week4/homework/member/src/pages/mypage/MyPage.tsx @@ -14,7 +14,7 @@ import { patchUserInfo } from "@/pages/mypage/apis/mypage"; const MyPage = () => { const [userInfo, setUserInfo] = useState<ResponseUserInfo>(); - const { values, setValues, getInputProps } = useSignupForm(); + const { values, setValues, getInputProps, errors } = useSignupForm(3); const data = userInfo?.data; // 정보 채워두기 (이름, 이메일, 나이) @@ -67,7 +67,11 @@ const MyPage = () => { <MyCard id={data?.loginId || ""} part={data?.part || ""} /> <section className={styles.editArea}> <TextField label="이름" {...getInputProps("name")} /> - <TextField label="이메일" {...getInputProps("email")} /> + <TextField + label="이메일" + {...getInputProps("email")} + errorMessage={errors.email} + /> <TextField label="나이" {...getInputProps("age")} /> <Button onClick={handleEdit}>정보 수정</Button> </section> diff --git a/week4/homework/member/src/pages/signup/hooks/useSignupForm.ts b/week4/homework/member/src/pages/signup/hooks/useSignupForm.ts index 424a776..f5e2158 100644 --- a/week4/homework/member/src/pages/signup/hooks/useSignupForm.ts +++ b/week4/homework/member/src/pages/signup/hooks/useSignupForm.ts @@ -27,8 +27,8 @@ const initialValues: InitialFormData = { part: "", }; -const useSignupForm = () => { - const [step, setStep] = useState(1); +const useSignupForm = (initialStep = 1) => { + const [step, setStep] = useState(initialStep); const [values, setValues] = useState<InitialFormData>(initialValues); const [touched, setTouched] = useState<Record<string, boolean>>({}); @@ -98,6 +98,7 @@ const useSignupForm = () => { return { step, + errors, nextStep, isNextDisabled, getInputProps, From 2d08b83d516a802111b48781b7e7f0c39ba26143 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 07:21:52 +0900 Subject: [PATCH 51/65] =?UTF-8?q?chore:=20searchpage=20=ED=8F=B4=EB=8D=94?= =?UTF-8?q?=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/routes/router.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/week4/homework/member/src/routes/router.tsx b/week4/homework/member/src/routes/router.tsx index 8c5cdeb..bdf7dc0 100644 --- a/week4/homework/member/src/routes/router.tsx +++ b/week4/homework/member/src/routes/router.tsx @@ -3,7 +3,7 @@ import Layout from "./RootLayout"; import LoginPage from "@pages/login/LoginPage.tsx"; import SignupPage from "@pages/signup/SignupPage"; import MyPage from "@pages/mypage/MyPage"; -import SearchPage from "@pages/search/SearchPage"; +import SearchPage from "@/pages/mypage/components/search/SearchPage"; const router = createBrowserRouter([ { From 25eea100b632522585a69d54f7b7ef2e7a582d5e Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 07:22:15 +0900 Subject: [PATCH 52/65] =?UTF-8?q?chore:=20myCard=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=EC=97=90=20=EC=A0=84=EC=B2=B4=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EB=B3=B4=EC=97=AC=EC=A3=BC=EB=8A=94=20props?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mypage/components/myCard/MyCard.css.ts | 2 +- .../pages/mypage/components/myCard/MyCard.tsx | 22 ++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/week4/homework/member/src/pages/mypage/components/myCard/MyCard.css.ts b/week4/homework/member/src/pages/mypage/components/myCard/MyCard.css.ts index c48818b..70e7231 100644 --- a/week4/homework/member/src/pages/mypage/components/myCard/MyCard.css.ts +++ b/week4/homework/member/src/pages/mypage/components/myCard/MyCard.css.ts @@ -8,7 +8,7 @@ export const wrapper = style({ padding: "3rem", backgroundColor: vars.color.white, borderRadius: "8px", - width: "80%", + width: "100%", }); export const container = style({ diff --git a/week4/homework/member/src/pages/mypage/components/myCard/MyCard.tsx b/week4/homework/member/src/pages/mypage/components/myCard/MyCard.tsx index fe5d274..0e3eb0a 100644 --- a/week4/homework/member/src/pages/mypage/components/myCard/MyCard.tsx +++ b/week4/homework/member/src/pages/mypage/components/myCard/MyCard.tsx @@ -3,9 +3,13 @@ import * as styles from "./MyCard.css"; interface MyCardProps { id: string; part: string; + name?: string; + email?: string; + age?: string; + all?: boolean; } -const MyCard = ({ id, part }: MyCardProps) => { +const MyCard = ({ id, part, all = false, name, email, age }: MyCardProps) => { return ( <div className={styles.wrapper}> <div className={styles.container}> @@ -16,6 +20,22 @@ const MyCard = ({ id, part }: MyCardProps) => { <p className={styles.title}>파트</p> <p className={styles.content}>{part}</p> </div> + {!all && ( + <> + <div className={styles.container}> + <p className={styles.title}>이름</p> + <p className={styles.content}>{name}</p> + </div> + <div className={styles.container}> + <p className={styles.title}>이메일</p> + <p className={styles.content}>{email}</p> + </div> + <div className={styles.container}> + <p className={styles.title}>나이</p> + <p className={styles.content}>{age}</p> + </div> + </> + )} </div> ); }; From 0637fd6d2a26a87c5aa2b0f039e058a17c29e2e8 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 07:22:42 +0900 Subject: [PATCH 53/65] =?UTF-8?q?feat:=20=EA=B2=80=EC=83=89=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20UI=20=EB=B0=8F=20=20=EA=B2=80=EC=83=89=20a?= =?UTF-8?q?pi=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/pages/mypage/MyPage.css.ts | 4 ++ .../member/src/pages/mypage/MyPage.tsx | 5 +- .../components/search/SearchPage.css.ts | 42 ++++++++++++ .../mypage/components/search/SearchPage.tsx | 66 +++++++++++++++++++ .../member/src/pages/search/SearchPage.tsx | 10 --- 5 files changed, 116 insertions(+), 11 deletions(-) create mode 100644 week4/homework/member/src/pages/mypage/components/search/SearchPage.css.ts create mode 100644 week4/homework/member/src/pages/mypage/components/search/SearchPage.tsx delete mode 100644 week4/homework/member/src/pages/search/SearchPage.tsx diff --git a/week4/homework/member/src/pages/mypage/MyPage.css.ts b/week4/homework/member/src/pages/mypage/MyPage.css.ts index 58a4a5f..3b9c446 100644 --- a/week4/homework/member/src/pages/mypage/MyPage.css.ts +++ b/week4/homework/member/src/pages/mypage/MyPage.css.ts @@ -17,3 +17,7 @@ export const editArea = style({ justifyContent: "center", width: "80%", }); + +export const cardContainer = style({ + width: "80%", +}); diff --git a/week4/homework/member/src/pages/mypage/MyPage.tsx b/week4/homework/member/src/pages/mypage/MyPage.tsx index 3b205a0..4662a52 100644 --- a/week4/homework/member/src/pages/mypage/MyPage.tsx +++ b/week4/homework/member/src/pages/mypage/MyPage.tsx @@ -64,7 +64,10 @@ const MyPage = () => { return ( <div className={styles.wrapper}> <Title title="내 정보" /> - <MyCard id={data?.loginId || ""} part={data?.part || ""} /> + <div className={styles.cardContainer}> + <MyCard id={data?.loginId || ""} part={data?.part || ""} /> + </div> + <section className={styles.editArea}> <TextField label="이름" {...getInputProps("name")} /> <TextField diff --git a/week4/homework/member/src/pages/mypage/components/search/SearchPage.css.ts b/week4/homework/member/src/pages/mypage/components/search/SearchPage.css.ts new file mode 100644 index 0000000..b983796 --- /dev/null +++ b/week4/homework/member/src/pages/mypage/components/search/SearchPage.css.ts @@ -0,0 +1,42 @@ +import { vars } from "@/shared/styles/theme.css"; +import { style } from "@vanilla-extract/css"; + +export const wrapper = style({ + display: "flex", + flexDirection: "column", + gap: "3rem", + alignItems: "center", + justifyContent: "center", + width: "100%", +}); + +export const searchSection = style({ + display: "flex", + flexDirection: "column", + gap: "3rem", + alignItems: "center", + justifyContent: "center", + width: "70%", +}); + +export const result = style({ + display: "flex", + flexDirection: "column", + gap: "2rem", + alignSelf: "flex-start", + justifyContent: "center", +}); + +export const headingText = style({ + fontSize: "1.5rem", + fontWeight: "bold", +}); + +export const resultContent = style({ + display: "flex", + backgroundColor: vars.color.white, + width: "38rem", + height: "20rem", + borderRadius: "8px", + padding: "1rem", +}); diff --git a/week4/homework/member/src/pages/mypage/components/search/SearchPage.tsx b/week4/homework/member/src/pages/mypage/components/search/SearchPage.tsx new file mode 100644 index 0000000..0fad1b5 --- /dev/null +++ b/week4/homework/member/src/pages/mypage/components/search/SearchPage.tsx @@ -0,0 +1,66 @@ +import Title from "@components/title/Title"; +import * as styles from "./SearchPage.css"; +import TextField from "@components/textField/TextField"; +import Button from "@components/button/Button"; + +import type { ResponseUserInfo } from "@pages/mypage/types/mypage"; +import { useState } from "react"; + +import MyCard from "@/pages/mypage/components/myCard/MyCard"; +import { getUserInfo } from "@apis/getUserInfo"; + +const SearchPage = () => { + const [searchId, setSearchId] = useState(""); + const [userInfo, setUserInfo] = useState<ResponseUserInfo | null>(null); + + const handleSearch = async () => { + if (!searchId) { + alert("ID를 입력해주세요."); + return; + } + + try { + const data = await getUserInfo(Number(searchId)); + setUserInfo(data); + } catch (err) { + console.error("검색 실패", err); + setUserInfo(null); + alert("존재하지 않는 회원입니다."); + } + }; + + return ( + <div className={styles.wrapper}> + <Title title="내 정보" /> + <section className={styles.searchSection}> + <TextField + label="회원ID" + type="number" + value={searchId} + onChange={setSearchId} + placeholder="ID를 입력하세요." + /> + <Button onClick={handleSearch}>검색</Button> + <div className={styles.result}> + <p className={styles.headingText}>검색 결과</p> + <div className={styles.resultContent}> + {userInfo?.data ? ( + <MyCard + all + id={String(userInfo.data.id ?? "")} + name={userInfo.data.name || ""} + email={userInfo.data.email || ""} + age={String(userInfo.data.age ?? "")} + part={userInfo.data.part || ""} + /> + ) : ( + <p>회원을 검색해보세요.</p> + )} + </div> + </div> + </section> + </div> + ); +}; + +export default SearchPage; diff --git a/week4/homework/member/src/pages/search/SearchPage.tsx b/week4/homework/member/src/pages/search/SearchPage.tsx deleted file mode 100644 index 6f794fc..0000000 --- a/week4/homework/member/src/pages/search/SearchPage.tsx +++ /dev/null @@ -1,10 +0,0 @@ -const SearchPage = () => { - return ( - <> - 검색페이지 - <h1>네..</h1> - </> - ); -}; - -export default SearchPage; From a43db5f8b0f96d6094e47f31a831a2a679373ecf Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 07:23:37 +0900 Subject: [PATCH 54/65] =?UTF-8?q?chore:=20=EA=B2=80=EC=83=89=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EB=94=94=20=EB=B9=84=EC=96=B4=EC=9E=88=EC=9C=BC?= =?UTF-8?q?=EB=A9=B4=20=EB=B2=84=ED=8A=BC=20=EB=B9=84=ED=99=9C=EC=84=B1?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/pages/mypage/components/search/SearchPage.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/week4/homework/member/src/pages/mypage/components/search/SearchPage.tsx b/week4/homework/member/src/pages/mypage/components/search/SearchPage.tsx index 0fad1b5..18bd4fd 100644 --- a/week4/homework/member/src/pages/mypage/components/search/SearchPage.tsx +++ b/week4/homework/member/src/pages/mypage/components/search/SearchPage.tsx @@ -40,7 +40,9 @@ const SearchPage = () => { onChange={setSearchId} placeholder="ID를 입력하세요." /> - <Button onClick={handleSearch}>검색</Button> + <Button onClick={handleSearch} disabled={!searchId}> + 검색 + </Button> <div className={styles.result}> <p className={styles.headingText}>검색 결과</p> <div className={styles.resultContent}> From f1aeceae58c44e2b64627a80d5fea291cc4b47f5 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 16:57:47 +0900 Subject: [PATCH 55/65] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mypage/{components => pages}/search/SearchPage.css.ts | 3 ++- .../pages/mypage/{components => pages}/search/SearchPage.tsx | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) rename week4/homework/member/src/pages/mypage/{components => pages}/search/SearchPage.css.ts (95%) rename week4/homework/member/src/pages/mypage/{components => pages}/search/SearchPage.tsx (93%) diff --git a/week4/homework/member/src/pages/mypage/components/search/SearchPage.css.ts b/week4/homework/member/src/pages/mypage/pages/search/SearchPage.css.ts similarity index 95% rename from week4/homework/member/src/pages/mypage/components/search/SearchPage.css.ts rename to week4/homework/member/src/pages/mypage/pages/search/SearchPage.css.ts index b983796..66e1638 100644 --- a/week4/homework/member/src/pages/mypage/components/search/SearchPage.css.ts +++ b/week4/homework/member/src/pages/mypage/pages/search/SearchPage.css.ts @@ -8,6 +8,7 @@ export const wrapper = style({ alignItems: "center", justifyContent: "center", width: "100%", + marginTop: "4rem;", }); export const searchSection = style({ @@ -35,7 +36,7 @@ export const headingText = style({ export const resultContent = style({ display: "flex", backgroundColor: vars.color.white, - width: "38rem", + width: "60rem", height: "20rem", borderRadius: "8px", padding: "1rem", diff --git a/week4/homework/member/src/pages/mypage/components/search/SearchPage.tsx b/week4/homework/member/src/pages/mypage/pages/search/SearchPage.tsx similarity index 93% rename from week4/homework/member/src/pages/mypage/components/search/SearchPage.tsx rename to week4/homework/member/src/pages/mypage/pages/search/SearchPage.tsx index 18bd4fd..e9120f6 100644 --- a/week4/homework/member/src/pages/mypage/components/search/SearchPage.tsx +++ b/week4/homework/member/src/pages/mypage/pages/search/SearchPage.tsx @@ -8,6 +8,7 @@ import { useState } from "react"; import MyCard from "@/pages/mypage/components/myCard/MyCard"; import { getUserInfo } from "@apis/getUserInfo"; +import MemberList from "@/pages/mypage/pages/search/components/MemberList"; const SearchPage = () => { const [searchId, setSearchId] = useState(""); @@ -31,7 +32,7 @@ const SearchPage = () => { return ( <div className={styles.wrapper}> - <Title title="내 정보" /> + <Title title="회원 조회" /> <section className={styles.searchSection}> <TextField label="회원ID" @@ -61,6 +62,7 @@ const SearchPage = () => { </div> </div> </section> + <MemberList /> </div> ); }; From 7c546e33fd33c63b8ca7694d8dd58df9cf556e43 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 16:58:09 +0900 Subject: [PATCH 56/65] =?UTF-8?q?feat:=20=EC=A0=84=EC=B2=B4=20=EB=A9=A4?= =?UTF-8?q?=EB=B2=84=20=EC=A1=B0=ED=9A=8C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/search/components/MemberList.css.ts | 21 ++++++++++ .../pages/search/components/MemberList.tsx | 42 +++++++++++++++++++ .../pages/search/components/UserCard.css.ts | 31 ++++++++++++++ .../pages/search/components/UserCards.tsx | 17 ++++++++ .../member/src/pages/mypage/types/mypage.ts | 4 +- 5 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 week4/homework/member/src/pages/mypage/pages/search/components/MemberList.css.ts create mode 100644 week4/homework/member/src/pages/mypage/pages/search/components/MemberList.tsx create mode 100644 week4/homework/member/src/pages/mypage/pages/search/components/UserCard.css.ts create mode 100644 week4/homework/member/src/pages/mypage/pages/search/components/UserCards.tsx diff --git a/week4/homework/member/src/pages/mypage/pages/search/components/MemberList.css.ts b/week4/homework/member/src/pages/mypage/pages/search/components/MemberList.css.ts new file mode 100644 index 0000000..29fe3ce --- /dev/null +++ b/week4/homework/member/src/pages/mypage/pages/search/components/MemberList.css.ts @@ -0,0 +1,21 @@ +import { style } from "@vanilla-extract/css"; + +export const wrapper = style({ + display: "flex", + flexDirection: "column", + gap: "2rem", + width: "100%", + alignSelf: "flex-start", + padding: "3rem", +}); + +export const title = style({ + fontSize: "1.9rem", + fontWeight: "bold", +}); + +export const cardContainer = style({ + display: "flex", + gap: "1rem", + flexWrap: "wrap", +}); diff --git a/week4/homework/member/src/pages/mypage/pages/search/components/MemberList.tsx b/week4/homework/member/src/pages/mypage/pages/search/components/MemberList.tsx new file mode 100644 index 0000000..161b477 --- /dev/null +++ b/week4/homework/member/src/pages/mypage/pages/search/components/MemberList.tsx @@ -0,0 +1,42 @@ +import { useEffect, useState } from "react"; +import * as styles from "./MemberList.css"; +import UserCard from "@/pages/mypage/pages/search/components/UserCards"; +import { getUsers } from "@/pages/mypage/apis/mypage"; +import type { Users } from "@/pages/mypage/types/mypage"; + +const MemberList = () => { + const [memberList, setMemberList] = useState<Users[]>([]); + + useEffect(() => { + const fetchMembers = async () => { + try { + const response = await getUsers(); + + if (response.success) { + setMemberList(response.data.users); + } + } catch (error) { + console.error("멤버 목록 불러오기 실패:", error); + } + }; + + fetchMembers(); + }, []); + + return ( + <section className={styles.wrapper}> + <h1 className={styles.title}>전체 멤버 리스트</h1> + <div className={styles.cardContainer}> + {memberList.length > 0 ? ( + memberList.map((data) => ( + <UserCard key={data.id} name={data.name} part={data.part} /> + )) + ) : ( + <p>멤버가 없습니다.</p> + )} + </div> + </section> + ); +}; + +export default MemberList; diff --git a/week4/homework/member/src/pages/mypage/pages/search/components/UserCard.css.ts b/week4/homework/member/src/pages/mypage/pages/search/components/UserCard.css.ts new file mode 100644 index 0000000..ca9e7e3 --- /dev/null +++ b/week4/homework/member/src/pages/mypage/pages/search/components/UserCard.css.ts @@ -0,0 +1,31 @@ +import { vars } from "@styles/theme.css"; +import { style, styleVariants } from "@vanilla-extract/css"; + +export const wrapper = style({ + display: "flex", + flexDirection: "column", + gap: "1rem", + padding: "2rem", + backgroundColor: vars.color.white, + borderRadius: "8px", + width: "18rem", + justifyContent: "center", + alignItems: "center", + whiteSpace: "nowrap", +}); + +export const content = styleVariants({ + default: { + fontSize: "1.8rem", + fontWeight: "bold", + color: vars.color.navy, + }, + box: { + fontSize: "1.1rem", + fontWeight: "bold", + color: vars.color.navy, + backgroundColor: vars.color.lightBlue, + padding: "0.8rem", + borderRadius: "5px", + }, +}); diff --git a/week4/homework/member/src/pages/mypage/pages/search/components/UserCards.tsx b/week4/homework/member/src/pages/mypage/pages/search/components/UserCards.tsx new file mode 100644 index 0000000..85a92fc --- /dev/null +++ b/week4/homework/member/src/pages/mypage/pages/search/components/UserCards.tsx @@ -0,0 +1,17 @@ +import * as styles from "./UserCard.css"; + +interface UserCardProps { + name: string; + part: string; +} + +const UserCard = ({ name, part }: UserCardProps) => { + return ( + <div className={styles.wrapper}> + <p className={styles.content["default"]}>{name}</p> + <p className={styles.content["box"]}>{part}</p> + </div> + ); +}; + +export default UserCard; diff --git a/week4/homework/member/src/pages/mypage/types/mypage.ts b/week4/homework/member/src/pages/mypage/types/mypage.ts index 12b2939..c8cc3da 100644 --- a/week4/homework/member/src/pages/mypage/types/mypage.ts +++ b/week4/homework/member/src/pages/mypage/types/mypage.ts @@ -16,10 +16,10 @@ export type PatchProfile = { }; export type ResponseUsers = BaseResponse<{ - users: users[]; + users: Users[]; }>; -type users = { +export type Users = { id: number; name: string; part: string; From 9467a8852207942e4e2a1a7a79642fb641986f45 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 16:58:18 +0900 Subject: [PATCH 57/65] =?UTF-8?q?fix:=20=EB=A0=88=EC=9D=B4=EC=95=84?= =?UTF-8?q?=EC=9B=83=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/routes/RootLayout.css.ts | 1 - week4/homework/member/src/routes/router.tsx | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/week4/homework/member/src/routes/RootLayout.css.ts b/week4/homework/member/src/routes/RootLayout.css.ts index dd1df77..a74fd14 100644 --- a/week4/homework/member/src/routes/RootLayout.css.ts +++ b/week4/homework/member/src/routes/RootLayout.css.ts @@ -12,5 +12,4 @@ export const container = style({ display: "flex", justifyContent: "center", alignItems: "center", - minHeight: "100vh", }); diff --git a/week4/homework/member/src/routes/router.tsx b/week4/homework/member/src/routes/router.tsx index bdf7dc0..d80243f 100644 --- a/week4/homework/member/src/routes/router.tsx +++ b/week4/homework/member/src/routes/router.tsx @@ -3,7 +3,7 @@ import Layout from "./RootLayout"; import LoginPage from "@pages/login/LoginPage.tsx"; import SignupPage from "@pages/signup/SignupPage"; import MyPage from "@pages/mypage/MyPage"; -import SearchPage from "@/pages/mypage/components/search/SearchPage"; +import SearchPage from "@/pages/mypage/pages/search/SearchPage"; const router = createBrowserRouter([ { From 044fc7474aa714220109b4af166d02d487cc2fd5 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 17:05:20 +0900 Subject: [PATCH 58/65] =?UTF-8?q?style:=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=20?= =?UTF-8?q?=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week4/homework/member/src/pages/mypage/MyPage.css.ts | 1 + .../member/src/pages/mypage/pages/search/SearchPage.css.ts | 5 +++-- .../pages/mypage/pages/search/components/MemberList.css.ts | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/week4/homework/member/src/pages/mypage/MyPage.css.ts b/week4/homework/member/src/pages/mypage/MyPage.css.ts index 3b9c446..86faf18 100644 --- a/week4/homework/member/src/pages/mypage/MyPage.css.ts +++ b/week4/homework/member/src/pages/mypage/MyPage.css.ts @@ -7,6 +7,7 @@ export const wrapper = style({ alignItems: "center", justifyContent: "center", width: "100%", + marginTop: "4rem", }); export const editArea = style({ diff --git a/week4/homework/member/src/pages/mypage/pages/search/SearchPage.css.ts b/week4/homework/member/src/pages/mypage/pages/search/SearchPage.css.ts index 66e1638..29643e0 100644 --- a/week4/homework/member/src/pages/mypage/pages/search/SearchPage.css.ts +++ b/week4/homework/member/src/pages/mypage/pages/search/SearchPage.css.ts @@ -8,7 +8,7 @@ export const wrapper = style({ alignItems: "center", justifyContent: "center", width: "100%", - marginTop: "4rem;", + marginTop: "4rem", }); export const searchSection = style({ @@ -26,6 +26,7 @@ export const result = style({ gap: "2rem", alignSelf: "flex-start", justifyContent: "center", + width: "100%", }); export const headingText = style({ @@ -36,7 +37,7 @@ export const headingText = style({ export const resultContent = style({ display: "flex", backgroundColor: vars.color.white, - width: "60rem", + width: "100%", height: "20rem", borderRadius: "8px", padding: "1rem", diff --git a/week4/homework/member/src/pages/mypage/pages/search/components/MemberList.css.ts b/week4/homework/member/src/pages/mypage/pages/search/components/MemberList.css.ts index 29fe3ce..5edf2a4 100644 --- a/week4/homework/member/src/pages/mypage/pages/search/components/MemberList.css.ts +++ b/week4/homework/member/src/pages/mypage/pages/search/components/MemberList.css.ts @@ -5,13 +5,14 @@ export const wrapper = style({ flexDirection: "column", gap: "2rem", width: "100%", - alignSelf: "flex-start", padding: "3rem", + alignItems: "center", }); export const title = style({ fontSize: "1.9rem", fontWeight: "bold", + alignSelf: "flex-start", }); export const cardContainer = style({ From 0dff125d48995fcf3d7b81e639afe9cd870f8b92 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 17:29:21 +0900 Subject: [PATCH 59/65] =?UTF-8?q?feat:=20=EB=A9=A4=EB=B2=84=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mypage/pages/MemberDetailPage.css.ts | 29 ++++++++++ .../pages/mypage/pages/MemberDetailPage.tsx | 54 +++++++++++++++++++ .../pages/search/components/MemberList.tsx | 13 ++++- .../pages/search/components/UserCards.tsx | 5 +- week4/homework/member/src/routes/router.tsx | 2 + 5 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 week4/homework/member/src/pages/mypage/pages/MemberDetailPage.css.ts create mode 100644 week4/homework/member/src/pages/mypage/pages/MemberDetailPage.tsx diff --git a/week4/homework/member/src/pages/mypage/pages/MemberDetailPage.css.ts b/week4/homework/member/src/pages/mypage/pages/MemberDetailPage.css.ts new file mode 100644 index 0000000..4f44045 --- /dev/null +++ b/week4/homework/member/src/pages/mypage/pages/MemberDetailPage.css.ts @@ -0,0 +1,29 @@ +import { vars } from "@/shared/styles/theme.css"; +import { style } from "@vanilla-extract/css"; + +export const wrapper = style({ + display: "flex", + flexDirection: "column", + gap: "5rem", + alignItems: "center", + justifyContent: "center", + width: "100%", + marginTop: "4rem", +}); + +export const container = style({ + display: "flex", + flexDirection: "column", + alignItems: "center", + justifyContent: "center", + width: "100%", + maxWidth: "40rem", + gap: "1.5rem", +}); + +export const btn = style({ + fontSize: "1.5rem", + fontWeight: "bold", + color: vars.color.blue, + alignSelf: "flex-start", +}); diff --git a/week4/homework/member/src/pages/mypage/pages/MemberDetailPage.tsx b/week4/homework/member/src/pages/mypage/pages/MemberDetailPage.tsx new file mode 100644 index 0000000..1c93672 --- /dev/null +++ b/week4/homework/member/src/pages/mypage/pages/MemberDetailPage.tsx @@ -0,0 +1,54 @@ +import MyCard from "@/pages/mypage/components/myCard/MyCard"; +import type { ResponseUserInfo } from "@/pages/mypage/types/mypage"; +import { getUserInfo } from "@apis/getUserInfo"; +import Title from "@components/title/Title"; +import { LOCAL_STORAGE_KEY } from "@constants/key"; +import { useEffect, useState } from "react"; +import { useNavigate, useParams } from "react-router-dom"; +import * as styles from "./MemberDetailPage.css"; + +const MemberDetailPage = () => { + const navigate = useNavigate(); + const { id } = useParams(); + + const [userInfo, setUserInfo] = useState<ResponseUserInfo>(); + + const handleBackToList = () => { + navigate("/mypage/search"); + }; + + useEffect(() => { + if (id) { + getUserInfo(Number(id)).then((data) => { + setUserInfo(data); + }); + } + }, [id]); + + if (!userInfo) return <p>로딩 중...</p>; + + return ( + <div className={styles.wrapper}> + <Title title="상세 정보" /> + + <div className={styles.container}> + <button type="button" onClick={handleBackToList} className={styles.btn}> + ← 목록으로 돌아가기 + </button> + + {userInfo?.data && ( + <MyCard + all + id={String(userInfo.data.loginId ?? "")} + name={userInfo.data.name || ""} + email={userInfo.data.email || ""} + age={String(userInfo.data.age ?? "")} + part={userInfo.data.part || ""} + /> + )} + </div> + </div> + ); +}; + +export default MemberDetailPage; diff --git a/week4/homework/member/src/pages/mypage/pages/search/components/MemberList.tsx b/week4/homework/member/src/pages/mypage/pages/search/components/MemberList.tsx index 161b477..1de23cf 100644 --- a/week4/homework/member/src/pages/mypage/pages/search/components/MemberList.tsx +++ b/week4/homework/member/src/pages/mypage/pages/search/components/MemberList.tsx @@ -3,9 +3,11 @@ import * as styles from "./MemberList.css"; import UserCard from "@/pages/mypage/pages/search/components/UserCards"; import { getUsers } from "@/pages/mypage/apis/mypage"; import type { Users } from "@/pages/mypage/types/mypage"; +import { useNavigate } from "react-router-dom"; const MemberList = () => { const [memberList, setMemberList] = useState<Users[]>([]); + const navigate = useNavigate(); useEffect(() => { const fetchMembers = async () => { @@ -23,13 +25,22 @@ const MemberList = () => { fetchMembers(); }, []); + const handleGotoDetail = (id: number) => { + navigate(`/mypage/search/${id}`); + }; + return ( <section className={styles.wrapper}> <h1 className={styles.title}>전체 멤버 리스트</h1> <div className={styles.cardContainer}> {memberList.length > 0 ? ( memberList.map((data) => ( - <UserCard key={data.id} name={data.name} part={data.part} /> + <UserCard + key={data.id} + name={data.name} + part={data.part} + onClick={() => handleGotoDetail(data.id)} + /> )) ) : ( <p>멤버가 없습니다.</p> diff --git a/week4/homework/member/src/pages/mypage/pages/search/components/UserCards.tsx b/week4/homework/member/src/pages/mypage/pages/search/components/UserCards.tsx index 85a92fc..5ea3b8f 100644 --- a/week4/homework/member/src/pages/mypage/pages/search/components/UserCards.tsx +++ b/week4/homework/member/src/pages/mypage/pages/search/components/UserCards.tsx @@ -3,11 +3,12 @@ import * as styles from "./UserCard.css"; interface UserCardProps { name: string; part: string; + onClick: () => void; } -const UserCard = ({ name, part }: UserCardProps) => { +const UserCard = ({ name, part, onClick }: UserCardProps) => { return ( - <div className={styles.wrapper}> + <div className={styles.wrapper} onClick={onClick}> <p className={styles.content["default"]}>{name}</p> <p className={styles.content["box"]}>{part}</p> </div> diff --git a/week4/homework/member/src/routes/router.tsx b/week4/homework/member/src/routes/router.tsx index d80243f..2127a60 100644 --- a/week4/homework/member/src/routes/router.tsx +++ b/week4/homework/member/src/routes/router.tsx @@ -4,6 +4,7 @@ import LoginPage from "@pages/login/LoginPage.tsx"; import SignupPage from "@pages/signup/SignupPage"; import MyPage from "@pages/mypage/MyPage"; import SearchPage from "@/pages/mypage/pages/search/SearchPage"; +import MemberDetailPage from "@/pages/mypage/pages/MemberDetailPage"; const router = createBrowserRouter([ { @@ -14,6 +15,7 @@ const router = createBrowserRouter([ { path: "signup", element: <SignupPage /> }, { path: "mypage", element: <MyPage /> }, { path: "mypage/search", element: <SearchPage /> }, + { path: `mypage/search/:id`, element: <MemberDetailPage /> }, ], }, ]); From 323e5656058aca0d0c1773e03a2825aa43b6e889 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 17:33:21 +0900 Subject: [PATCH 60/65] =?UTF-8?q?remove:=20=EB=B6=88=ED=95=84=EC=9A=94=20i?= =?UTF-8?q?mport=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../homework/member/src/pages/mypage/pages/MemberDetailPage.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/week4/homework/member/src/pages/mypage/pages/MemberDetailPage.tsx b/week4/homework/member/src/pages/mypage/pages/MemberDetailPage.tsx index 1c93672..cf03b4d 100644 --- a/week4/homework/member/src/pages/mypage/pages/MemberDetailPage.tsx +++ b/week4/homework/member/src/pages/mypage/pages/MemberDetailPage.tsx @@ -2,7 +2,6 @@ import MyCard from "@/pages/mypage/components/myCard/MyCard"; import type { ResponseUserInfo } from "@/pages/mypage/types/mypage"; import { getUserInfo } from "@apis/getUserInfo"; import Title from "@components/title/Title"; -import { LOCAL_STORAGE_KEY } from "@constants/key"; import { useEffect, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import * as styles from "./MemberDetailPage.css"; From e220bd4d578ded3320a8db8d30ca979749dd838d Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 17:33:31 +0900 Subject: [PATCH 61/65] =?UTF-8?q?feat:=20=EB=A1=9C=EA=B7=B8=EC=95=84?= =?UTF-8?q?=EC=9B=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/shared/components/header/Header.tsx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/week4/homework/member/src/shared/components/header/Header.tsx b/week4/homework/member/src/shared/components/header/Header.tsx index 5a87e99..54bdd56 100644 --- a/week4/homework/member/src/shared/components/header/Header.tsx +++ b/week4/homework/member/src/shared/components/header/Header.tsx @@ -17,6 +17,12 @@ const Header = () => { } }; + const handleLogout = () => { + localStorage.removeItem(LOCAL_STORAGE_KEY.userID); + alert("로그아웃 완료"); + navigate("/"); + }; + useEffect(() => { const userId = Number(localStorage.getItem(LOCAL_STORAGE_KEY.userID)); @@ -39,12 +45,15 @@ const Header = () => { 내 정보 </button> <button + type="button" className={styles.btnText} onClick={() => handleNavigate("search")} > 회원 조회 </button> - <button className={styles.btnText}>로그아웃</button> + <button type="button" className={styles.btnText} onClick={handleLogout}> + 로그아웃 + </button> </div> </header> ); From a3a5e667642f033a24829cdd3f5c0ec46ef08e7f Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 20:08:11 +0900 Subject: [PATCH 62/65] =?UTF-8?q?fix:=20=EC=B9=B4=EB=93=9C=20=EB=A0=8C?= =?UTF-8?q?=EB=8D=94=EB=A7=81=20=EC=A1=B0=EA=B1=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/pages/mypage/components/myCard/MyCard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/week4/homework/member/src/pages/mypage/components/myCard/MyCard.tsx b/week4/homework/member/src/pages/mypage/components/myCard/MyCard.tsx index 0e3eb0a..97b9306 100644 --- a/week4/homework/member/src/pages/mypage/components/myCard/MyCard.tsx +++ b/week4/homework/member/src/pages/mypage/components/myCard/MyCard.tsx @@ -20,7 +20,7 @@ const MyCard = ({ id, part, all = false, name, email, age }: MyCardProps) => { <p className={styles.title}>파트</p> <p className={styles.content}>{part}</p> </div> - {!all && ( + {!!all && ( <> <div className={styles.container}> <p className={styles.title}>이름</p> From da4171957c6293526c9dc47ad83c8e3fa99e0db2 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 20:14:23 +0900 Subject: [PATCH 63/65] =?UTF-8?q?style:=20button,=20card=20hover=20?= =?UTF-8?q?=ED=9A=A8=EA=B3=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/pages/mypage/pages/MemberDetailPage.css.ts | 6 ++++++ .../pages/mypage/pages/search/components/UserCard.css.ts | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/week4/homework/member/src/pages/mypage/pages/MemberDetailPage.css.ts b/week4/homework/member/src/pages/mypage/pages/MemberDetailPage.css.ts index 4f44045..52cb0ec 100644 --- a/week4/homework/member/src/pages/mypage/pages/MemberDetailPage.css.ts +++ b/week4/homework/member/src/pages/mypage/pages/MemberDetailPage.css.ts @@ -26,4 +26,10 @@ export const btn = style({ fontWeight: "bold", color: vars.color.blue, alignSelf: "flex-start", + + selectors: { + "&:hover": { + color: vars.color.navy, + }, + }, }); diff --git a/week4/homework/member/src/pages/mypage/pages/search/components/UserCard.css.ts b/week4/homework/member/src/pages/mypage/pages/search/components/UserCard.css.ts index ca9e7e3..44a0e2e 100644 --- a/week4/homework/member/src/pages/mypage/pages/search/components/UserCard.css.ts +++ b/week4/homework/member/src/pages/mypage/pages/search/components/UserCard.css.ts @@ -12,6 +12,13 @@ export const wrapper = style({ justifyContent: "center", alignItems: "center", whiteSpace: "nowrap", + transition: "transform 0.3s ease-in-out", + + selectors: { + "&:hover": { + transform: "scale(0.96)", + }, + }, }); export const content = styleVariants({ From d9dabf03fe333daec029e1110d207a6ae085bbd1 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 20:15:00 +0900 Subject: [PATCH 64/65] =?UTF-8?q?style:=20height=20=EC=86=8D=EC=84=B1=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/pages/mypage/pages/search/SearchPage.css.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/week4/homework/member/src/pages/mypage/pages/search/SearchPage.css.ts b/week4/homework/member/src/pages/mypage/pages/search/SearchPage.css.ts index 29643e0..a3c9568 100644 --- a/week4/homework/member/src/pages/mypage/pages/search/SearchPage.css.ts +++ b/week4/homework/member/src/pages/mypage/pages/search/SearchPage.css.ts @@ -38,7 +38,6 @@ export const resultContent = style({ display: "flex", backgroundColor: vars.color.white, width: "100%", - height: "20rem", borderRadius: "8px", padding: "1rem", }); From 254305266cd2788ed50dca6f0bdf737d079548d9 Mon Sep 17 00:00:00 2001 From: Soy <da5868@naver.com> Date: Fri, 8 May 2026 20:15:38 +0900 Subject: [PATCH 65/65] =?UTF-8?q?style:=20minHeight=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/src/pages/mypage/pages/search/SearchPage.css.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/week4/homework/member/src/pages/mypage/pages/search/SearchPage.css.ts b/week4/homework/member/src/pages/mypage/pages/search/SearchPage.css.ts index a3c9568..78ad451 100644 --- a/week4/homework/member/src/pages/mypage/pages/search/SearchPage.css.ts +++ b/week4/homework/member/src/pages/mypage/pages/search/SearchPage.css.ts @@ -40,4 +40,5 @@ export const resultContent = style({ width: "100%", borderRadius: "8px", padding: "1rem", + minHeight: "20rem", });